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>