问题
首先,我们遇到的问题是,当我们需要在controller中频繁的从session中获取数据,比如向下面这样
在controller中需要从session中获取user对象,那么可能你会想到在controller里面或者其他类里面写这样的代码,然后在controller里面调用….
1 | public User getLoginUser(HttpServletRequest request) { |
总感觉特别的不好…
现在如果我们看了下面介绍的HandlerMethodArgumentResolver自定义解析器实现的请求数据绑定方法入参,你就会看到像下面的代码只需要一个注解就能解决上面的问题↓
1 |
|
用HandlerMethodArgumentResolver解决
首先,我们需要知道一点的就是SpringMVC的工作流程,SpringMVC的DispatchServlet会根据请求来找到对应的HandlerMapping,最终spring会选择用RequestMappingHandlerMapping,然后根据RequestMappingHandlerMapping来获取HandlerMethod,然后来找支持的HandlerMethodArgumentResolver来处理对应controller的方法的入参。
首先,我们需要做的就是创建一个Annotation
1 |
|
然后我们要做的就是创建一个MyUserMethodArgumentResolver这个类来实现HandlerMethodArgumentResolver这个接口
1 | public class MyUserMethodArgumentResolver implements HandlerMethodArgumentResolver { |
Spring默认会注册多个HandlerMethodArgumentResolver来处理不同的请求,Spring会根据HandlerMethodArgumentResolver的supportsParameter()方法来判断是否支持处理当前请求。
第一个supportsParameter方法是判断这个MyUserMethodArgumentResolver是否支持传入的MethodParameter对象。
第二个resolveArgument方法是处理具体的需要绑定到方法入参,返回的对象就是需要绑定的对象,这里我是直接从session里面获取了一个user的对象直接返回,或者你也可以在这里直接创建一个User对象然后返回用于测试是一样的。
接下来就是在spring-mvc.xml中配置了
1 | <mvc:annotation-driven> |
最后就是使用创建的@MyUser这个Annotation来让SpringMVC自动的帮你绑定到Controller的方法里面了
1 |
|
这样就非常优雅的解决了上面的问题。