链接地址: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