Spring MVC自定义数据绑定--HandlerMethodArgumentResolver
参考资料: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)
@Documented
public @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;
@Controller
public 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;
@Controller
public 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>
上一篇: Redis实现队列监听器订阅数据
下一篇: MyBatis场景问题解决1
推荐阅读
-
Android中 自定义数据绑定适配器BaseAdapter的方法
-
ListView的Adapter使用(绑定数据) 之 自定义每一项的布局去绑定数据
-
.NET Core开发的iNeuOS工业互联平台,升级四大特性:配置数据接口、图元绑定数据、预警配置和自定义菜单
-
ASP.NET MVC中jQuery与angularjs混合应用传参并绑定数据
-
vue在自定义组件中使用v-model进行数据绑定的方法
-
Spring MVC自定义日期类型转换器实例详解
-
angular4自定义组件非input元素实现ngModel双向数据绑定的方法
-
Spring mvc实现Restful返回json格式数据实例详解
-
Spring mvc实现Restful返回xml格式数据实例详解
-
自定义Angular指令与jQuery实现的Bootstrap风格数据双向绑定的单选与多选下拉框