文档章节

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

指尖残雪
 指尖残雪
发布于 2016/05/22 23:57
字数 868
阅读 9
收藏 0
点赞 2
评论 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

struts2简单使用

本来想先写一下JAVA的反射机制的,整了两天,感觉没整出个简单和思路出来,想来,算了,后面再整吧。想想,今天在支持使用Struts2框架开发的时候,发现基本的使用还是有些生疏,还是先小结一...

守望者-圣堂刺客 ⋅ 2013/08/02 ⋅ 2

springmvc bean 获取date 爆400解决方式

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

之渊 ⋅ 2016/11/27 ⋅ 0

spring jpa之实体属性类型转换器AttributeConverter

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

墨衣夜行 ⋅ 2015/11/01 ⋅ 3

Java程序员从笨鸟到菜鸟之(四十三)细谈struts2(六)获取servletAPI和封装表单数据

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

长平狐 ⋅ 2012/11/12 ⋅ 0

ActionContext和ServletActionContext的区别

什么是MVC 1.Model模型 模型的职责是负责业务逻辑,包含两部分:业务数据和业务处理逻辑.比如实体类, DAO,Service都属于模型层 2.View视图 视图的职责是显示界面和用户交互(收集用户信息)...

architect刘源源 ⋅ 05/07 ⋅ 0

Spring-boot常用注解整理

1、@SpringBootApplication 主类(入口类)的注解。(@Configuration,@EnableAutoConfiguration , @ComponentScan) 2、@Repository DAO层注解,DAO层中接口继承JpaRepository,需要在build...

Timor_张先生 ⋅ 2017/11/10 ⋅ 0

SpringMvc笔记

springMVC简介 是MVC框架,和Spring无缝连接。 第1讲:环境搭建 环境搭建都是从web.xml开始。 核心控制器DispacherServlet 说明:web.xml文件中,配置一个核心的servlet 1.在这之前要先拷贝j...

hebinteng ⋅ 2017/10/21 ⋅ 0

2.osframe框架开发说明书

开源项目名称: osframe管理系统 托管地址: http://git.oschina.net/haizicq/osframe 主要技术: spring mvc、spring、hibernate、angular js、seajs、bootstrap、shiro 框架介绍: 本框架是...

王春-海子 ⋅ 2016/06/28 ⋅ 1

Java的封装类型和原始类型的区别?哪种更好?

Java的封装类型和原始类型的区别?在JavaWeb程序当中,pojo(javabean)实体类中,是声明为封装类型好还是原始类型好?(比如:int-Integer) 例如: public class User{ private int id; pri...

帐号以作废 ⋅ 2014/04/11 ⋅ 7

没有更多内容

加载失败,请刷新页面

加载更多

下一页

Spring Cloud构建微服务架构—创建“服务注册中心”

创建一个基础的Spring Boot工程,命名为eureka-server,并在pom.xml中引入需要的依赖内容: <parent><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-par......

itcloud ⋅ 22分钟前 ⋅ 0

拖动

<!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title>event</title> <style> #box { width: 100px; height: 100px; background-color: aquamarine; position: absolute; } </style......

fyliujj ⋅ 24分钟前 ⋅ 0

es6 polyfill array

polyfill之javascript函数的兼容写法——Array篇 1. Array.isArray(obj) if (!Array.isArray) { Array.isArray = function(arg) { return Object.prototype.toString.call(arg) === '[objec......

球球 ⋅ 26分钟前 ⋅ 0

kibana启动异常

检查一下:kibana.yml 每一对key:value中,冒号之后应有空格。

增删改查1 ⋅ 28分钟前 ⋅ 0

js修改img的src属性刷新图片时的图片缓存问题

问题:上传一张图片,通过js更新src属性刷新图片使其即时显示时, 当img的src当前的url与上次地址无变化时(只更改图片,名称不变,不同图片名称相同)图片不变化(仍显示原来的图片) 但通过...

HaierBrother ⋅ 28分钟前 ⋅ 0

Mysql

1.Jdbc Url 设置allowMultiQueries为true和false mysql的批量更新是要我们主动去设置的, 就是在数据库的连接url上设置一下,加上* &allowMultiQueries=true *即可。 参数名称 参数说明 缺省...

瑟青豆 ⋅ 32分钟前 ⋅ 0

mysql导出导入表结构与数据

当我们需要进行数据迁移时,mysql自带的mysqldump会是最好的方式。 1.导出某张表的结构和数据 首先,我们应当使用服务器,打开终端,连接到所需要导出的表所在的服务器上。执行命令: mysqld...

hengbao5 ⋅ 32分钟前 ⋅ 0

世界杯也走向“比拼”大数据的时代

《日本经济新闻》6月19日报道称,俄罗斯足球世界杯已于6月14日揭开战幕。作为第21次举办的足球世界杯,如何活用大数据有可能成为决定各支球队胜负的重要因素。从对阵球队的分析到战术建议,还...

加米谷大数据 ⋅ 33分钟前 ⋅ 0

金额转为千分制,金额转中文大写

金额转关为大写 /** 数字金额大写转换(可以处理整数,小数,负数) */ function digitUppercase(n){ if(!n) reutrn "" let fraction = ['角', '分']; let digit = [...

YXMBetter ⋅ 35分钟前 ⋅ 0

开发利器JRebel部署SpringBoot项目

不要以为年纪轻轻就跌倒了人生谷底,未来还有更大的下降空间等着你。 idea下载和安装JRebel 激活JRebel 访问https://my.jrebel.com/ 使用facebook或twitter登录 勾选 Build project automati...

郑龙飞 ⋅ 41分钟前 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部