文档章节

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

指尖残雪
 指尖残雪
发布于 2016/05/22 23:57
字数 868
阅读 10
收藏 0

通常我们在后台需要获取前端的属性值的时候用到的是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;
    }
}


本文转载自:http://blog.csdn.net/bq1073100909/article/details/49494951

共有 人打赏支持
指尖残雪
粉丝 7
博文 73
码字总数 0
作品 0
上海
后端工程师
在Java开源王国中自由翱翔

在如今的Java领域,各种新技术,新工具层出不穷,一方面,每一种技术都会不停的升级换代,另一方面,还会不断涌现出新的技术和工具。Java世界就像小时候玩的万花筒,尽管实质上只是由几个普通...

孙卫琴
2007/02/10
0
0
springmvc bean 获取date 爆400解决方式

@RequestMapping("save") @ResponseBody public Result save(HttpServletRequest request,HttpServletResponse response,ScorePo scorePo) throws Exception{ 类似这样的,如果前端 form 表单......

之渊
2016/11/27
326
0
spring jpa之实体属性类型转换器AttributeConverter

1、介绍接口AttributeConverter<x, y> 此接口用于转化实体属性的,但id属性和关系属性不可用。它有两个方法: 1、y convertToDatabaseColumn(x) 作用:将实体属性x转化为y存储到数据库中,即...

墨衣夜行
2015/11/01
0
3
Java程序员从笨鸟到菜鸟之(四十三)细谈struts2(六)获取servletAPI和封装表单数据

本文来自:曹胜欢博客专栏。转载请注明出处:http://blog.csdn.net/csh624366188 一:获取servletAPI的三种方法 在传统的Web开发中,经常会用到Servlet API中的HttpServletRequest、HttpSes...

长平狐
2012/11/12
193
0
在EF中使用Expression自动生成p=>new Entity(){X="",Y="",..}格式的Lambda表达式灵活实现按需更新

一、基本介绍 回忆:最早接触Expression是在学校接触到EF的时候,发现where方法里的参数是Expression>这么一个类型,当初也只是看到了,也没有过多的去探究,只是知道传入lambda表达式使用即...

含光君
09/26
0
0

没有更多内容

加载失败,请刷新页面

加载更多

laravel 微信支付

1.composer加载laravel微信支付第三方文件 composer require "overtrue/laravel-wechat:~4.0" composer require simplesoftwareio/simple-qrcode 1.3.* //composer生成二维码文件 2.改confi......

vio小黑
29分钟前
1
0
学习设计模式——抽象工厂模式

1. 认识抽象工厂模式 1. 定义:提供一个创建一系列相关或互相依赖的对象的接口,而无需指定它们具体的类。 2. 组成结构: AbstractFactory:抽象工厂类,定义创建一系列对象的操作接口 Fact...

江左煤郎
29分钟前
2
0
ES6的let块级作用域和变量不可提升导致一个比较容易出现的错误

今天在写NodeJS代码的时候出现一个变量一直提示未定义,简化后的代码如下: let param = 1;{ console.log(param);} 就在想,不至于啊。不是继承上层的声明吗? 继续看下去,发现原来...

MKjy
36分钟前
2
0
50:nginx访问日记|日记切割|静态文件不记录日记和过期时间

1、nginx访问日记: 日记格式:在主配置文件nginx.conf里搜索log_format; [root@localhost_001 conf]# vim nginx.conflog_format combined_realip '$remote_addr $http_x_forwarded_for ......

芬野de博客
39分钟前
1
0
前后端正常交互的流程

1、评审阶段:产品召集前后端进行需求评审,前后端各自捋清楚自己的业务量以及联调之间工作量,从而进行开发时间评估。 2、开发准备阶段:前后端一起商量需求中需要联调的部分,进行接口的口...

Jack088
40分钟前
1
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部