转!ActionForm 详解
时间:2010-09-13 来源:jiahao0321
- 动态ActionForm的编写:
- 动态ActionForm是为了避免过多的ActionForm类而设计的,使用动态ActionForm
- 可以获得静态AcitonForm的所有好处;1、在Struts-config.xml定义动态AcitonForm
- 如:
- <form-bean name="dynaUserActionForm" type="org.apache.struts.action.DynaActionForm">
- <form-property name="name" type="java.lang.String"/>
- <form-property name="age" type="java.lang.Integer"/>
- </form-bean>
- 2、在Action中使用的时候,需要强制转换为DynaActionForm类型,同时使用get方法来获取
- 如:
- DynaActionForm dynaform = (DynaActionForm)form;
- String name = (String)dynaform.get("name");
- Integer age = (Integer)dynaform.get("age");
- 参考:DynaActionFormTestAction类
- ----------------------------------------------------
- 上传文件:
- 1、页面的action需要配置:enctype="multipart/form-data",如:
- <form action="upload.do" method="post" enctype="multipart/form-data">
- 标题:<input type="text" name="title"><br>
- 文件名:<input type="file" name="myfile"><br>
- <input type="submit" value="上传"><br>
- </form>
- 注意:method必须设置为post
- 2、ActionForm中使用FormFile来接收文件
- 3、在Action中调用FormFile即可取得上传文件的相关数据,完成上传
- 参见:UploadAction类
- 空字段的问题:
- 如果页面没有写<input>,用jsp脚本在后台接收到的字符串为null,及空对象,如果用EL表达式,则为空串“”
- 如果页面中有<input>,没有输入值,后台接收到的为空串“”
- ----------------------------------------------------
- Struts对ActionForm类型的自动转换:
- boolean: yes,y,1,true,on这些都可以转换为true类型,而且是忽略大小写的;其它情况会转换为false类型
- Date类型的转换:
- * 如果定义Date为: java.sql.Date类型,页面传递到后台的相应属性不能为空字符串,而且其格式
- 必须是yyyy-MM-dd。
- * 如果定义Date为:java.util.Date类型,默认情况下,struts无法转换此类型,我们需要定义
- 自己的Converter来进行转换
- ----------------------------------------------------Struts对ActionForm类型的自动转换过程:
- 1、搜索request中的parameter
- 2、把request中所有的参数名称和值(字符串类型)放到map中(key为参数名称,value为值)
- 3、调用BeanUtils.setProperty方法,将map中的值逐个设置到ActionForm的数性上;
- *对于ActionForm中的每一个属性,根据属性的类型,调用相应的Converter
- *调用Converter的convert方法,将相应的字符串转换成ActionForm中指定的类型
- Converter的convert方法如下:
- public Object convert(Class type, Object value) {}
- 如果我们要转换为java.util.Date类型(即从一个字符串转换为java.util.Date类型),步骤如下:
- 1、实现一个Converter
- 2、将converter进行注册(通常用servlet注册,注意servlet标签中的<load-on-startup>标签的值必须大于等于0,web server在启动的
- 时候才会调用servlet的init方法 )
- ----------------------------------------------------
- 我们可以通过BeanUtils.copyProperties(目标对象,源对象) 方法,在ActionForm对象和实体对象之间复制,避免过多的调用get/set方法
相关阅读 更多 +