动态ActionForm,文件上传与转换器

本文介绍 Struts 框架中动态 ActionForm 的使用方法,包括配置、数据收集、验证及文件上传等功能,并探讨了 EL 表达式在其中的应用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

动态ActionForm

动态ActionForm是为了避免标准ActionForm膨胀而设计的,使用动态ActionForm可以获得标准ActionForm的所有功能,动态ActionForm(DynaActionForm)继承ActionForm

*在struts-config.xml文件中定义动态ActionForm,如:

<form-beans>

<form-beanname="dynaForm"type="org.apache.struts.action.DynaActionForm">

<form-propertyname="username"type="java.lang.String"/>

<form-propertyname="age"type="java.lang.Integer"/>

</form-bean>

</form-beans>

*在Action中使用动态ActionForm

DynaActionFormdaf=(DynaActionForm)form;

Stringusername=(String)daf.get("username");

Integerage=(Integer)daf.get("age");

动态ActionForm其实是把页面中的html元素的名字和值放到了map中,所以通过get方法可以取出相应的值

动态ActionForm采用EL表达式的输出方式,${dynabean.map.prop},

原因:DynaActionForm无getDynaValues()方法,只有getMap()方法。采用el表达式导航时要使用map来导航。

protectedHashMapdynaValues=newHashMap();

publicMapgetMap(){

return(dynaValues);

}

动态Action的验证,通常使用动态验证框架validator

采用struts上传文件

*页面的配置,如:

<formaction="upload.do"method="post"enctype="multipart/form-data">

标题:<inputtype="text"name="title"><br>

文件:<inputtype="file"name="myfile"><br>

<inputtype="submit"value="提交">

</form>

*ActionForm中使用FormFile来接收上传的文件,参见:UploadActionForm.java

*在Action中调用FormFile取得上传文件数据,采用流输出,即完成上传

UploadActionForm uaf = (UploadActionForm)form;
FormFile myFile = uaf.getMyfile();
if (myFile != null) {

FileOutputStream fos = new FileOutputStream("c://" + myFile.getFileName());
fos.write(myFile.getFileData());
fos.flush();
fos.close();
}

*采用<controller/>标签配置上传参数,如:<controllermaxFileSize="10M"/>

空字段测试

*在表单中没有input输入域,jsp脚本接收到的值为null,el表达式接收到的值为空串

*如果表单中的值,没有输入,那么jsp脚本和el表达式接收到的值都为空串

测试ActionForm类型的自动转换

*boolean:yes,1,on,true都会转换成True类型,而且忽略大小写,其他情况转换成false

*Date类型的转换:

*如果是java.sql.Date,页面日期的格式必须为yyyy-mm-dd,才可以转换

*如果是java.util.Date,默认情况下struts无法转换

自定义转换器的实现步骤

*实现converter接口,实现convert方法

如:

public class UtilDateConverter implements Converter {

public Object convert(Class type, Object 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;
}

}

*将实现的conerter注册,通常情况采用servlet注册

*采用servlet注册需要注意标签的配置,<load-on-startup>10</load-on-startup>

如:

public class UtilDateConverterInitWithServlet extends HttpServlet {

@Override
public void init() throws ServletException {
ConvertUtils.register(new UtilDateConverter(), Date.class);//注册自定义转化器
}

}

web.xml

<servlet>
<servlet-name>UtilDateConverterInitWithServlet</servlet-name>
<servlet-class>com.bjsxt.struts.UtilDateConverterInitWithServlet</servlet-class>
<load-on-startup>10</load-on-startup>
</servlet>

采用strutsplugin注册

struts-config.xml加入

<plug-in className="com.bjsxt.struts.UtilDateConverterInitWithPlugin"/>

public class UtilDateConverterInitWithPlugin implements PlugIn {

public void destroy() {
}

public void init(ActionServlet servlet, ModuleConfig config)
throws ServletException {
ConvertUtils.register(new UtilDateConverter(), Date.class);
}
}

Struts对ActionForm的自动搜集过程:

*将页面数据放到map中,其中map中的key为页面中的名称,map中的value为页面中的value值

*调用BeanUtils.setProperties方法,将map中的值逐个设置到ActionForm实例上,对于ActionForm中的每个属性

根据类型调用相应的Converter,然后调用相应的convert方法,将相应的字符串转换成ActionForm中指定的类型

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

<!--EndFragment-->
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值