2013-01-23 40 views
-1

我重寫屬於超類的方法。方法不帶參數。因此,我無法將對象傳遞給使用模型的視圖。任何人有任何建議?如何在不將Model作爲參數的情況下將Attribute傳遞給View?

@Override 
protected String connectView(){ 
    // I'd like to include an object in Model here 
    // e.g. model.addAttribute(....) 
    // but unpossible because super does not take a Model as param 
    return "connect/status"; 
} 
+0

請問您可以更具體的代碼?你正在返回一個字符串,但想添加屬性到模型?應該公平和正直,但你必須在這裏給予更多! –

+0

當然,當方法被調用時,控制器檢索「status.jsp」頁面並顯示它。我想將對象傳遞給視圖,通常我會通過將其放入模型中來完成此操作,但此方法不包含任何參數。我正在尋找一種替代方法。 – user1377822

回答

0

這應該適合您的需要,使用HandlerInterceptor,自定義註釋@Model和反思。

Model.java

@Retention(RetentionPolicy.RUNTIME) 
@Target(ElementType.FIELD) 
public @interface Model { 

} 

RequestInterceptor.java

@Service 
public class RequestInterceptor implements HandlerInterceptor { 

    @Override 
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws ServletException { 
     try { 
      Class<?> clazz = request.getClass(); 
      if (clazz.isAnnotationPresent(Controller.class)) { 
       for (Field field : clazz.getDeclaredFields()) { 
        if (field.isAnnotationPresent(Model.class)) { 
         field.set(request, new ModelMap()); 
         break; 
        } 
       } 
      } 
     } catch (IllegalAccessException e) { 
      // log("Cannot access model field of controller " + clazz.getSimpleName()); 
     } 
     return true; 
    } 

    @Override 
    public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) { 
     try { 
      Class<?> clazz = request.getClass(); 
      if (clazz.isAnnotationPresent(Controller.class)) { 
       for (Field field : clazz.getDeclaredFields()) { 
        if (field.isAnnotationPresent(Model.class)) { 
         ModelMap model = (ModelMap) field.get(request); 
         if (model != null) { 
          modelAndView.addAllObjects(model); 
         } 
         break; 
        } 
       } 
      } 
     } catch (IllegalAccessException e) { 
      // log("Cannot access model field of controller " + clazz.getSimpleName()); 
     } 
    } 

    @Override 
    public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception { 
    } 

} 

的applicationContext.xml

<!-- register the interceptor --> 
<mvc:interceptors> 
    <bean class="your.package.to.the.RequestInterceptor" /> 
</mvc:interceptors> 

YourController.java

@Controller 
public class YourController extends ConnectController { 

    @Model 
    private ModelMap model; 

    @Override 
    protected String connectView(){ 
     // model is here available 
     model.addAttribute("attrName", "attrValue"); 
     return "connect/status"; 
    } 

} 
+0

解決。謝謝 – user1377822

1

沒有至少有請求對象,我不相信你可以簡單地做你正在問的東西。但是,有幾個選項:

  1. 使用Servlet過濾器......添加所需的值以會話有
  2. 使用Decorator模式,在其中你會創建類(控制器的實例這種情況下)在另一個包裝類。在你的包裝中,你會做額外的處理,然後調用包裝的內部對象(你的包裝控制器),然後做任何最終處理。
  3. 的HandlerInterceptor像@ sp00m暗示(雖然我從來沒有使用過,所以我還沒有輸入有)

我相信有可能是一些其他的選擇了,但我想不出任何其他的。

相關問題