source

봄 3의 모든 컨트롤러 모델에 속성 추가

factcode 2023. 8. 2. 09:27
반응형

봄 3의 모든 컨트롤러 모델에 속성 추가

Spring 3 앱의 모든 뷰에는 신뢰할 수 있는 속성 집합이 있습니다.모든 컨트롤러의 첫 번째 줄은 다음과 같습니다.

ControllerHelper.addDefaultModel(model, personManager, request);

거기에 덧붙이겠습니다.

  • 사용자가 로그인한 경우 데이터베이스에서 검색된 사용자 개체 및 전체 이름
  • 으로 한 번 ( 일으한로예변수집합는되설정번적반예▁which▁of:)imagesHost)
  • 방문자가 전환할 수 있는 언어 집합
  • 현재의 언어
  • 일부 통계(예: 시스템의 총 인원)

이렇게 하면 각 보기에서 로그인한 사용자 이름을 표시하고 이미지 위치, 언어 목록 및 사이트에 대한 전체 통계를 쉽게 참조할 수 있습니다.

따라서 문제는 컨트롤러 모델 개체가 모든 데이터를 저장하는 데 가장 적합한 위치인지 아니면 보기가 이 정보에 쉽게 액세스할 수 있는 더 편리한 위치가 있는지 여부입니다.

그리고 두 번째로, 저는 정말로 그것을 가질 필요가 없는 것이 좋습니다.ControllerHelper위의 라인을 모든 컨트롤러의 첫 번째 라인으로 지정합니다.사실 항상 첫 번째 줄만 있는 것은 아닙니다. 때때로 저는 먼저 해당 컨트롤러에서 리디렉션해야 하는지 확인합니다. 이유 없이 모델을 채우는 리소스를 낭비하고 싶지 않기 때문입니다. 필터나 , 콜백 하게 할 수 것입니다.ControllerHelper컨트롤러가 완료된 후에 코드가 호출되지만 보기가 렌더링되기 직전에 리디렉션이 반환된 경우 이 코드를 건너뜁니까?

.(또는 해당 편의 하위 클래스)를 작성할 수 있습니다.

@참조: 스프링 참조 장: 15.4.1 인터셉트 요청 - 핸들러인터셉터 인터페이스

다음과 같은 방법이 있습니다.

void postHandle(HttpServletRequest request,
                HttpServletResponse response,
                Object handler,
                ModelAndView modelAndView) throws Exception;

이 메서드는 컨트롤러가 완료된 후 보기가 렌더링되기 전에 호출됩니다.은 그것을해서, , 몇지래그에 몇 할 수 .ModelMap

예:

/**
 * Add the current version under name {@link #VERSION_MODEL_ATTRIBUTE_NAME}
 * to each model. 
 * @author Ralph
 */
public class VersionAddingHandlerInterceptor extends HandlerInterceptorAdapter {

    /**
     * The name under which the version is added to the model map.
     */
    public static final String VERSION_MODEL_ATTRIBUTE_NAME =
                "VersionAddingHandlerInterceptor_version";

    /**        
     *  it is my personal implmentation 
     *  I wanted to demonstrate something usefull
     */
    private VersionService versionService;

    public VersionAddingHandlerInterceptor(final VersionService versionService) {
        this.versionService = versionService;
    }

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

        if (modelAndView != null) {
            modelAndView.getModelMap().
                  addAttribute(VERSION_MODEL_ATTRIBUTE_NAME,
                               versionService.getVersion());
        }
    }
}

webmvc-config.xml

<mvc:interceptors>
    <bean class="demo.VersionAddingHandlerInterceptor" autowire="constructor" />
</mvc:interceptors>

@ModelAttribute는 메소드에 사용할 수도 있습니다.

@ModelAttribute("version")
public String getVersion() {
   return versionService.getVersion();
}

컨트롤러의 모든 요청 매핑에 대해 추가합니다.이를 슈퍼 클래스에 넣으면 이를 확장하는 모든 컨트롤러에서 사용할 수 있습니다.

@ControllerAdvise로 주석이 달린 컨트롤러 클래스를 사용할 수 있습니다.

"@ControllerAdvise는 3.2에서 @ExceptionHandler, @ModelAttribute 및 @InitBinder 메서드를 모두 또는 일부 컨트롤러에서 공유하기 위해 도입되었습니다."

SpringOne2GX 2014 동안 녹화된 비디오의 이 부분을 살펴보십시오. http://www.youtube.com/watch?v=yxKJsgNYDQI&t=6m33s

@ 나를 위해 이 일에 대답하는 것처럼:

@ControllerAdvice(annotations = RestController.class)
public class AnnotationAdvice {

    @Autowired
    UserServiceImpl userService;

    @ModelAttribute("currentUser")
    public User getCurrentUser() {
       UserDetails userDetails = (UserDetails) 
       SecurityContextHolder.getContext().getAuthentication().getPrincipal();
       return userService.findUserByEmail(userDetails.getUsername());
}
}

@ModelAttribute 또는 Handler를 사용할 때 리디렉션과 관련하여 발생하는 문제가 하나 있습니다.요격기 접근.처리기가 리디렉션 보기를 반환하면 이렇게 추가된 모델 특성이 쿼리 매개 변수로 추가됩니다.

이 상황을 처리하는 또 다른 방법은 기본 애플리케이션 컨트롤러에서 자동 배선되거나 액세스가 필요한 모든 컨트롤러에서 명시적으로 할당할 수 있는 세션 범위 빈을 만드는 것입니다.

사용 가능한 범위 및 사용에 대한 자세한 내용은 여기에서 확인할 수 있습니다.

모든 뷰가 이러한 변수를 해결할 수 있는 몇 가지 글로벌 변수를 추가해야 하는 경우 속성이나 맵으로 정의하지 않으시겠습니까?그런 다음 스프링 DI를 사용하여 뷰 리졸버 빈을 참조하십시오.정적 검증 가능성과 같이 매우 유용합니다. 예를 들어 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>

언급URL : https://stackoverflow.com/questions/7360784/add-attributes-to-the-model-of-all-controllers-in-spring-3

반응형