2010-04-12 1 views
4

에서 전망 - 나는 기본적으로의 컨트롤러 고려 페이지가 여러 가지 다른 견해 구성 될 수 있다는 사실을 구성 할 방법 :봄 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 타일이 내 솔루션과 잘 작동합니다. –

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)); 
    } 
} 

은 또한 sitemesh 같은 것을 사용하여 볼 수 있었다

<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> 

처럼 그것을 배선. 이렇게하면 다른 모든 페이지 (또는 구성 방법에 따라 특정 페이지 집합)의 기반이되는 템플릿 페이지를 만들 수 있습니다. 이렇게하면 모든 페이지에 창 jsp를 포함하지 않아도됩니다. 그러나 프로젝트 규모가 충분히 작 으면 귀찮은 가치가 없을 수도 있습니다.

0

나는보기에 범용 정보를 제공하기 위해 HandlerInterceptor을 사용하라는 제안에 매우 반대 의견을 제시했습니다. 그리고 바트에서 답을 연장하고 3.0은 단순히 당신을

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

을 추가하고 빈 설정 내부의 최상위 요소 beans에 MVC 구성 네임 스페이스

을 제공 봄보다 쉽게 ​​인터셉터를 수 설정에 관한 사용 :

<mvc:annotation-driven /> 

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