首页编程beanutils.populate(commons-beanutils-1.8.3是什么jar包)

beanutils.populate(commons-beanutils-1.8.3是什么jar包)

编程之家2023-11-05192次浏览

朋友们,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;

beanutils.populate(commons-beanutils-1.8.3是什么jar包)

import java.sql.ResultSet;

import java.sql.SQLException;

import java.util.List;

public class SampleMain{

public static void main(String...args){

try{

beanutils.populate(commons-beanutils-1.8.3是什么jar包)

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包的内容到此结束了,希望对大家有所帮助。

java工作流?java什么叫工作流smo优化?什么是smo