2010-04-12 5 views
4

Я ищу в использовании Spring MVC - как бы я структурировать тот факт, что страница может состоять из нескольких различных точек зрения Рассмотрю контроллер, который в основном:Spring 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 Плитка хорошо работает с моим решением! –

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

Я очень предопределяю предложение использовать HandlerInterceptor для предоставления общей информации на ваш взгляд. И расширить ответ от Барта и о настройке программы перехватчики легко Spring 3.0 обеспечивает Mvc конфигурации пространства имен

На элемент верхнего уровня beans просто добавить

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

И внутри вашей конфигурации боба вы можете затем использование:

<mvc:annotation-driven /> 

<mvc:interceptors> 
    <bean class="org.example.web.interceptors.YourInterceptor"/> 
</mvc:interceptors> 
Смежные вопросы