beanutils.populate(BeanUtils)

admin 456 0

其实beanutils.populate的问题并不复杂,但是又很多的朋友都不太了解BeanUtils,因此呢,今天小编就来为大家分享beanutils.populate的一些知识,希望可以帮助到大家,下面我们一起来看看这个问题的分析吧!

一、...servlet.ServletException: BeanUtils.populate

1、javax.servlet.ServletException: BeanUtils.populate解决方案:ENCTYPE="multipart/form-data"(1)在用Struts上传文件时,遇到了javax.servlet.ServletException: BeanUtils.populate异常。我的ActionServlet并没有用到BeanUtils这些工具类。感觉很奇怪。后来仔细检查代码发现是在jsp文件里的form忘了加enctype="multipart/form-data"了。加上之后,果然没有异常了。所以写程序遇到错误或异常应该从多方面考虑问题存在的可能性,想到系统提示信息以外的东西。(2)ENCTYPE="multipart/form-data"解释:用于表单里有图片上传。<form name="userInfo" method="post" action="first_submit.jsp" ENCTYPE="multipart/form-data">

2、表单标签中设置enctype="multipart/form-data"来确保匿名上载文件的正确编码。

3、<td height="30" align="right">上传企业营业执照图片:</td>

4、<td><INPUT TYPE="FILE" NAME="uploadfile" SIZE="34" onChange="checkimage()"></td>

5、就得加ENCTYPE="multipart/form-data"。

6、表单中enctype="multipart/form-data"的意思,是设置表单的MIME编码。默认情况,这个编码格式是application/x-www-form-urlencoded,不能用于文件上传;只有使用了multipart/form-data,才能完整的传递文件数据,进行下面的操作.

7、enctype=\"multipart/form-data\"是上传二进制数据; form里面的input的值以2进制的方式传过去。

8、form里面的input的值以2进制的方式传过去,所以request就得不到值了。也就是说加了这段代码,用request就会传递不成功,

9、取表单值加入数据库时,用到下面的:SmartUpload su= new SmartUpload();//新建一个SmartUpload对象su.getRequest().getParameterValues();取数组值su.getRequest().getParameter();取单个参数单个值

二、commons-beanutils-1.8.3是什么jar包

BeanUtils主要提供了对于JavaBean进行各种操作。

在一般的写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");

Stringb=request.getParameter("b");

bean.setB(b);…

不妨写一个Binder自动绑定所有属性:

不妨写一个Binder自动绑定所有属性:

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进行转换。

其中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要求Action类继承一个抽象基类。Struts1的一个普遍问题是使用抽象类编程而不是接口。

Struts 2 Action类可以实现一个Action接口,也可实现其他接口,使可选和定制的服务成为可能。Struts2提供一个ActionSupport基类去实现常用的接口。Action接口不是必须的,任何有execute标识的POJO对象都可以用作Struts2的Action对象。

Struts1 Action是单例模式并且必须是线程安全的,因为仅有Action的一个实例来处理所有的请求。单例策略限制了Struts1 Action能作的事,并且要在开发时特别小心。Action资源必须是线程安全的或同步的。

Struts2 Action对象为每一个请求产生一个实例,因此没有线程安全问题。(实际上,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).

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校验子属性

Struts1支持每一个模块有单独的Request Processors(生命周期),但是模块中的所有Action必须共享相同的生命周期。

Struts2支持通过拦截器堆栈(Interceptor Stacks)为每一个Action创建不同的生命周期。堆栈能够根据需要和不同的Action一起使用。

(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

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()处理跳转

2、主控器FilterDispatcher拦截请求.

3、主控器通过ActionMapper判断请求是否交给action

处理.如果是,那么判断请求的action是否存在,如果不存在,报404错误.如果不是交给action处理,那么将

4、主控器创建ActionProxy对象,这个对象全权负责 action的执行.

5、ActionProxy通过ConfigurationManager对象获得当前访问的action的相关配置信息.

6、ActionProxy根据获得的action的配置信息,创建

7、ActionInvocation对象负责执行action前面的拦截器

以及action对象,并且处理action执行后的结果.

8、action前面的拦截器被执行,最后执行action.

9、ActionInvocation得到action执行后的逻辑视图,根据逻辑视图找到物理视图,然后转发请求.

关于beanutils.populate的内容到此结束,希望对大家有所帮助。