我有许多控制器方法分布在许多类中。每个方法都需要一个Model
对象,我的所有方法都会将一些共享属性填充到模型中(主要控制导航栏显示)。有没有办法让我将一个'基础'方法插入Spring?我想要一个方法可以填充我的共享属性,然后进入特定的控制器方法(或反过来说)。有人知道怎么做吗?
答案 0 :(得分:3)
听起来像HandlerIntercepto r可能是一个很好的方法。
它有点像AOP - 您可以定义一个具有PreHandle
或PostHandle
方法的类,并配置它将运行的请求。在您的情况下,您可能需要PostHandle
,因为这样可以访问ModelAndView,因此您可以使用共享项填充它。
答案 1 :(得分:2)
您可以在Spring和Spring MVC中使用几个扩展点:
HandlerInterceptor
- 拦截每个处理程序方法的简单方法WebArgumentResolver
- 也许你可以在调用控制器之前以某种方式自定义解析参数并处理它们?答案 2 :(得分:1)
如果你实现的逻辑是一个横切的问题,通常不会与特定的视图耦合,我建议使用拦截器而不是创建控制器功能层次结构。当涉及到异常映射和会话数据管理/生命周期等事情时,控制器层次结构可能很难处理。此外,视图层是您最有可能需要随着时间的推移而改变客户需求的地方,因此未来的功能层次结构将不会发生。
org.springframework.web.servlet.HandlerInterceptor
有一个'postHandle'方法,可以让您访问请求,处理请求的控制器和ModelMap。这应该就是你所需要的。如果您需要来自控制器的某些控件,您可以随时向其添加元数据,例如,指示它使用哪个类的标头(然后在将来必须更改时,它是xml或注释中的一个字符串,而不是改变你继承的类和所有需要的类。)
你打开它们是这样的:
<bean class="org.springframework.web.servlet.mvc.annotation.DefaultAnnotationHandlerMapping">
<property name="interceptors">
<list>
<bean class="a.package.MyHandlerInterceptor"/>
</list>
</property>
</bean>