복붙노트

[SPRING] Spring MVC에서 글로벌 모델 속성을 설정하는 최선의 방법은 무엇입니까?

SPRING

Spring MVC에서 글로벌 모델 속성을 설정하는 최선의 방법은 무엇입니까?

나는 (캐시 된) 데이터 구동 메뉴이며 전역 구성 요소입니다. 나는 모든 페이지가 그것을 사용하게 될 것이기 때문에 매 요청마다 메뉴 아이템을 주입 할 수 있기를 원한다. 가장 좋은 장소는 무엇입니까? Spring3을 기반으로 한 주석을 사용하고 있습니다. 내가 생각할 수있는 최선의 해결책은 OncePerRequestFilter를 사용하여 컨트롤러를 추가하거나 컨트롤러를 하위 클래스로 분류하는 것이지만 @Controller 주석을 사용하여이를 수행하는 방법을 모르는 것입니다.

해결법

  1. ==============================

    1.나는 두 가지 쉬운 옵션을 생각할 수 있습니다 :

    나는 두 가지 쉬운 옵션을 생각할 수 있습니다 :

    각 @Controller 클래스는 데이터를 @ModelAttribute로 주석 처리 된 메소드로 노출합니다.

    @ModelAttribute
    public MyData getMyData() {
      ...
    }
    

    하지만 컨트롤러가 여러 개있는 경우에는 좋지 않습니다. 또한 모든 리디렉션의 URL에 myData를 인코딩하는 성가신 부작용이 있습니다.

    그 대신에 HandlerInterceptor를 구현하고 모든 요청에 ​​그런 식으로 데이터를 노출하는 것이 좋습니다. 어노테이션 (annotation-lovin)을 사용할 수는 없지만 비즈니스 로직과 분리하면 더 좋습니다. 이것은 OncePerRequestFilter 아이디어와 유사하지만, 그 이상의 Spring-y 아이디어입니다.

  2. ==============================

    2.HandlerInterceptor로 구현할 수 있습니다.

    HandlerInterceptor로 구현할 수 있습니다.

    참조 :

  3. ==============================

    3.Spring 3.2를 시작하면 각 Controller에서 @ExceptionHandler, @InitBinder 및 @ModelAttribute를 사용하는 대신 @ControllerAdvice를 사용할 수 있습니다. 모든 @Controller 빈에 적용됩니다.

    Spring 3.2를 시작하면 각 Controller에서 @ExceptionHandler, @InitBinder 및 @ModelAttribute를 사용하는 대신 @ControllerAdvice를 사용할 수 있습니다. 모든 @Controller 빈에 적용됩니다.

    import org.springframework.beans.propertyeditors.StringTrimmerEditor;
    import org.springframework.web.bind.WebDataBinder;
    import org.springframework.web.bind.annotation.ControllerAdvice;
    import org.springframework.web.bind.annotation.InitBinder;
    import org.springframework.web.context.request.WebRequest;
    
    @ControllerAdvice
    public class GlobalBindingInitializer {
      @InitBinder
      public void registerCustomEditors(WebDataBinder binder, WebRequest request) {
        binder.registerCustomEditor(String.class, new StringTrimmerEditor(true));
      }
    }
    

    Spring Roo에서 생성 된 코드로 시작했거나 include-filter를 사용하여 컴포넌트 스캔으로 스캔 한 주석을 제한 한 경우 webmvc-config.xml에 필요한 필터를 추가하십시오

    <!-- The controllers are autodetected POJOs labeled with the @Controller annotation. -->
    <context:component-scan base-package="com.sensei.encore.maininterface" use-default-filters="false">
      <context:include-filter expression="org.springframework.stereotype.Controller" type="annotation"/>
      <!-- ADD THE BELOW LINE -->
      <context:include-filter expression="org.springframework.web.bind.annotation.ControllerAdvice" type="annotation"/>
    </context:component-scan>
    
  4. ==============================

    4.방금 같은 질문에 대한 답을 찾았습니다. 내 게시물의 일부입니다.

    방금 같은 질문에 대한 답을 찾았습니다. 내 게시물의 일부입니다.

    Spring이 @ModelAttribute로 표시된 메소드의 참조 데이터를 리디렉션 URL에 추가하는 것을 멈추게 할 수 있습니까?

    RedirectView에서 노출 모델 속성 변수를 false로 설정하기 만하면됩니다.

  5. ==============================

    5.모든 뷰가 이러한 변수를 해결할 수있는 전역 변수를 추가해야하는 경우 속성 또는 맵을 정의하지 않은 다음 spring DI를 사용하여 뷰 해석기 bean을 참조하십시오. 그것은 정적으로 증명할 수있는 것과 같이 매우 유용합니다. resUrl.

    모든 뷰가 이러한 변수를 해결할 수있는 전역 변수를 추가해야하는 경우 속성 또는 맵을 정의하지 않은 다음 spring DI를 사용하여 뷰 해석기 bean을 참조하십시오. 그것은 정적으로 증명할 수있는 것과 같이 매우 유용합니다. resUrl.

    <property name="viewResolvers">
        <list>
            <bean
        class="org.springframework.web.servlet.view.InternalResourceViewResolver">
                <property name="viewClass"
                    value="org.springframework.web.servlet.view.JstlView" />
                <property name="attributes" ref="env" />
                <property name="exposeContextBeansAsAttributes" value="false" />
                <property name="prefix" value="${webmvc.view.prefix}" />
                <property name="suffix" value="${webmvc.view.suffix}" />
            </bean>
        </list>
    </property>
    
  6. from https://stackoverflow.com/questions/4651537/what-are-the-best-practices-around-setting-global-model-attributes-in-spring-mvc by cc-by-sa and MIT license