SpringMVC 使用HandlerMethodArgumentResolver自定义解析器实现请求数据绑定方法入参
来源:互联网 发布:ebay泳装销售数据 编辑:程序博客网 时间:2024/05/01 06:43
问题
首先,我们遇到的问题是…当我们需要在controller中频繁的从session中获取数据,比如向下面这样↓
我在controller中需要从session中获取user对象,那么可能你会想到在controller里面或者其他类里面写这样的代码,然后在controller里面调用….
public User getLoginUser(HttpServletRequest request) { HttpSession session = request.getSession(); return (User) session.getAttribute("user");}
总感觉特别的不好…
现在如果我们看了下面介绍的HandlerMethodArgumentResolver自定义解析器实现的请求数据绑定方法入参,你就会看到像下面的代码只需要一个注解就能解决上面的问题↓
@RequestMapping("/index")public String index(@MyUser User user,ModelMap modelMap){ logger.info(user.getUsername()+"---------------------------"); return "login";}
用HandlerMethodArgumentResolver解决
首先,我们需要知道一点的就是SpringMVC的工作流程,SpringMVC的DispatchServlet会根据请求来找到对应的HandlerMapping,最终Spring会选择用RequestMappingHandlerMapping,然后根据RequestMappingHandlerMapping来获取HandlerMethod,然后来找支持的HandlerMethodArgumentResolver来处理对应controller的方法的入参。
首先,我们需要做的就是创建一个Annotation↓ 具体怎么创建自定义Annotation可以看我的自定义Annotation
@Target(ElementType.PARAMETER)@Retention(RetentionPolicy.RUNTIME)public @interface MyUser {}
然后我们要做的就是创建一个MyUserMethodArgumentResolver这个类来实现HandlerMethodArgumentResolver这个接口
public class MyUserMethodArgumentResolver implements HandlerMethodArgumentResolver {@Overridepublic boolean supportsParameter(MethodParameter methodParameter) { Class<MyUser> userClass =MyUser.class; if(methodParameter.hasParameterAnnotation(userClass)){ return true; } return false;}@Overridepublic Object resolveArgument(MethodParameter methodParameter, ModelAndViewContainer modelAndViewContainer, NativeWebRequest nativeWebRequest, WebDataBinderFactory webDataBinderFactory) throws Exception { return nativeWebRequest.getAttribute("user", NativeWebRequest.SCOPE_REQUEST);; //或者这里你也可以直接返回自己创建的User对象用于测试 /* User user = new User(); user.setUsername("yangpeng"); return user; */ }}
Spring默认会注册多个HandlerMethodArgumentResolver来处理不同的请求,Spring会根据HandlerMethodArgumentResolver的supportsParameter()方法来判断是否支持处理当前请求。
第一个supportsParameter方法是判断这个MyUserMethodArgumentResolver是否支持传入的MethodParameter对象。
第二个resolveArgument方法是处理具体的需要绑定到方法入参,返回的对象就是需要绑定的对象,这里我是直接从session里面获取了一个user的对象直接返回,或者你也可以在这里直接创建一个User对象然后返回用于测试是一样的。
接下来就是在spring-mvc.xml中配置了↓
<mvc:annotation-driven> <mvc:argument-resolvers> <bean class="com.yp.code.common.bind.method.MyUserMethodArgumentResolver"></bean> </mvc:argument-resolvers></mvc:annotation-driven>
最后就是使用创建的@MyUser这个Annotation来让SpringMVC自动的帮你绑定到Controller的方法里面了↓
@RequestMapping("/index")public String index(@MyUser User user,ModelMap modelMap){ System.out.println(user.getUsername()); return "login";}
这样就非常优雅的解决了上面的问题。
还可以参考这个博客看看:http://blog.csdn.net/truong/article/details/30971317
- SpringMVC 使用HandlerMethodArgumentResolver自定义解析器实现请求数据绑定方法入参
- springMVC使用HandlerMethodArgumentResolver 自定义解析器实现请求参数绑定方法参数
- springMVC使用HandlerMethodArgumentResolver 自定义解析器实现请求参数绑定方法参数
- springMVC使用HandlerMethodArgumentResolver 自定义解析器实现请求参数绑定方法参数
- springMVC使用HandlerMethodArgumentResolver 自定义解析器实现请求参数绑定方法参数
- springMVC使用HandlerMethodArgumentResolver 自定义解析器实现请求参数绑定方法参数
- springMVC使用HandlerMethodArgumentResolver 自定义解析器实现请求参数绑定方法参数
- springMVC使用HandlerMethodArgumentResolver 自定义解析器实现请求参数绑定方法参数
- springMVC使用HandlerMethodArgumentResolver 自定义解析器实现请求参数绑定方法参数
- 自定义数据绑定---HandlerMethodArgumentResolver
- SpringMVC自定义注解并自定义解析器HandlerMethodArgumentResolver
- Spring MVC 自定义数据绑定---HandlerMethodArgumentResolver
- Spring MVC自定义数据绑定--HandlerMethodArgumentResolver
- SpringMVC之分析HandlerMethodArgumentResolver请求对应处理器方法参数的解析过程(一)
- SpringMVC之分析HandlerMethodArgumentResolver请求对应处理器方法参数的解析过程(二)
- 通过实现HandlerMethodArgumentResolver接口,给springMvc的Controller的方法注入自定义参数
- Spring MVC系列(五)之自定义数据绑定---HandlerMethodArgumentResolver
- SpringMvc (二) 通过URL限定:URL表达式/模拟请求方法/注解绑定方法参数/入参方式
- BKDRHash 算法java实现
- LeetCode203:Remove Linked List Elements
- 百度地图坐标转换中遇到的问题
- android高德地图调用定位显示
- C++ 学习
- SpringMVC 使用HandlerMethodArgumentResolver自定义解析器实现请求数据绑定方法入参
- 小马哥--高仿苹果6S 主板型号E127 6572芯片刷机开机界面图与识别图 新版机型
- java jdbc正确使用transaction 线程安全的TransactionManager
- C#解析html文档
- 上海证券交易所开放api 查询证券编码及基本上市信息
- iOS9适配简介
- phpman 应用
- Ⅰ.2.6.3.4 如何测试 QTableViews(QAbstractItemModels 和 QItemSelectionModels)中的 Items
- 细数空格缩进在开发中的坑