2015-07-01 95 views
8

我正在學習從asp.net MVC來的Spring-MVC 4,我正在尋找一種方法將數據傳遞給View,而不必在每次調用中聲明Model Atrribute。訪問當前模型在spring-mvc

例如,現在我有這個。

public class BaseController { 
    public void AddMessage(Model model, String m) { 
     Model.addAttribute("msg", m); 
    } 
} 

public class PersonController extends BaseController{ 
     @RequestMapping("details/{Id}") 
     public String details(@PathVariable int Id, Model model) { 
      Person p = service.LoadById(Id); 

      if(p == null) { 
       AddMessage(model, "Record not found..."); 
      } else { 
       model.addAttribute("bean", q); 
      } 

      return "person/details"; 
     } 
} 

但我真的想是有辦法接取我的基本控制器中的方法Model實例,而無需通過它作爲一個參數。類似於asp.net MVC中ViewData或TempData的用法。

是否有可能以這種方式將數據傳遞到視圖?

謝謝

+0

你想用模型做什麼? –

回答

1

我設法使用請求攔截器解決此問題。本質:

在我的控制器基類:

public abstract class BaseController { 

    protected List<UserViewMessage> viewMessages; 

    public List<UserViewMessage> getViewMessages() { 
     if (viewMessages == null) { 
      viewMessages = new ArrayList<UserViewMessage>(); 
     } 

     return viewMessages; 
    } 

    public void addMessage(String message, UserViewMessageType type) { 
     getViewMessages().add(new UserViewMessage(message, type)); 
    } 

    public void clearMessages() { 
     if (viewMessages != null) { 
      viewMessages.clear(); 
     } 
    } 
} 

然後,我加入一個攔截到的消息集合複製到型號:

public class RequestInterceptor extends HandlerInterceptorAdapter { 

    private static String MODEL_MESSAGES_KEY = "ModelMessageList_"; 

    @Override 
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) 
      throws Exception { 

     if (handler instanceof org.springframework.web.method.HandlerMethod) { 

      HandlerMethod handlerMethod = (HandlerMethod) handler; 

      if (handlerMethod != null) { 
       Object bean = handlerMethod.getBean(); 

       if (bean != null && bean instanceof BaseController) { 

        BaseController bc = (BaseController) bean; 
        bc.clearMessages(); 
       } 
      } 
     } 

     return super.preHandle(request, response, handler); 
    } 

    @Override 
    public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, 
      ModelAndView modelAndView) throws Exception { 

     if (handler instanceof org.springframework.web.method.HandlerMethod) { 

      HandlerMethod handlerMethod = (HandlerMethod) handler; 

      if (handlerMethod != null && modelAndView != null) { 
       Object bean = handlerMethod.getBean(); 

       if (bean != null && bean instanceof BaseController) { 

        BaseController bc = (BaseController) bean; 

        if (bc.getViewMessages() != null) { 
         modelAndView.addObject(MODEL_MESSAGES_KEY, bc.getViewMessages()); 
        } 
       } 
      } 
     } 

     super.postHandle(request, response, handler, modelAndView); 
    } 
} 

其中,上PreHandle,清除設備上的任何消息基礎控制器集合。請求(的postHandle)後,自該模型是可,我消息採集複製到模型中,從而使其可對我的看法,像這樣:

<div class="row"> 
    <div class="col-lg-12"> 
     <c:forEach var="messageItem" items="${_ModelMessageList_}"> 
      <div class="alert alert-info"><c:out value="${messageItem.message}" /></div> 
     </c:forEach> 
    </div> 
</div> 

這不是最佳的,但它的作品。

0

如果你想避免將模型作爲方法參數,你可以在一個方法使用的ModelAttribute註釋: http://docs.spring.io/spring/docs/current/javadoc-api/org/springframework/web/bind/annotation/ModelAttribute.html

剛註釋的方法和Spring將自動添加什麼方法返回到模型。

@ModelAttribute 
public Stuff addStuffToModel() { 
     Stuff stuff = new Stuff("dummy data"); 
     return stuff; // stuff is added to the model 
} 
+0

還有別的辦法嗎?正如你想象的那樣,向模型中添加錯誤消息(例如)意味着需要從模型中檢索一個列表,然後向其中添加東西。所以我真的需要訪問模型實例 – tggm

+0

@TiagoMatias你在用AOP或類似的方式思考嗎? –