Spring MVC自定义数据绑定--HandlerMethodArgumentResolver
来源:互联网 发布:cf咪咕刷枪软件 编辑:程序博客网 时间:2024/05/22 00:53
参考资料:http://blog.csdn.net/linuu/article/details/51065476
自己实现的自定义annotation绑定一个数据的例子:
1、创建一个annotation–ManyUser,默认只能注解参数,切运行时有效:
package com.data.custom;import java.lang.annotation.*;@Target({ElementType.PARAMETER})@Retention(RetentionPolicy.RUNTIME)@Documentedpublic @interface ManyUser { String value() default "";}
2、自定义一个ManyUserHandlerMethodArgumentResolver实现HandlerMethodArgumentResolver,所有的自定义数据绑定的区别就在resolveArgument方法中。客户端用不同的方式传来数据,则在resolveArgument方法中用不同的方式接受数据,比如:1、通过@ModelAttribute方式注入参数,则用webRequest.getAttribute获取参数数据;2、通过”URL?参数1=value1”的方式注入参数,则用webRequest.getParameter方式获取参数数据。然后需要返回的数据则是resolveArgument处理后返回(应该好好研究下参数传递方式,如:webRequest等)。
方式1的示例代码:
package com.data.custom;import org.springframework.core.MethodParameter;import org.springframework.web.bind.support.WebDataBinderFactory;import org.springframework.web.context.request.NativeWebRequest;import org.springframework.web.context.request.WebRequest;import org.springframework.web.method.support.HandlerMethodArgumentResolver;import org.springframework.web.method.support.ModelAndViewContainer;import java.util.ArrayList;import java.util.List;public class ManyUserHandlerMethodArgumentResolver implements HandlerMethodArgumentResolver {// public boolean supportsParameter(MethodParameter parameter) {// return parameter.hasParameterAnnotation(ManyUser.class);// } public boolean supportsParameter(MethodParameter parameter) { return parameter.getParameterAnnotation(ManyUser.class) != null; } public Object resolveArgument(MethodParameter parameter, ModelAndViewContainer mavContainer, NativeWebRequest webRequest, WebDataBinderFactory binderFactory) throws Exception{ List<User> users = new ArrayList<User>(); ManyUser attr = parameter.getParameterAnnotation(ManyUser.class); String names=webRequest.getAttribute("names", WebRequest.SCOPE_REQUEST).toString(); String ids=webRequest.getAttribute("ids", WebRequest.SCOPE_REQUEST).toString(); System.out.println("names = "+names+" ids = "+ids); if(names !=null && ids !=null) { String[] nameStrs = names.trim().split(","); String[] idStrs = ids.trim().split(","); for(int i=0;i<nameStrs.length;i++){ User u = new User(Integer.parseInt(idStrs[i]),nameStrs[i]); users.add(u); } } return users; }}
方式2的示例代码:
package com.data.custom;import org.springframework.core.MethodParameter;import org.springframework.web.bind.support.WebDataBinderFactory;import org.springframework.web.context.request.NativeWebRequest;import org.springframework.web.context.request.WebRequest;import org.springframework.web.method.support.HandlerMethodArgumentResolver;import org.springframework.web.method.support.ModelAndViewContainer;import java.util.ArrayList;import java.util.List;public class ManyUserHandlerMethodArgumentResolver implements HandlerMethodArgumentResolver { public boolean supportsParameter(MethodParameter parameter) { return parameter.getParameterAnnotation(ManyUser.class) != null; } public Object resolveArgument(MethodParameter parameter, ModelAndViewContainer mavContainer, NativeWebRequest webRequest, WebDataBinderFactory binderFactory) throws Exception{ List<User> users = new ArrayList<User>(); String names = (String) webRequest.getParameter("names"); String ids = (String) webRequest.getParameter("ids"); if(names !=null && ids !=null) { String[] nameStrs = names.trim().split(","); String[] idStrs = ids.trim().split(","); for(int i=0;i<nameStrs.length;i++){ User u = new User(Integer.parseInt(idStrs[i]),nameStrs[i]); users.add(u); } } return users; }}
写controller来测试一下(一定不要搞忘了在前面加@ResponseBody注解,不加的话Spring会调用视图解析器去找返回值对应的jsp页面,而不是给调用页面返回一个字符串):
方式1的controller示例代码:
package com.data.custom;import org.springframework.stereotype.Controller;import org.springframework.web.bind.annotation.ModelAttribute;import org.springframework.web.bind.annotation.RequestMapping;import org.springframework.web.bind.annotation.RequestMethod;import org.springframework.web.bind.annotation.ResponseBody;import javax.servlet.http.HttpServletRequest;import java.util.Iterator;import java.util.List;@Controllerpublic class ManyUserHandlerMethodArgumentController { @ModelAttribute public void beforeInvokingHandlerMethod(HttpServletRequest request){ request.setAttribute("names","lyncc,fly,ted"); request.setAttribute("ids","1,2,3"); } @RequestMapping(value = "/data/manyUser",method = RequestMethod.GET) public @ResponseBody String manyUser(@ManyUser List<User> users){ System.out.println("tsuhlfsfbnm,.'/" + ""); String usrStr = "feikong"; //java中遍历ArrayList的三种方式。 for(int i=0 ;i<users.size();i++){ usrStr += users.get(i).toString(); }// for(User u: users){// usrStr += u.toString();// }// for(Iterator<User> it = users.iterator(); it.hasNext(); ){// usrStr +=it.next().toString();// } return usrStr; }}
方式2的controller示例代码:
package com.data.custom;import org.springframework.stereotype.Controller;import org.springframework.web.bind.annotation.ModelAttribute;import org.springframework.web.bind.annotation.RequestMapping;import org.springframework.web.bind.annotation.RequestMethod;import org.springframework.web.bind.annotation.ResponseBody;import javax.servlet.http.HttpServletRequest;import java.util.Iterator;import java.util.List;@Controllerpublic class ManyUserHandlerMethodArgumentController { @RequestMapping(value = "/data/manyUser",method = RequestMethod.GET) public @ResponseBody String manyUser(@ManyUser List<User> users){ System.out.println("tsuhlfsfbnm,.'/" + ""); String usrStr = "feikong"; //java中遍历ArrayList的三种方式。 for(int i=0 ;i<users.size();i++){ usrStr += users.get(i).toString(); }// for(User u: users){// usrStr += u.toString();// }// for(Iterator<User> it = users.iterator(); it.hasNext(); ){// usrStr +=it.next().toString();// } return usrStr; }}
方式1的GET请求示例代码:
<a id="manyUser" class="textLink" href="<c:url value="/data/manyUser" />">ManyUser</a>
方式2的GET请求示例代码:
<a id="manyUser" class="textLink" href="<c:url value="/data/manyUser?names=lyncc,fly,ted&ids=1,2,3" />">ManyUser</a>
写完之后还要进行配置:
<!--SpirngMVC配置文件--> <mvc:annotation-driven enable-matrix-variables="true"> <mvc:argument-resolvers> <bean class="com.data.custom.ManyUserHandlerMethodArgumentResolver"/> </mvc:argument-resolvers> </mvc:annotation-driven>
阅读全文
0 0
- Spring MVC 自定义数据绑定---HandlerMethodArgumentResolver
- Spring MVC自定义数据绑定--HandlerMethodArgumentResolver
- Spring MVC系列(五)之自定义数据绑定---HandlerMethodArgumentResolver
- 自定义数据绑定---HandlerMethodArgumentResolver
- spring mvc 自定义HandlerMethodArgumentResolver
- 使用HandlerMethodArgumentResolver接口自定义Spring MVC的参数接受规则
- spring mvc数据绑定
- spring mvc数据绑定
- spring mvc数据绑定
- Spring MVC 数据绑定
- Spring MVC-数据绑定
- Spring MVC 自定义数据绑定 报http 406错误
- SpringMVC 使用HandlerMethodArgumentResolver自定义解析器实现请求数据绑定方法入参
- Spring MVC数据绑定大全
- Spring MVC数据绑定大全
- Spring MVC数据绑定大全
- Spring MVC数据绑定大全
- Spring MVC数据绑定大全
- 正在进行的激光雷达“世界大战”中,Axetomahawk先行一步
- 12月6日
- 编译原理——词法分析
- Java调用jama实现矩阵运算
- 数据结构实验之图论十:判断给定图是否存在合法拓扑序列
- Spring MVC自定义数据绑定--HandlerMethodArgumentResolver
- Java之二元运算
- 【每日一题(14)】函数F(x) HRBUST
- linux-命令sed 使用技巧
- Django-模型
- 安卓简易理财
- 169. Majority Element
- html 标签a 如何跳出iframe
- 2017.12.05 Linux文件编程