Spring Controller:我可以在调用每个@RequestMapping方法之前调用一个方法吗?

时间:2011-02-23 07:41:13

标签: java spring-mvc controller

我有一些常见的组件,这些组件始终存在于给定Controller类所服务的每个页面中。

在每个@RequestMapping方法的开头,我使用这些常用组件填充模型。

有没有办法定义在每个控制器方法之前调用的方法,以便我可以将所有这些复制/粘贴到一个地方?

6 个答案:

答案 0 :(得分:20)

使用@ModelAttribute

注释方法

下面会在名称为“foo”

的模型中添加一个Foo实例
@ModelAttribute("foo")
public Foo foo() {
    return new Foo();
}

请参阅@ModelAttribute文档

答案 1 :(得分:13)

拦截器是解决方案。它有方法preHandler和postHandler,它们将分别在每个请求之前和之后调用。您可以挂钩到每个HTTPServletRequest对象,也可以通过挖掘它来传递几个。

这是一个示例代码:

@Component
public class AuthCodeInterceptor extends HandlerInterceptorAdapter {

    @Override
    public boolean preHandle(HttpServletRequest request,
            HttpServletResponse response, Object handler) throws Exception {

        // set few parameters to handle ajax request from different host
        response.addHeader("Access-Control-Allow-Origin", "*");
        response.addHeader("Access-Control-Allow-Methods", "POST, GET, OPTIONS");
        response.addHeader("Access-Control-Max-Age", "1000");
        response.addHeader("Access-Control-Allow-Headers", "Content-Type");
        response.addHeader("Cache-Control", "private");

        String reqUri = request.getRequestURI();
        String serviceName = reqUri.substring(reqUri.lastIndexOf("/") + 1,
                reqUri.length());
                if (serviceName.equals("SOMETHING")) {

                }
        return super.preHandle(request, response, handler);
    }

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

        super.postHandle(request, response, handler, modelAndView);
    }
}

答案 2 :(得分:5)

在特定处理程序和返回值添加到Model实例之前,将调用具有@ModelAttribute批注的所有方法。然后,您可以在视图中使用此属性并将其用作处理程序参数。

我发现this blog非常有用。

答案 3 :(得分:2)

是的,您可以使用interceptor。您可以按<mvc:interceptors>

定义它们

另一种选择是使用s Filter,但你无法将春豆注入其中。

答案 4 :(得分:2)

检查@ControllerAdvice,您可以使用此方法处理异常,modelAttribute

答案 5 :(得分:0)

另一种方法是将控制器类注释为请求范围(@Scope('request')),以便每个请求都将创建控制器的新实例以在其上调用匹配方法。

然后,您可以将所有预处理工作放入构造后方法(即,用@PostConstruct注释的常规方法)中,该方法将在初始化新的控制器实例(即创建和所有依赖项)后始终调用已解决),并且在调用请求匹配方法之前。

我想如果控制器的初始化工作很繁琐(例如昂贵的计算或要解决的许多依赖关系),效率会有些低下;但这是解决此问题的另一种方法。