javaweb实现自动将前端的属性值(HttpServletRequest)转化为后台对应的实体类

来源:互联网 发布:三维建模渲染软件 编辑:程序博客网 时间:2024/06/01 08:03

通常我们在后台需要获取前端的属性值的时候用到的是request.getParameter("xxx");

下面的方法将实现自动将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);使用到时间工具类,请参考我的另一篇博客http://blog.csdn.net/bq1073100909/article/details/49472615

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格式才能被识别            //请参考我的另一篇博客http://blog.csdn.net/bq1073100909/article/details/49472615            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;    }}


0 0