2010-04-12 37 views
4

我在找到使用Spring MVC的意見 - 我將如何構建一個頁面可以由幾種不同的觀點的事實 考慮一個控制器,它基本上是:春MVC-幾個部分/從控制器

public ModelAndView handleRequest(HttpServletRequest request, 
            HttpServletResponse response) 
            throws ServletException, IOException { 
      List<Post> posts = repository.getNewPosts(); 

      return new ModelAndView("posts", "posts", posts); 
    } 

但是,我決定在每個頁面上,我還想要一個顯示基於某種邏輯的數據的「窗格」。這「窗格」會僅僅是因爲被從上面的「上崗」視圖包括了.JSP,我可以我的控制器更改爲:

public ModelAndView handleRequest(HttpServletRequest request, 
            HttpServletResponse response) 
            throws ServletException, IOException { 
     List<Post> posts = repository.getNewPosts(); 
     List<Items> items= repository.getItems();  
     return new ModelAndView("model", "model", new MyCommonViewModel(posts,items)); 
    } 

但後來我不得不改變每個控制器也做List<Items> items= repository.getItems(); ,下一次我想出新的東西時再改變一切。

這似乎很混亂。我如何構造這個?

`

回答

3

看看Tiles

+1

+1瓷磚與我的解決方案效果很好! – 2010-04-13 01:20:18

0

首先,讓你有一個基類,可以加載,你需要在所有的控制器使用的數據,你可以繼承AbstractController。

public class AbstractHasPaneController extends AbstractController { 

    public Object getPaneData() { 
     return repository.getItems(); 
    } 

    // ... 
} 

然後,當你拿出新的東西你的其他控制器擴展您的抽象控制器

public class MyPageController extends AbstractHasPaneController { 

    public ModelAndView 
    handleRequest(HttpServletRequest request, HttpServletResponse response) 
    throws ServletException, IOException { 
     ModelAndView modelAndView = new ModelAndView("posts"); 
     modelAndView.addObject("posts", repository.getNewPosts()); 
     modelAndView.addObject("model", this.getPaneData());  
     return modelAndView ; 
    } 

    // ... 
} 

,所有你所編輯的AbstractHasPaneController.getPaneData()。

3

如果系統中每一頁都需要顯示的一種面板,那麼你可以提供使用interceptor該模型數據。這幾乎總是優於將代碼放入抽象控制器(正如另一個答案中所建議的),因爲這會迫使您始終從該特定的類層次結構中擴展該代碼。

public class YourInterceptor extends HandlerInterceptorAdapter { 

    private Repository repository; 
    public void setRepository (Repository repository) { 
     this.repository = repository; 
    } 

    public boolean preHandle(
      HttpServletRequest request, 
      HttpServletResponse response, 
      Object handler) 
    throws Exception { 
     List<Post> posts = repository.getNewPosts(); 
     List<Items> items= repository.getItems();  
     request.setAttribute("model", new MyCommonViewModel(posts,items)); 
    } 
} 

接線它像

<beans> 
    <bean id="handlerMapping" 
      class="org.springframework.web.servlet.handler.SimpleUrlHandlerMapping"> 
     <property name="interceptors"> 
      <list> 
       <ref bean="yourInterceptor"/> 
      </list> 
     </property> 
     <property name="mappings"> 
      <props> 
       <!-- SNIP --> 
      </props> 
     </property> 
    </bean> 

    <bean id="yourInterceptor" 
      class="your.YourInterceptor"> 
     <property name="repository"><ref bean="repository" /></property> 
    </bean> 
<beans> 

你也可以看看使用類似sitemesh。這使您可以創建一個模板頁面,該頁面是所有其他頁面(或某些頁面取決於您如何配置它的頁面)的基礎。這會阻止你必須在每個頁面上包含jsp窗格。但是,如果你的項目足夠小,可能不值得費心。

0

我非常anticapte使用的HandlerInterceptor爲您提供查看通用信息的建議。並延長從BART的答案和關於更容易建立攔截春天3.0提供了MVC框架的配置命名空間

在頂級元素beans只需添加

xmlns:mvc="http://www.springframework.org/schema/mvc" 

和你的bean的配置裏面,你就可以使用:

<mvc:annotation-driven /> 

<mvc:interceptors> 
    <bean class="org.example.web.interceptors.YourInterceptor"/> 
</mvc:interceptors>