SpringMVC中的参数组装:HandlerMethodArgumentResolver

转载 2015年11月18日 11:25:46

SpringMVC3.1引入了HandlerMethodArgumentResolver接口,Spring调用该接口实现Controller的参数装配。HandlerMethodArgumentResolver实现类中会调用DataBinder,Converter等。

常用的该接口实现类有:

ServletModelAttributeMethodProcessor:实体类的组装用它实现。

RequestParamMethodArgumentResolver:基本数据类型如String用它实现。

在我学习过程中,发现对List类型的参数SpringMVC没有提供默认实现。我参照Spring的示例 通过实现 HandlerMethodArgumentResolver接口,实现对List参数的组装。

示例中用到的Model类:

[java] view plaincopy在CODE上查看代码片派生到我的代码片
  1. package com.weishubin.springmvc.model;  
  2.   
  3. public class User {  
  4.     private String name;  
  5.     private int age;  
  6.     public String getName() {  
  7.         return name;  
  8.     }  
  9.     public void setName(String name) {  
  10.         this.name = name;  
  11.     }  
  12.     public int getAge() {  
  13.         return age;  
  14.     }  
  15.     public void setAge(int age) {  
  16.         this.age = age;  
  17.     }  
  18.           
  19.     public String toString() {  
  20.         StringBuilder sb = new StringBuilder();  
  21.         sb.append(name);  
  22.         sb.append("-");  
  23.         sb.append(age);  
  24.         return sb.toString();  
  25.     }  
  26. }  

注解类:

[java] view plaincopy在CODE上查看代码片派生到我的代码片
  1. package com.weishubin.springmvc.listargument;  
  2.   
  3. import java.lang.annotation.Documented;  
  4. import java.lang.annotation.ElementType;  
  5. import java.lang.annotation.Retention;  
  6. import java.lang.annotation.RetentionPolicy;  
  7. import java.lang.annotation.Target;  
  8.   
  9. @Target(ElementType.PARAMETER)  
  10. @Retention(RetentionPolicy.RUNTIME)  
  11. @Documented   
  12. public @interface ListAttribute {  
  13.       
  14. }  

实现了HandlerMethodArgumentResolver接口的参数解析器:

[java] view plaincopy在CODE上查看代码片派生到我的代码片
  1. package com.weishubin.springmvc.listargument;  
  2.   
  3. import java.util.ArrayList;  
  4. import java.util.List;  
  5.   
  6. import org.springframework.beans.BeanWrapper;  
  7. import org.springframework.beans.PropertyAccessorFactory;  
  8. import org.springframework.core.MethodParameter;  
  9. import org.springframework.web.bind.support.WebDataBinderFactory;  
  10. import org.springframework.web.context.request.NativeWebRequest;  
  11. import org.springframework.web.method.support.HandlerMethodArgumentResolver;  
  12. import org.springframework.web.method.support.ModelAndViewContainer;  
  13.   
  14. import com.weishubin.springmvc.model.User;  
  15.   
  16. public class ListArgumentResolver implements HandlerMethodArgumentResolver {  
  17.   
  18.     public boolean supportsParameter(MethodParameter parameter) {  
  19.         //仅作用于添加了注解ListAttribute的参数  
  20.         return parameter.getParameterAnnotation(ListAttribute.class) != null;  
  21.     }  
  22.   
  23.     public Object resolveArgument(MethodParameter parameter,  
  24.             ModelAndViewContainer mavContainer, NativeWebRequest webRequest,  
  25.             WebDataBinderFactory binderFactory) throws Exception {  
  26.         List<User> users = new ArrayList<User>();  
  27.         String[] names = webRequest.getParameterValues("name");  
  28.         String[] ages = webRequest.getParameterValues("age");  
  29.           
  30.           
  31.         for (int i = 0; i < names.length; i++) {  
  32.             User user = new User();  
  33.             BeanWrapper beanWrapper = PropertyAccessorFactory.forBeanPropertyAccess(user);  
  34.               
  35.             String name = names[i];  
  36.             String age = ages[i];  
  37.             beanWrapper.setPropertyValue("name", name);  
  38.             beanWrapper.setPropertyValue("age", age);  
  39.               
  40.             users.add(user);  
  41.         }  
  42.         return users;  
  43.     }  
  44.   
  45. }  

Controller类:

[java] view plaincopy在CODE上查看代码片派生到我的代码片
  1. package com.weishubin.springmvc.listargument;  
  2.   
  3. import java.util.List;  
  4.   
  5. import org.springframework.stereotype.Controller;  
  6. import org.springframework.web.bind.annotation.RequestMapping;  
  7. import org.springframework.web.bind.annotation.ResponseBody;  
  8.   
  9. import com.weishubin.springmvc.model.User;  
  10.   
  11. @Controller  
  12. public class ListArgumentController {  
  13.       
  14.     @ResponseBody  
  15.     @RequestMapping("/list")  
  16.     public String argumentResolver(@ListAttribute List<User> list) {  
  17.         StringBuilder b = new StringBuilder();  
  18.         for (User u : list) {  
  19.             b.append(u);  
  20.             b.append("<br/>");  
  21.         }  
  22.         return b.toString();  
  23.     }  
  24. }  

配置文件:

[html] view plaincopy在CODE上查看代码片派生到我的代码片
  1. <mvc:annotation-driven>  
  2.         <mvc:argument-resolvers>  
  3.             <bean class="com.weishubin.springmvc.listargument.ListArgumentResolver"/>  
  4.         </mvc:argument-resolvers>  
  5.     </mvc:annotation-driven>  

使用HandlerMethodArgumentResolver接口自定义Spring MVC的参数接受规则

1.自定义Spring MVC接受List参数 SpringMVC3.1引入了HandlerMethodArgumentResolver接口,spring调用该接口实现Controller的参数装配。...
  • he90227
  • he90227
  • 2016年05月30日 13:43
  • 3093

SpringMVC 使用HandlerMethodArgumentResolver自定义解析器实现请求数据绑定方法入参

问题首先,我们遇到的问题是…当我们需要在controller中频繁的从session中获取数据,比如向下面这样↓我在controller中需要从session中获取user对象,那么可能你会想到在co...
  • u013632755
  • u013632755
  • 2015年11月17日 17:57
  • 3030

springMVC使用HandlerMethodArgumentResolver 自定义解析器实现请求参数绑定方法参数

springMVC 数据绑定 多个对象 如何准确绑定?遇到的问题: 我有Person和Cat两个类,他们都有name这个field,如果我有一个Controller的方法接收Cat和Person两个...
  • u011217058
  • u011217058
  • 2017年06月07日 14:43
  • 674

springMVC使用HandlerMethodArgumentResolver 自定义解析器实现请求参数绑定方法参数

平时工作用是struts2,近来试了下springMVC,感觉很方便。 然后遇到了问题: 我有Person和Cat两个类,他们都有name这个field,如果我有一个Controller的方法接收Ca...
  • Truong
  • Truong
  • 2014年06月15日 10:25
  • 29989

springMVC使用HandlerMethodArgumentResolver 自定义解析器实现请求参数绑定方法参数

springMVC 数据绑定 多个对象 如何准确绑定? 遇到的问题: 我有Person和Cat两个类,他们都有name这个field,如果我有一个Controller的方法接收Cat和Perso...
  • y534560449
  • y534560449
  • 2017年06月08日 14:32
  • 411

SpringMVC那些事-整体概述

名词浅析 *DispatcherServlet:分发器,把用户请求分发给控制器中的处理器处理,并处理结果和返回响应.实际上这个分发器就是一个Servlet. *Controller:控制器,一般使用@...
  • yhjyumi
  • yhjyumi
  • 2015年09月26日 13:53
  • 1479

springMVC注入bean的流程,源码

org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'goodsControl...
  • lz710117239
  • lz710117239
  • 2017年11月08日 21:16
  • 3391

spring实用知识分享

spring实用知识分享spring容器介绍: 1、 spring容器为父容器,springMvc容器为子容器 2、 父容器由ContextLoaderListener加载,子容器由Dispa...
  • kuangtengda
  • kuangtengda
  • 2016年12月20日 18:14
  • 257

jquery 源码分析6-ajax(B)ajax参数组装过程

jquery 源码分析6-ajax(B)ajax参数组装过程把整个$.ajax(),拆开,主要有以下几个方面 全局ajax函数ajaxStart,ajaxStop,ajaxComplete,ajaxE...
  • juncai91
  • juncai91
  • 2016年10月18日 19:12
  • 204

CustomArgumentResolvers 自定义参数解析器无效

Spring配置中自定义
  • Truong
  • Truong
  • 2014年06月15日 10:36
  • 5286
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:SpringMVC中的参数组装:HandlerMethodArgumentResolver
举报原因:
原因补充:

(最多只允许输入30个字)