`

从request中获取值填充bean对象

阅读更多
import java.lang.reflect.Field;
import java.math.BigDecimal;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;
import javax.servlet.http.HttpServletRequest;

import org.apache.log4j.Logger;

/**
 * <strong>封装数据类</strong>
 * <p>
 * 从request中获取值填充bean对象。
 * 相应功能struts中已经实现,建议使用struts进行页面到Form的处理。
 * </p>
 *
 */
public class BeanUtil {
	private static final Logger log = Logger.getLogger(BeanUtil.class);
    /**
     * 从request中获取值填充bean对象
     *
     * @param objClass bean的类
     * @param request 请求对象
     * @return object对象
     */
    public static Object fillBean(Class objClass, HttpServletRequest request) {
        Object objInstance = null;
        try {
            objInstance = objClass.newInstance();
        } catch (InstantiationException e1) {
        	log.error(e1.getMessage(), e1);	
        } catch (IllegalAccessException e1) {
        	log.error(e1.getMessage(), e1);	
        }

        Field field;
        String fieldName;
        String fieldValue = "";
        int len;
        len = objClass.getDeclaredFields().length;
        for (int i = 0; i < len; i++) {
            field = objClass.getDeclaredFields()[i];
            fieldName = field.getName();

            try {
                fieldValue = request.getParameter(fieldName);
            } catch (Exception e1) {
            	log.error(e1.getMessage(), e1);	
            }

            if (fieldValue != null) {
                try {
                    setFieldValue(field, objInstance, fieldValue);
                } catch (IllegalAccessException e) {
                	log.error(e.getMessage(), e);	
                }
            }
        }
        objClass = objClass.getSuperclass();
        return objInstance;
    }

    /**
     * 将数据赋值给指定对象的相应属性
     *
     * @param field 字段
     * @param objInstance 指定对象
     * @param value 数据
     * @throws IllegalAccessException
     */
    private static void setFieldValue(Field field, Object objInstance, String value) throws IllegalAccessException {
        String fieldType = field.getType().getName();// 取字段的数据类型
        field.setAccessible(true);
        try {
            if (fieldType.equals("java.lang.String")) {
                field.set(objInstance, value);
            } else if (fieldType.equals("java.lang.Integer") || fieldType.equals("int")) {
                field.set(objInstance, Integer.valueOf(value));
            } else if (fieldType.equals("java.lang.Long") || fieldType.equals("long")) {
                field.set(objInstance, Long.valueOf(value));
            } else if (fieldType.equals("java.lang.Float") || fieldType.equals("float")) {
                field.set(objInstance, Float.valueOf(value));
            } else if (fieldType.equals("java.lang.Double") || fieldType.equals("double")) {
                field.set(objInstance, Double.valueOf(value));
            } else if (fieldType.equals("java.math.BigDecimal")) {
                field.set(objInstance, new BigDecimal(value));
            } else if (fieldType.equals("java.util.Date")) {
                SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd");
                formatter.setLenient(false);
                field.set(objInstance, formatter.parse(value));
            } else if (fieldType.equals("java.sql.Date")) {
                SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd");
                formatter.setLenient(false);
                Date date = formatter.parse(value);
                field.set(objInstance, new java.sql.Date(date.getTime()));
            } else if (fieldType.equals("java.lang.Boolean") || fieldType.equals("boolean")) {
                field.set(objInstance, Boolean.valueOf(value));
            } else if (fieldType.equals("java.lang.Byte") || fieldType.equals("byte")) {
                field.set(objInstance, Byte.valueOf(value));
            } else if (fieldType.equals("java.lang.Short") || fieldType.equals("short")) {
                field.set(objInstance, Short.valueOf(value));
            }
        } catch (NumberFormatException ex) {
            // field.set(objInstance, null); 当使用简单数据类型会抛出异常
        	log.error(ex.getMessage(), ex);	
        } catch (ParseException e) {
        	log.error(e.getMessage(), e);	
            field.set(objInstance, null);
        } catch (Exception e) {
        	log.error(e.getMessage(), e);	
            field.set(objInstance, null);
        }
    }
}




import java.beans.PropertyDescriptor;
import java.text.SimpleDateFormat;
import java.util.Collection;

import org.apache.commons.beanutils.PropertyUtils;
import org.apache.log4j.Logger;

/**
 * <strong>复制处理类</strong>
 */
public class CopyUtil {
    private static final Logger log = Logger.getLogger(CopyUtil.class.getName());

    /**
     * 复制orig属性值赋值给dest
     * <p>
     * 满足如下条件时进行复制处理:
     * (1) dest与orig的属性名称相同;
     * (2) dest与orig的属性类型相同;
     * (3) dest的属性类型不为Class;
     * (4) orig属性类型不是Collection或者不是Collection的超类或接口;
     * </p>
     *
     * @param dest 目标对象
     * @param orig 源对象
     * @return 如果dest或者orig为null则返回null/如果发生异常返回null/否则返回复制填充后的dest
     */
    public static Object copyProperties(Object dest, Object orig) {
        if (dest == null || orig == null) {
            return dest;
        }
        PropertyDescriptor[] destDesc = PropertyUtils.getPropertyDescriptors(dest);
        try {
            for (int i = 0; i < destDesc.length; i++) {
                Class destType = destDesc[i].getPropertyType();
                Class origType = PropertyUtils.getPropertyType(orig, destDesc[i].getName());
                if (destType != null && destType.equals(origType) && !destType.equals(Class.class)) {
                    if (!Collection.class.isAssignableFrom(origType)) {
                        try {
                            Object value = PropertyUtils.getProperty(orig, destDesc[i].getName());
                            PropertyUtils.setProperty(dest, destDesc[i].getName(), value);
                        } catch (Exception ex) {
                            log.error("copyProperties(Object dest, Object orig)循环中异常。", ex);
                        }
                    }
                }
            }

            return dest;
        } catch (Exception ex) {
            log.error("copyProperties(Object dest, Object orig)异常。", ex);
            return null;
        }
    }

    /**
     * 复制orig属性值赋值给dest
     * <p>
     * 除了将String的值转换为java.util.Date的处理外,其他处理方式同copyProperties(Object dest, Object orig)。
     * 最常用在将页面的查询条件(Form)转换为DTO进行数据库查询的处理。
     * </p>
     *
     * @param dest 目标对象
     * @param orig 源对象
     * @return 如果dest或者orig为null则返回null/如果发生异常返回null/否则返回复制填充后的dest
     */
    public static Object copyPropertiesSpecialOfStringToDate(Object dest, Object orig) {
        if (dest == null || orig == null) {
            return dest;
        }
        PropertyDescriptor[] destDesc = PropertyUtils.getPropertyDescriptors(dest);
        try {
            for (int i = 0; i < destDesc.length; i++) {
                Class destType = destDesc[i].getPropertyType();
                Class origType = PropertyUtils.getPropertyType(orig, destDesc[i].getName());
                if (destType != null && origType != null && !destType.equals(Class.class)) {
                    if (origType.equals(destType)) {
                        if (!Collection.class.isAssignableFrom(origType)) {
                            try {
                                Object valueOrig = PropertyUtils.getProperty(orig, destDesc[i].getName());
                                PropertyUtils.setProperty(dest, destDesc[i].getName(), valueOrig);
                            } catch (Exception ex) {
                                log.error("copyPropertiesSpecialOfStringToDate循环中异常-1。", ex);
                                PropertyUtils.setProperty(dest, destDesc[i].getName(), null);
                            }
                        }
                    } else if (destType.equals(java.util.Date.class) && origType.equals(String.class)) {
                        SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd");
                        try {
                            String valueOrig_string = (String) PropertyUtils.getProperty(orig, destDesc[i].getName());
                            if (valueOrig_string != null && valueOrig_string.trim().length() > 0) {
                                PropertyUtils.setProperty(dest, destDesc[i].getName(), format.parse(valueOrig_string));
                            } else {
                                PropertyUtils.setProperty(dest, destDesc[i].getName(), null);
                            }
                        } catch (Exception e) {
                            log.error("copyPropertiesSpecialOfStringToDate循环中异常-2。", e);
                            PropertyUtils.setProperty(dest, destDesc[i].getName(), null);
                        }
                    }
                }
            }
            return dest;
        } catch (Exception e) {
            log.error("copyPropertiesSpecialOfStringToDate异常。", e);
            return null;
        }
    }

    /**
     * 复制orig中指定的属性值赋值给dest
     * <p>
     * 除了指定属性名称数组外,其他处理方式同copyProperties(Object dest, Object orig)。
     * </p>
     *
     * @param dest
     * @param orig
     * @param ignores
     * @return
     */
    public static Object copyProperties(Object dest, Object orig, String[] ignores) {
        if (dest == null || orig == null) {
            return dest;
        }

        PropertyDescriptor[] destDesc = PropertyUtils.getPropertyDescriptors(dest);
        try {
            for (int i = 0; i < destDesc.length; i++) {

                if (contains(ignores, destDesc[i].getName())) {
                    continue;
                }

                Class destType = destDesc[i].getPropertyType();
                Class origType = PropertyUtils.getPropertyType(orig, destDesc[i].getName());

                if (destType != null && destType.equals(origType) && !destType.equals(Class.class)) {
                    if (!Collection.class.isAssignableFrom(origType)) {
                        Object value = PropertyUtils.getProperty(orig, destDesc[i].getName());
                        PropertyUtils.setProperty(dest, destDesc[i].getName(), value);
                    }
                }
            }

            return dest;
        } catch (Exception ex) {
            return null;
        }
    }

    /**
     * 属性名称数组中是否存在指定的属性
     *
     * @param ignores 属性名称数组
     * @param name 指定的属性名称
     * @return 如果存在则返回true/否则返回false
     */
    static boolean contains(String[] ignores, String name) {
        boolean ignored = false;
        for (int j = 0; ignores != null && j < ignores.length; j++) {
            if (ignores[j].equals(name)) {
                ignored = true;
                break;
            }
        }
        return ignored;
    }
}



CopyUtil.copyProperties(userManagerDTO, initUserForm);

TaskDTO task = (TaskDTO) BeanUtil.fillBean(TaskDTO.class, request);
分享到:
评论

相关推荐

    在 JSP/Servlet 中使用 Bean 自动属性填充机制

    在Servlet中,我们可以使用`request.getParameter()`方法获取请求参数,然后通过Bean的setter方法将这些参数值设置到Bean中。在JSP中,我们可以通过以下方式实现自动属性填充: ```jsp *" /&gt; ``` 这里的`...

    验证ActionForm存到了request中

    在上述代码中,`mapping.findFormBean()`是根据配置文件中的form-bean元素查找ActionForm,而`request.getAttribute()`则是直接从请求对象中获取ActionForm。如果ActionForm已存在于request中,这两个方法都将返回...

    第四章 在Ioc容器中装配Bean

    在Spring框架中,Bean装配是指Spring容器将应用程序中的对象进行实例化、配置以及组装的过程。这涉及到依赖注入的概念,即容器负责将依赖关系注入到对象中,而不需要对象自己去创建或者查找这些依赖关系。 首先,...

    jsp中用集合收集数据并填充BeanForm

    4. 创建BeanForm的实例,并使用`MyArrayList`中的数据来填充Bean的属性。这可以通过反射API完成,也可以根据Bean的属性名直接设置值。 5. 最后,使用填充好的BeanForm对象进行业务逻辑处理,如数据库操作。 总的来...

    00000030_bean-page的用法.rar

    Controller可以创建并填充Model对象,这个Model对象就是一组Bean的集合,然后将Model传递给View(通常是JSP页面)。在View中,可以使用Spring的Thymeleaf或其他模板引擎来方便地访问和显示Bean的属性。 总的来说,...

    java+bean分页技术

    Java Bean在IT行业中被广泛用于封装业务逻辑和数据,它为Java Server Pages(JSP)提供了数据模型。在本主题“java + bean 分页技术”中,我们将深入探讨如何利用Java Bean实现高效的分页功能,这在处理大量数据时...

    struts中数据在action与jsp中的传递总结.pdf

    Struts 中数据在 Action 与 JSP 中的传递总结 Struts 框架中,数据在 Action 与 JSP 之间...所以这时候,JSP 页面 &lt;html:text&gt; 在这个本来该是 FormBean 的假 Bean 中找到了合适的匹配对象,从而歪打正着的成功显示。

    Java Spring Controller 获取请求参数的几种方法详解

    这样,Spring会自动将请求参数值填充到Bean对象中。 4. **使用@ModelAttribute注解** 对于POST请求,`@ModelAttribute`注解可以用来将请求的FORM表单数据绑定到一个对象上,该对象通常是Bean: ```java @...

    Java ssm 面试题.docx

    3. **属性注入**:Spring使用依赖注入(Dependency Injection,DI)填充Bean对象的属性。 4. **调用Aware接口**:如果Bean实现了如BeanNameAware、ApplicationContextAware等接口,Spring会回调这些接口的方法。 5. ...

    springMVC注解大全

    在方法参数前加上此注解,Spring MVC会尝试从请求中获取数据填充模型对象。 7. `@ResponseBody`:这个注解告诉Spring MVC,方法的返回值应直接写入HTTP响应体,而不是寻找一个视图进行渲染。通常用于返回JSON或XML...

    JSP登录1[servlet+bean].rar

    `request.getParameter()`方法用于读取POST请求中的数据。 6. **数据库操作** 身为一个登录系统,通常需要与数据库交互来验证用户凭证。这通常涉及SQL查询,如SELECT语句,用于查找匹配的用户名和密码。数据库连接...

    SpringMVC中注解的详细使用

    8. `@ModelAttribute`:用于从请求参数或模型中获取或填充数据到一个对象。在表单提交场景中,它能方便地将表单数据绑定到一个Java Bean。 9. `@SessionAttributes`:标记需要存储在HTTP Session中的属性。这些属性...

    Beanutils基本用法.doc

    此段代码首先从`HttpServletRequest`对象中获取参数名称,并将参数名称和对应的值存储在一个`HashMap`中。然后,调用`BeanUtils.populate()`方法将这些值填充到Bean中。`BeanUtils`内部会调用`Converter`来处理类型...

    struts常见错误以及解决

    如果Action执行后没有正确地将数据放入request域,那么在JSP页面中尝试通过`request.getAttribute()`获取数据时就会出现问题。 - **解决方案:** - 确保Action中的数据已经通过`request.setAttribute()`正确设置...

    Spring系列面试题129道(附答案解析)

    Spring bean是存储在Spring IoC容器中的Java对象,可以通过容器来配置和管理。 18、spring提供了哪些配置方式? Spring提供了以下配置方式: - 基于XML的配置 - 基于注解的配置 - 基于Java类的配置 19、spring支持...

    springMVC框架

    这是因为SpringMVC会根据这些名字匹配并自动填充Bean的属性。 3. **Bean绑定**:`@ModelAttribute`注解用于在请求处理方法中创建或查找一个Bean,并将请求参数绑定到Bean的属性上。例如,如果你有一个名为`User`的...

    自动装配Beanutils.zip

    // 现在,user对象已经被填充了前端传递的值 } ``` BeanUtils的`copyProperties()`方法会遍历请求参数,尝试找到与Java Bean属性匹配的方法(setter方法),然后调用这些方法将值注入到对应的属性中。这个过程就是...

    JavaWeb程序设计入门课件BeanUtils工具共6页

    例如,我们可以创建一个UserBean类,然后直接用`BeanUtils.populate()`方法将请求参数填充到这个bean中: ```java UserBean user = new UserBean(); try { ServletRequest request = ...; // 获取请求对象 ...

Global site tag (gtag.js) - Google Analytics