基于表单数据的封装,泛型,反射以及使用BeanUtils进行处理
在Java Web开发过程中,会遇到很多的表单数据的提交和对表单数据的处理。而每次都需要对这些数据的字段进行一个一个的处理就显得尤为繁琐,在Java语言中,面向对象的存在目的便是为了消除重复代码,减少我们程序员的负担。因此,在这里和大家分享一下我学到的一个小技巧。
对于封装
这里说的“封装”,是指将从客户端提交的表单数据封装到一个bean层entitry中。这样可以方便对数据的处理。下面就来看一个具体的bean实例化的小例子吧。
比如说我们从网页上获得用户的登录信息,一般来说是用户名和密码信息,因此我们就可以将这两个数据封装到一个bean中。
下面是一个class类:
package beanenclosetest;
public class PersonBean {
private String name;
private String password;
@Override
public String toString() {
return "PersonBean [name=" + name + ", password=" + password + "]";
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
}
这样就可以将数据封装起来了。
泛型处理
这里说的泛型是对于beanUtil层面的数据加工。这样就可以使得其他人在调用该方法时不必再进行强制的类型转换,这样在一定的程度上加强了程序的安全性。比如下面这个代码,就用到了泛型的操作。
package beanenclosetest;
import java.lang.reflect.InvocationTargetException;
import java.util.Enumeration;
import javax.servlet.http.HttpServletRequest;
import org.apache.commons.beanutils.BeanUtils;
public class PersonBeanUtils {
public static <T> T request2Bean(HttpServletRequest request, Class<T> t ){
try {
T bean = t.newInstance();
Enumeration<String> e = request.getParameterNames();
while(e.hasMoreElements()){
String name = (String) e.nextElement();
String value = request.getParameter(name);
BeanUtils.setProperty(bean, name, value);
}
return bean;
} catch (Exception e) {
// TODO Auto-generated catch block
throw new RuntimeException(e);
}
}
}
反射
public static T request2Bean(HttpServletRequest request, Class t ){
try {
T bean = t.newInstance();
}catch(Exception e){
//do something
}
这里面就是用到了反射的操作。通过参数获得一个bean的字节码信息,这里面其实就是一个类的内部的所有信息的实体。
使用BeanUtils
BeanUtils是一个apache开源的一个项目,旨在帮助程序员减轻对字段数据的加工负担。其使用方法非常简单,但是需要注意的是需要commons-logging 包的支持。否则会报出程序的异常错误信息。
如下:
public static <T> T request2Bean(HttpServletRequest request, Class<T> t ){
try {
T bean = t.newInstance();
Enumeration<String> e = request.getParameterNames();
while(e.hasMoreElements()){
String name = (String) e.nextElement();
String value = request.getParameter(name);
BeanUtils.setProperty(bean, name, value);
}
return bean;
} catch (Exception e) {
// TODO Auto-generated catch block
throw new RuntimeException(e);
}
}
这里面的BeanUtils.setProperty(bean,name,value);就是处理方式。是不是很简单啊,通过者一行代码就可以将bean字段的属性信息添加到bean中并返回。
至此,本篇博客的讲解就结束了。下面一起来看一看一个实用的案例吧。
具体的小案例
打开chrome浏览器,输入tomcat服务器上的对应的网址,然后为了更加真实的模仿实际项目中的情景,我们就直接在URL地址上添加parameter吧,如下:
然后打开服务器终端terminal,然后就可以看到如下信息:
由此,我们的这个“基于表单数据的封装,泛型化,反射操作,就完成了。
总结:
- 使用BeanUtils进行操作的时候需要注意对包的处理。
- 反射操作的时候需要注意字节码的转换方式。
- 在静态方法中使用泛型需要进行声明。
- 注意代码逻辑的灵活使用!
基于表单数据的封装,泛型,反射以及使用BeanUtils进行处理的更多相关文章
- 不使用BeanUtils,利用Java反射机制:表单数据自动封装到JavaBean
在百度搜“java反射 将表单数据自动封装到javabean ”,第一页显示的都是一样的代码,都是利用导入第三方jar包<commons-beanutils>和<commons-lo ...
- PoiDocxDemo【Android将表单数据生成Word文档的方案之二(基于Poi4.0.0),目前只能java生成】
版权声明:本文为HaiyuKing原创文章,转载请注明出处! 前言 这个是<PoiDemo[Android将表单数据生成Word文档的方案之二(基于Poi4.0.0)]>的扩展,上一篇是根 ...
- PoiDemo【Android将表单数据生成Word文档的方案之二(基于Poi4.0.0)】
版权声明:本文为HaiyuKing原创文章,转载请注明出处! 前言 使用Poi实现android中根据模板文件生成Word文档的功能.这里的模板文件是doc文件.如果模板文件是docx文件的话,请阅读 ...
- Java——利用反射机制将表单数据自动填充到JavaBean中
以一个案例介绍反射机制的一种常见的使用场景,以及具体实现. 1.本文案例 在编写Java Web应用程序时,使用表单提交数据是一个必不可少的环节,后台对于前台使用表单提交的数据需要能够从请求中解析,并 ...
- Struts2_day02--Struts2封装获取表单数据方式
Struts2封装获取表单数据方式 原始方式获取表单封装到实体类对象 属性封装(会用) 1 直接把表单提交属性封装到action的属性里面 2 实现步骤 (1)在action成员变量位置定义变量 - ...
- 基于Vue的工作流项目模块中,使用动态组件的方式统一呈现不同表单数据的处理方式
在基于Vue的工作流项目模块中,我们在查看表单明细的时候,需要包含公用表单信息,特定表单信息两部分内容.前者表单数据可以统一呈现,而后者则是不同业务的表单数据不同.为了实现更好的维护性,把它们分开作为 ...
- Struts2封装获取表单数据方式
一.属性封装 1.创建User实体类` package cn.entity; public class User { private String username; private String p ...
- FreemarkerJavaDemo【Android将表单数据生成Word文档的方案之一(基于freemarker2.3.28,只能java生成)】
版权声明:本文为HaiyuKing原创文章,转载请注明出处! 前言 这个方案只能在java中运行,无法在Android项目中运行.所以此方案是:APP将表单数据发送给后台,后台通过freemarker ...
- java使用BeanUtils封装file类型表单数据到一个对象中
package com.cc.web.servlet; import java.io.FileOutputStream; import java.io.IOException; import java ...
随机推荐
- python 程序中调用go
虽然python优点很多,但是有一个致命的缺点就是运行速度太慢,那么python程序需要一些计算量比较大的模块时一般会调用c或者c++的代码来重写,但是c/c++编写代码代价太高,耗费太多的人力.那么 ...
- log4j不生成日志文件的问题
直接看我的注解吧 注意地址的斜杠,还有地址别写什么相对地址了,这包太老了,服务器update一下兼容问题就出来了. #第一个参数定义达到什么程度就输出 第二第三....第N 定义输出的类型 #debu ...
- 浅谈Log4net在项目中如何记录日志
一 引入背景 在软件开发周期中,无论是开发中,或是测试中,或是上线后,选择合适的工具监控程序的运行状态至关重要,只有如此,才能更好地排查程序问题和检测程序性能问题等.本篇文章主要与大家分享,如何 ...
- spark学习笔记01
spark学习笔记01 1.课程目标 1.熟悉spark相关概念 2.搭建一个spark集群 3.编写简单spark应用程序 2.spark概述 spark是什么 是基于内存的分布式计算引擎,计算速度 ...
- c++ 隐藏
子类中写了一个与从父类中继承下来的方法名同名的方法 子类对象.方法(); //调用子类中定义的方法 父类对象.方法(); / ...
- Codeforces Round #305 (Div. 2) B. Mike and Fun 暴力
B. Mike and Fun Time Limit: 20 Sec Memory Limit: 256 MB 题目连接 http://codeforces.com/contest/548/pro ...
- ACM KMP 格式输入导致TLE
在写 Oulipo POJ - 3461 时候遇上的奇怪的问题 在格式输入上不一样,提交的时候返回TLE,两段代码如下: A#include<iostream> #include< ...
- AbstractQueuedSynchronizer 原理分析 - 独占/共享模式
1.简介 AbstractQueuedSynchronizer (抽象队列同步器,以下简称 AQS)出现在 JDK 1.5 中,由大师 Doug Lea 所创作.AQS 是很多同步器的基础框架,比如 ...
- Java内存泄漏分析系列之三:jstat命令的使用及VM Thread分析
原文地址:http://www.javatang.com 使用jstat命令 当服务器CPU100%的时候,通过定位占用资源最大的线程定位到 VM Thread: "VM Thread&qu ...
- postgresql跨服务器复制数据库
假设名为dbname数据库需要从A服务器拷贝到B服务器 接收服务器B postgres用户 需先重置B服务器postgres系统用户的密码,使之与数据库用户postgres一致: passwd -d ...