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