內的每一個動作,我想對在春季啓動應用程序的多個控制器中的每個@RequestMapping
設置我的模型三種常見的屬性。我已閱讀約@ModelAttribute
,但它需要放在每個控制器。我在我的申請20多個控制器和每個具有超過10個@RequestMapping
。設置模型屬性爲每個控制器
有沒有一種方法來設置這樣的模式,即得到在應用程序開始時初始化一個地方的屬性?
內的每一個動作,我想對在春季啓動應用程序的多個控制器中的每個@RequestMapping
設置我的模型三種常見的屬性。我已閱讀約@ModelAttribute
,但它需要放在每個控制器。我在我的申請20多個控制器和每個具有超過10個@RequestMapping
。設置模型屬性爲每個控制器
有沒有一種方法來設置這樣的模式,即得到在應用程序開始時初始化一個地方的屬性?
如果你想執行的春天引導啓動一些代碼,可以這樣考慮:
但我想,你真的想控制相關行爲,我會建議使用全球攔截 。
隨着全球攔截器,您可以在Spring中的請求 - 響應生命週期的干擾。
它可以讓你添加功能的請求 - 響應生命週期在3個不同點:
只需創建一個類,該類延伸自HandlerInterceptorAdapter
並覆蓋三種方法之一,並具有所需的功能。
例如:
public class MyInterceptor extends HandlerInterceptorAdapter {
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler)
throws Exception {
request.setAttribute("myFirstAttribute", "MyFirstValueHere");
return super.preHandle(request, response, handler);
}
}
下面是關於如何使用Spring引導做一個例子:
@Configuration
public class WebMvcConfig extends WebMvcConfigurerAdapter {
@Autowired
MyInterceptor myInterceptor;
@Override
public void addInterceptors(InterceptorRegistry registry) {
registry.addInterceptor(...)
...
registry.addInterceptor(myInterceptor);
}
}
我提供由用SpringMVC另一種方法,使用HandlerInterceptor,當你實現它它提供了3種方法,每種方法都包含HttpServletRequest,可以使用request.setAttribute("xx","yy")
設置屬性,以下是代碼:
public class RequestInterceptor implements HandlerInterceptor {
public void afterCompletion(HttpServletRequest arg0,
HttpServletResponse arg1, Object arg2, Exception arg3)
throws Exception {
}
public void postHandle(HttpServletRequest request, HttpServletResponse arg1,
Object arg2, ModelAndView arg3) throws Exception {
//you can set attributes here like request.setAttribute("xx","yy")
}
public boolean preHandle(HttpServletRequest request, HttpServletResponse response,
Object arg2) throws Exception {
//you can set attributes here like request.setAttribute("xx","yy")
return false;
}
}
然後,你需要自定義攔截器添加到您的Spring MVC應用程序如下圖所示:
<bean id="handlerMapping" class="org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerMapping">
<property name="interceptors">
<list>
<!--class of your custom interceptor-->
<bean class="com.xx.RequestInterceptor"/>
</list>
</property>
</bean>
介紹常見的BaseController類,並將'@ ModelAttribute'在班上,讓所有的控制器延長BaseController – StanislavL
這就是有'@ ControllerAdvice'註釋的類可以爲你做。或者使用'HandlerInterceptor'在每個請求上添加公共數據。 –