javaweb实现自动将前端的属性值(HttpServletRequest)转化为后台对应的实体类
2015-10-29 18:19
537 查看
通常我们在后台需要获取前端的属性值的时候用到的是request.getParameter("xxx");
下面的方法将实现自动将HttpServletRequest中的值封装到实体类中,需要一定的Java反射技术。
要求:前端form表单中的input标签中name的值是实体类中的属性。这样才能被识别到。
例如:
在JSP中使用如下input:
下面方法中的DateUtil.parseDateDayFormat(value);使用到时间工具类,请参考我的另一篇博客/article/10588558.html
下面的方法将实现自动将HttpServletRequest中的值封装到实体类中,需要一定的Java反射技术。
要求:前端form表单中的input标签中name的值是实体类中的属性。这样才能被识别到。
例如:
在JSP中使用如下input:
<input type="text" name="age" value=""/>在Person.java实体类中有age属性并实现get和set方法,然后在controller(springMVC)层或者action(Structs2)中使用Person person = DTOBuilder.getDTO(request, Person.class);方法就可以自动将input标签age 的值设置到Person实例化对象person中的age属性里。
下面方法中的DateUtil.parseDateDayFormat(value);使用到时间工具类,请参考我的另一篇博客/article/10588558.html
package org.dyb.util; import java.lang.reflect.InvocationTargetException; import java.lang.reflect.Method; import java.math.BigDecimal; import javax.servlet.http.HttpServletRequest; /** * 通过反射技术将HttpServletRequest中的前端属性数据赋值到对应的实体类中,使用或修改本类需要熟悉Java反射技术 * 使用方法:Xxxx为相应的实体类 * DTOBuilder.getDTO(HttpServletRequest, Xxxx.class); */ public class DTOBuilder { /** * 方法入口,得到Dto *@param request *@param dtoClass 传入的实体类 *@return */ public static Object getDTO(HttpServletRequest request, Class dtoClass) { Object dtoObj = null; if ((dtoClass == null) || (request == null)) return dtoObj; try { //实例化对象 dtoObj = dtoClass.newInstance(); setDTOValue(request, dtoObj); } catch (Exception ex) { ex.printStackTrace(); } return dtoObj; } /** * 保存数据 *@param request *@param dto *@throws Exception */ public static void setDTOValue(HttpServletRequest request, Object dto) throws Exception { if ((dto == null) || (request == null)) return; //得到类中所有的方法 基本上都是set和get方法 Method[] methods = dto.getClass().getMethods(); for (int i = 0; i < methods.length; i++) { try { //方法名 String methodName = methods[i].getName(); //方法参数的类型 Class[] type = methods[i].getParameterTypes(); //当时set方法时,判断依据:setXxxx类型 if ((methodName.length() > 3) && (methodName.startsWith("set")) && (type.length == 1)) { //将set后面的大写字母转成小写并截取出来 String name = methodName.substring(3, 4).toLowerCase() + methodName.substring(4); Object objValue = getBindValue(request, name, type[0]); if (objValue != null) { Object[] value = { objValue }; invokeMothod(dto, methodName, type, value); } } } catch (Exception ex) { throw ex; } } } /** * 通过request得到相应的值 *@param request HttpServletRequest *@param bindName 属性名 *@param bindType 属性的类型 *@return */ public static Object getBindValue(HttpServletRequest request, String bindName, Class bindType) { //得到request中的值 String value = request.getParameter(bindName); if (value != null) { value = value.trim(); } return getBindValue(value, bindType); } /** * 通过调用方法名(setXxxx)将值设置到属性中 *@param classObject 实体类对象 *@param strMethodName 方法名(一般都是setXxxx) *@param argsType 属性类型数组 *@param args 属性值数组 *@return *@throws NoSuchMethodException *@throws SecurityException *@throws IllegalAccessException *@throws IllegalArgumentException *@throws InvocationTargetException */ public static Object invokeMothod(Object classObject, String strMethodName, Class[] argsType, Object[] args) throws NoSuchMethodException, SecurityException, IllegalAccessException, IllegalArgumentException, InvocationTargetException { //得到classObject这个类的方法 Method concatMethod = classObject.getClass().getMethod(strMethodName, argsType); //调用方法将classObject赋值到相应的属性 return concatMethod.invoke(classObject, args); } /** * 根据bindType类型的不同转成相应的类型值 *@param value String类型的值,要根据bindType类型的不同转成相应的类型值 *@param bindType 属性的类型 *@return */ public static Object getBindValue(String value, Class bindType) { if ((value == null) || (value.trim().length() == 0)) return null; String typeName = bindType.getName(); //依次判断各种类型并转换相应的值 if (typeName.equals("java.lang.String")) return value; if (typeName.equals("int")) return new Integer(value); if (typeName.equals("long")) return new Long(value); if (typeName.equals("boolean")) return new Boolean(value); if (typeName.equals("float")) return new Float(value); if (typeName.equals("double")) return new Double(value); if (typeName.equals("java.math.BigDecimal")) { if ("NaN.00".equals(value)) return new BigDecimal("0"); return new BigDecimal(value.trim()); } if (typeName.equals("java.util.Date")) //参考DateUtil.parseDateDayFormat方法,value如果是时间类型,必须是yyyy-MM-dd格式才能被识别 //请参考我的另一篇博客/article/10588558.html return DateUtil.parseDateDayFormat(value); if (typeName.equals("java.lang.Integer")) return new Integer(value); if (typeName.equals("java.lang.Long")) { return new Long(value); } if (typeName.equals("java.lang.Boolean")) { return new Boolean(value); } return value; } }
相关文章推荐
- 解决SQL Server Always 日志增大的问题-摘自网络
- httpclient用法
- 三公网络监督平台APP上线,源代码出售。
- 在没有网络的情况下用安卓手机和数据线让台式电脑上网
- C# 中使用WebClient 请求 https
- 第七章 设计程序架构 之 设计HTTP模块和处理程序
- codeforce 589F(二分 +(贪心 or 网络流))
- angular 采用$http 上传file spring 提示找不到boundary
- The superclass "javax.servlet.http.HttpServlet" was not found on the Java Build Path
- HTTP协议基础
- TCP/IP、Http、Socket的区别
- SCNetworkReachability 说明使用
- HttpClient请求,服务端收到乱码
- net-snmp配置文件snmp.conf
- Android中实现进入App之后检查网络状态
- 简单区分Vmware的三种网络连接模式(bridged、NAT、host-only)
- HTTP报文内的HTTP信息之获取部分内容的范围请求
- 神经网络模型符号解释!!!蛮重要的,记不住的可以参考下。
- 网络爬虫-理解
- IOS Android Tomcat SSL双向认证HTTPS访问