Java反射获取Request请求中的参数并封装到指定的JavaBean

    链接地址:http://www.xx566.com/detail/156.html

    上一篇,Java反射解析XML字符串并封装到指定的JavaBean中, 我们介绍了在使用第三方接口时经常需要用到的一些XML工具方法,能够方便的解析和处理接口返回的xml信息,我们知道在接口的调用中,经常也需要用到回 调地址,我们经常需要提供接口用于接口地址的回调,我们也需要处理接口的request请求,获取相应的返回信息,用于业务逻辑的处理,本篇,我们就简单 的整理一下利用Java反射,获取Request请求中的参数并封装到指定的Java对象中。

 

    本篇中设计的方法相对比较简单,同时使用了EasyMock模拟request请求(更多Easymock,请参阅:EasyMock 使用方法与原理剖析),所以我们通过代码的示例来学习,如下:

package javase.reflect;
 
import org.easymock.EasyMock;
import org.junit.Test;
 
import javax.servlet.http.HttpServletRequest;
import java.lang.reflect.Field;
import java.lang.reflect.Method;
import java.util.HashMap;
import java.util.Map;
import java.util.Set;
 
import static org.hamcrest.core.Is.is;
import static org.junit.Assert.assertThat;
 
/**
 * Java反射获取Request请求中的参数并封装到指定的JavaBean
 * User: Realfighter
 * Date: 2014/11/2
 * Time: 11:32
 */
public class RequestToJavaBean {
 
    @Test
    public void testRequestToJavaBean() {
        //创建Mock对象
        final HttpServletRequest request = EasyMock.createMock(HttpServletRequest.class);
        //设定Mock对象的预期行为和输出
//        EasyMock.expect(request.getParameter("name")).andReturn("Realfighter");
        EasyMock.expect(request.getParameterMap()).andReturn(new HashMap(){
            {
                put("name","Realfighter");
                put("sex","male");
            }
        });
        //将Mock对象切换到Replay状态
        EasyMock.replay(request);
        //到这里,我们已经“录制”了一个request对象
        JavaBean javaBean = (JavaBean) packReturnByRequest(request, new JavaBean());
        assertThat(javaBean.getName(), is("Realfighter"));
        assertThat(javaBean.getSex(), is("female"));//Expected :female Actual :male
    }
 
    class JavaBean {
        String name; //姓名
        String sex;  //性别
 
        public String getName() {
            return name;
        }
 
        public void setName(String name) {
            this.name = name;
        }
 
        public String getSex() {
            return sex;
        }
 
        public void setSex(String sex) {
            this.sex = sex;
        }
    }
 
    /**
     * 把request中的参数封装到指定的bean中
     *
     * @param request
     * @param obj
     * @return Object
     * @throws
     * @Title: packReturnByRequest
     * @author Realfighter
     */
    public static Object packReturnByRequest(HttpServletRequest request,
                                             Object obj) {
        Map<String, Object> keyMap = findKeyMapByRequest(request);
        Field field = null;
        Set<String> keys = keyMap.keySet();
        for (String key : keys) {
            try {
                field = obj.getClass().getDeclaredField(key);
                Class<?> beanType = field.getType();
                Object value = keyMap.get(key);
                String setMethodName = "set"
                        + key.substring(0, 1).toUpperCase() + key.substring(1);
                Method m;
                m = obj.getClass().getMethod(setMethodName, beanType);
                m.invoke(obj, value);
            } catch (Exception e1) {
                continue;
            }
        }
        return obj;
    }
 
    /**
     * 把request里面的参数转化成map
     *
     * @param request
     * @return Map<String,Object>
     * @throws
     * @Title: findKeyMapByRequest
     * @author Realfighter
     */
    private static Map<String, Object> findKeyMapByRequest(
            HttpServletRequest request) {
        //以下两种方式获取参数的map集合
        return request.getParameterMap();
//        Map<String, Object> keyMap = new HashMap<String, Object>();
//        Enumeration<?> enu = request.getParameterNames();
//        while (enu.hasMoreElements()) {
//            String paramname = (String) enu.nextElement();
//            String paramvalue = request.getParameter(paramname);
//            keyMap.put(paramname, paramvalue);
//        }
//        return keyMap;
    }
 
}

    总结:我们使用EasyMock模拟了Request,Request中包含了姓名和性别的信息,我们通过request.getParameterMap()获取到所有Request中的参数信息,并通过反射技术将信息封装到相应的JavaBean中,进而通过JavaBean提供的get方法,获取相应属性的值。在现实的工作中,Request中的信息,我们也可以通过findKeyMapByRequest方法中注释掉的部分进行处理。

 

    源码地址:http://git.oschina.net/realfighter/xx566-diary/blob/master/src/javase/reflect/RequestToJavaBean.java

你可能感兴趣的:(java,反射,解析,request)