欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

Spring MVC自定义数据绑定--HandlerMethodArgumentResolver

程序员文章站 2022-07-15 13:26:49
...

参考资料: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>