读书人

Struts1_学习札记6_struts0500_action

发布时间: 2012-09-08 10:48:07 作者: rapoo

Struts1_学习笔记6_struts0500_actionform_动态ActionForm_转换器
1、动态ActionForm
动态ActionForm是为了避免标准ActionForm膨胀而设计的,使用动态ActionForm可以获得标准ActionForm的所有功能
* 在struts-config.xml文件中定义动态ActionForm,如:

<!-- 动态ActionForm 不用自己写ActionForm类了,这里配置。动态ActionForm可以用动态验证框架手写的ActionForm可以用validate方法--><form-bean name="dynaForm" type="org.apache.struts.action.DynaActionForm"><form-property name="username" type="java.lang.String"/><form-property name="age" type="java.lang.Integer"/></form-bean>


*在Action中使用动态ActionForm
DynaActionForm daf = (DynaActionForm)form;String username = (String)daf.get("username");Integer age = (Integer)daf.get("age");

动态ActionForm其实是把页面中的html元素的名字和值放到了map中,所以通过get方法可以取出相应的值
动态ActionForm采用EL表达式的输出方式,${dynabean.map.prop}
动态Action的验证,通常使用动态验证框架validator

2、采用struts上传文件
* 页面的配置,如:
<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="提交">
</form>
* ActionForm中使用FormFile来接收上传的文件,参见:具体代码
* 在Action中调用FormFile取得上传文件数据,采用流输出,即完成上传,详见代码。
* 采用<controller/>标签配置上传参数,如:<controller maxFileSize="10M"/>

3、空字段测试
* 在表单中没有input输入域,jsp脚本接收到的值为null,el表达式接收到的值为空串
* 如果表单中的值,没有输入,那么jsp脚本和el表达式接收到的值都为空串

4、测试ActionForm类型的自动转换
* boolean:yes,1,on,true都会转换成True类型,而且忽略大小写,其他情况转换成false
* Date类型的转换:
* 如果是java.sql.Date,页面日期的格式必须为yyyy-mm-dd,才可以转换
* 如果是java.util.Date,默认情况下struts无法转换

* 自定义转换器的实现步骤
* 实现converter接口,实现convert方法
* 将实现的conerter注册,通常情况采用servlet注册
* 采用servlet注册需要注意标签的配置,<load-on-startup>3</load-on-startup>(也可以采用struts plugin注册)


Servlet方式注册:
1、具体注册的Servlet:
/** * 注册java.util.date转换器 * @author Administrator * */public class UtilDateConverterInitWithServlet extends HttpServlet {@Overridepublic void init() throws ServletException {//将UtilDateConverter注册到ConvertUtils里面ConvertUtils.register(new UtilDateConverter(), Date.class);}}

2、具体的转换类:
public class UtilDateConverter implements Converter {public Object convert(Class type, Object value) {System.out.println("UtilDateConverter.value=" + value);if (value == null) {return value;}if (value instanceof Date) {return value;}Date d = null;if (value instanceof String) {SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");try {d = sdf.parse((String) value);} catch (ParseException e) {e.printStackTrace();}}return d;}}



3、加载Servlet注册类
 <!-- load-on-startup:大于0就可以了 3也可以. 表示tomcat一启动就执行这个Servlet   <servlet>  <servlet-name>UtilDateConverterInitWithServlet</servlet-name>  <servlet-class>com.aowin.struts.UtilDateConverterInitWithServlet</servlet-class>  <load-on-startup>3</load-on-startup>  </servlet>   -->  



PlugIn方式注册:
1、注册类
public class UtilDateConverterInitWithPlugin implements PlugIn {public void destroy() {}public void init(ActionServlet servlet, ModuleConfig config)throws ServletException {System.out.println("UtilDateConverterInitWithPlugin.init()");ConvertUtils.register(new UtilDateConverter(), Date.class);}}


2、转换器:同Servelt注册的转换器

3、加载注册类:
在Struts1配置文件中:
<!-- 第二种注册转换器方式  plug方式 --><plug-in className="com.aowin.struts.UtilDateConverterInitWithPlugin"/>



Struts对ActionForm的自动搜集过程:
* 将页面数据放到map中,其中map中的key为页面中的名称,map中的value为页面中的value值
* 调用BeanUtils.setProperties方法,将map中的值逐个设置到ActionForm实例上,对于ActionForm中的每个属性
根据类型调用相应的Converter,然后调用相应的convert方法,将相应的字符串转换成ActionForm中指定的类型

小技巧:可以通过BeanUtils.copyProperties(目标对象,源对象)方法进行对象值的复制。

读书人网 >编程

热点推荐