beanutils.populate(commons-beanutils-1.8.3是什么jar包)
朋友们,beanutils.populate和commons-beanutils-1.8.3是什么jar包是当今热门话题,但是它们的内涵和影响力可能会让人感到困惑。在本篇文章中,我将为你们揭示它们的本质和重要性,希望能够为你们带来新的认识。
如何把ResultSet转换成Java对象
有时候我们不想使用任何框架,但又需要用JDBC实现类似于iBATIS的orm映射功能,把一个ResultSet转换成我们的JavaBeans,我们可以模仿iBATIS的方式自己写一个ResultSetMapper实现类,利用反射原理把ResultSet转换成一个JavaBeans,下面是网上的一个开源实现,主要用到的是注解和反射机制,我们先看一下使用效果:
在CODE上查看代码片派生到我的代码片
package com.heaven.mapper;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.List;
public class SampleMain{
public static void main(String...args){
try{
ResultSetMapper<SamplePojo> resultSetMapper= new ResultSetMapper<SamplePojo>();
ResultSet resultSet= null;
// simple JDBC code to run SQL query and populate resultSet- START
Class.forName("sun.jdbc.odbc.JdbcOdbcDriver");
String database="jdbc:odbc:AkDb";
Connection connection= DriverManager.getConnection( database,"","");
PreparedStatement statement= connection.prepareStatement("SELECT* FROM UsersSample");
resultSet= statement.executeQuery();
/******************************/
List<SamplePojo> pojoList= resultSetMapper.mapRersultSetToObject(resultSet, SamplePojo.class);
/******************************/
if(pojoList!= null){
for(SamplePojo pojo: pojoList){
System.out.println(pojo);
}
}else{
System.out.println("ResultSet is empty. Please check if database table is empty");
}
connection.close();
} catch(ClassNotFoundException e){
e.printStackTrace();
} catch(SQLException e){
e.printStackTrace();
}
}
}
如上图所示,把ResultSet转换成我们的JavaPojo对象只需要调用ResultSetMapper的一个方法即可完成,使用起来非常方便。
下面是ResultSetMapper源代码:
在CODE上查看代码片派生到我的代码片
package com.heaven.mapper;
import java.lang.reflect.Field;
import java.lang.reflect.InvocationTargetException;
import java.sql.ResultSet;
import java.sql.ResultSetMetaData;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;
import javax.persistence.Column;
import javax.persistence.Entity;
import org.apache.commons.beanutils.BeanUtils;
public class ResultSetMapper<T>{
@SuppressWarnings("unchecked")
public List<T> mapRersultSetToObject(ResultSet rs, Class outputClass){
List<T> outputList= null;
try{
// make sure resultset is not null
if(rs!= null){
// check if outputClass has'Entity' annotation
if(outputClass.isAnnotationPresent(Entity.class)){
// get the resultset metadata
ResultSetMetaData rsmd= rs.getMetaData();
// get all the attributes of outputClass
Field[] fields= outputClass.getDeclaredFields();
while(rs.next()){
T bean=(T) outputClass.newInstance();
for(int _iterator= 0; _iterator< rsmd.getColumnCount(); _iterator++){
// getting the SQL column name
String columnName= rsmd.getColumnName(_iterator+ 1);
// reading the value of the SQL column
Object columnValue= rs.getObject(_iterator+ 1);
// iterating over outputClass attributes to check if
// any attribute has'Column' annotation with
// matching'name' value
for(Field field: fields){
if(field.isAnnotationPresent(Column.class)){
Column column= field.getAnnotation(Column.class);
if(column.name().equalsIgnoreCase(columnName)&& columnValue!= null){
BeanUtils.setProperty(bean, field.getName(), columnValue);
break;
}
}
}
}
if(outputList== null){
outputList= new ArrayList<T>();
}
outputList.add(bean);
}
} else{
// throw some error
}
} else{
return null;
}
} catch(IllegalAccessException e){
e.printStackTrace();
} catch(SQLException e){
e.printStackTrace();
} catch(InstantiationException e){
e.printStackTrace();
} catch(InvocationTargetException e){
e.printStackTrace();
}
return outputList;
}
}
使用注解的pojo对象:
在CODE上查看代码片派生到我的代码片
<pre name="code" class="java">package com.heaven.mapper;
import javax.persistence.Column;
import javax.persistence.Entity;
@Entity
public class SamplePojo{
@Column(name="User_Id")
private int id;
@Column(name="User_Name")
private String name;
@Column(name="Address")
private String address;
@Column(name="Gender")
private boolean gender;
public int getId(){
return id;
}
public void setId(int id){
this.id= id;
}
public String getName(){
return name;
}
public void setName(String name){
this.name= name;
}
public String getAddress(){
return address;
}
public void setAddress(String address){
this.address= address;
}
public boolean isGender(){
return gender;
}
public void setGender(boolean gender){
this.gender= gender;
}
@Override
public String toString(){
return"id:"+ id+"\n"+
"name:"+ name+"\n"+
"address:"+ address+"\n"+
"gender:"+(gender?"Male":"Female")+"\n\n";
}
}
commons-beanutils-1.8.3是什么jar包
1.什么是commons-beanutils:
BeanUtils主要提供了对于JavaBean进行各种操作。
2.commons-beanutils的作用:
在一般的写bean组件的时候,都必须要写setter和getter方法,当然假如我们事先已经知道bean的相关属性和方法,写bean是比较简单的,
但是组件太多的时候,重复编写经常是枯燥乏味令人厌烦的。
但当有些时候我么需要调用动态对象的属性的时候,我们应该怎么来设定和获取对象的属性呢?BeanUtils就可以帮助我们来解决这个问题。
3.org.apache.commons.beanutils:
这个包主要提供用于操作JavaBean的工具类,Jakarta-Common-BeanUtils的主要功能都在这个包里实现。
BeanUtils可以直接get和set一个属性的值。它将property分成3种类型:
1Simple——简单类型,如Stirng、Int……
(对于Simple类型,第二个参数直接是属性名即可,详见代码)
2Indexed——索引类型,如数组、arrayList……
(对于Indexed,则为“属性名[索引值]”,注意这里对于ArrayList和数组都可以用一样的方式进行操作,详见代码)
3Maped——这个不用说也该知道,就是指Map,比如HashMap……
(对于Map类型,则需要以“属性名(key值)”的形式,详见代码)
访问不同类型的数据可以直接调用函数getProperty和setProperty。它们都只有2个参数,第一个是JavaBean对象,第二个是要操作的属性名。
4.Converter把Request或ResultSet中的字符串绑定到对象的属性
经常要从request,resultSet等对象取出值来赋入bean中,如果不用MVC框架的绑定功能的话,下面的代码谁都写腻了。
Stringa=request.getParameter("a");
bean.setA(a);
Stringb=request.getParameter("b");
bean.setB(b);…
不妨写一个Binder自动绑定所有属性:
MyBeanbean=;
HashMapmap=newHashMap();
Enumerationnames=request.getParameterNames();
while(names.hasMoreElements())
{
Stringname=(String)names.nextElement();
map.put(name,request.getParameterValues(name));
}
BeanUtils.populate(bean,map);
其中BeanUtils的populate方法(Struts用于将一个map的值填充到一个bean中)或者getProperty,setProperty方法其实都会调用convert进行转换。
但Converter只支持一些基本的类型,甚至连java.util.Date类型也不支持。而且它比较笨的一个地方是当遇到不认识的类型时,居然会抛出异常来。对于Date类型,我参考它的sqldate类型实现了一个Converter,而且添加了一个设置日期格式的函数。
要把这个Converter注册,需要如下语句:
例:
BeanUtilsBeanbeanUtils=newBeanUtilsBean(convertUtils,newPropertyUtilsBean());
beanUtils.setProperty(bean,name,value);
java中status1和status2的区别
Struts1和Struts2的区别和对比:
Action类:
Struts1要求Action类继承一个抽象基类。Struts1的一个普遍问题是使用抽象类编程而不是接口。
Struts 2 Action类可以实现一个Action接口,也可实现其他接口,使可选和定制的服务成为可能。Struts2提供一个ActionSupport基类去实现常用的接口。Action接口不是必须的,任何有execute标识的POJO对象都可以用作Struts2的Action对象。
线程模式:
Struts1 Action是单例模式并且必须是线程安全的,因为仅有Action的一个实例来处理所有的请求。单例策略限制了Struts1 Action能作的事,并且要在开发时特别小心。Action资源必须是线程安全的或同步的。
Struts2 Action对象为每一个请求产生一个实例,因此没有线程安全问题。(实际上,servlet容器给每个请求产生许多可丢弃的对象,并且不会导致性能和垃圾回收问题)
Servlet依赖:
Struts1 Action依赖于Servlet API,因为当一个Action被调用时HttpServletRequest和 HttpServletResponse被传递给execute方法。
Struts 2 Action不依赖于容器,允许Action脱离容器单独被测试。如果需要,Struts2 Action仍然可以访问初始的request和response。但是,其他的元素减少或者消除了直接访问HttpServetRequest和 HttpServletResponse的必要性。
可测性:
测试Struts1 Action的一个主要问题是execute方法暴露了servlet API(这使得测试要依赖于容器)。一个第三方扩展--Struts TestCase--提供了一套Struts1的模拟对象(来进行测试)。
Struts 2 Action可以通过初始化、设置属性、调用方法来测试,“依赖注入”支持也使测试更容易。
捕获输入:
Struts1使用ActionForm对象捕获输入。所有的ActionForm必须继承一个基类。因为其他JavaBean不能用作ActionForm,开发者经常创建多余的类捕获输入。动态Bean(DynaBeans)可以作为创建传统ActionForm的选择,但是,开发者可能是在重新描述(创建)已经存在的JavaBean(仍然会导致有冗余的javabean)。
Struts 2直接使用Action属性作为输入属性,消除了对第二个输入对象的需求。输入属性可能是有自己(子)属性的rich对象类型。Action属性能够通过 web页面上的taglibs访问。Struts2也支持ActionForm模式。rich对象类型,包括业务对象,能够用作输入/输出对象。这种 ModelDriven特性简化了taglib对POJO输入对象的引用。
表达式语言:
Struts1整合了JSTL,因此使用JSTL EL。这种EL有基本对象图遍历,但是对集合和索引属性的支持很弱。
Struts2可以使用JSTL,但是也支持一个更强大和灵活的表达式语言--"Object Graph Notation Language"(OGNL).
绑定值到页面(view):
Struts 1使用标准JSP机制把对象绑定到页面中来访问。
Struts 2使用"ValueStack"技术,使taglib能够访问值而不需要把你的页面(view)和对象绑定起来。ValueStack策略允许通过一系列名称相同但类型不同的属性重用页面(view)。
类型转换:
Struts 1 ActionForm属性通常都是String类型。Struts1使用Commons-Beanutils进行类型转换。每个类一个转换器,对每一个实例来说是不可配置的。
Struts2使用OGNL进行类型转换。提供基本和常用对象的转换器。
校验:
Struts 1支持在ActionForm的validate方法中手动校验,或者通过Commons Validator的扩展来校验。同一个类可以有不同的校验内容,但不能校验子对象。
Struts2支持通过validate方法和XWork校验框架来进行校验。XWork校验框架使用为属性类类型定义的校验和内容校验,来支持chain校验子属性
Action执行的控制:
Struts1支持每一个模块有单独的Request Processors(生命周期),但是模块中的所有Action必须共享相同的生命周期。
Struts2支持通过拦截器堆栈(Interceptor Stacks)为每一个Action创建不同的生命周期。堆栈能够根据需要和不同的Action一起使用。
Struts1流程:
(1)用户的请求以HTTP方式传输到服务器上,接受请求的是ActionServlet.
(2)ActionServlet接收到请求后,会查找Struts-config.xml文件来确定服务器上是否有用户请求的操作,此处用户请求操作应为登陆操作。如果没有,则返回一个用户请求无效的出错信息。
(3)当ActionServlet请求找到用户请求的Action后,首先将用户输入的表单参数打包成一个ActionFrom对象,这个ActionFrom对象其实也就是一个JavaBean,里面包含两个字段,分别是用户名和密码。接着ActionServlet再根据struts-config.xml中的配置信息决定是否要执行ActionFrom对象中的Validate方法。若Validate方法执行有错,则返回。否则,继续下一步。
(4)系统生成一个用户所请求的Action的实例对象,将前面的ActionFrom对象传递给它,运行它的Execute()方法。这一步其实就是用户登陆的控制器,在执行exectue()方法时,可以调用后台模型验证登陆名和密码是否正确等信息。
(5)execute()执行结束前会生成ActionForward类型的对象并将之返回给ActionServlet
struts1的处理器
processMultipart()要是提交方式为post而且类型为Multipart则返回重新包装的HttpServletRequest对象
processPath()获取url路径以便选择struts Action组件
processLocale()把用户提交的Locale信息保存到session中
processContent()设置response.setContentType的值
processNoCache()设置报头Cache-Control Pragma Expires的值
processPreprocess()直接返回true子类可以覆盖该方法实现己的操作
processMapping()查找对应的ActionMapping不存在则返回错误信息
processRoles()判断对应的Action是否配置了安全角色用户是否有权限
processActionForm()查找ActionMapping是否配置ActionForm有则查找该实例不存在则创建
processPopulate()查找ActionMapping是否配置ActionForm有则调用reset方法清空再装载表单数据
processValidate()调用ActionForm的validate方法返回ActionErrors要是存在ActionMessage对象则验证失败
processForward()查找ActionMapping是否配置forward有则采用forward结束流程
processInclude()查找ActionMapping是否配置include有则采用include结束流程
processActionCreate()查找是否有对应的Action实例不存在则创建
processActionPerform()调用Action的execute方法
processForwardConfig()处理跳转
struts2的执行流程
1、客户端发起一个请求
2、主控器FilterDispatcher拦截请求.
3、主控器通过ActionMapper判断请求是否交给action
处理.如果是,那么判断请求的action是否存在,如果不存在,报404错误.如果不是交给action处理,那么将
请求转发给对应的web组件.
4、主控器创建ActionProxy对象,这个对象全权负责 action的执行.
5、ActionProxy通过ConfigurationManager对象获得当前访问的action的相关配置信息.
6、ActionProxy根据获得的action的配置信息,创建
ActionInvocation对象.
7、ActionInvocation对象负责执行action前面的拦截器
以及action对象,并且处理action执行后的结果.
8、action前面的拦截器被执行,最后执行action.
9、ActionInvocation得到action执行后的逻辑视图,根据逻辑视图找到物理视图,然后转发请求.
OK,关于beanutils.populate和commons-beanutils-1.8.3是什么jar包的内容到此结束了,希望对大家有所帮助。