您的位置:首页 > 其它

上传文件、Validator自动校验数据、动态FormBean

2010-08-14 19:51 423 查看

上传文件

Struts提供了<html:file>标签,集成了Apache的commons-upload工具包,把上传文件封装成FormFile对象,直接获取该对象,将文件数据保存即可。
上传文件的Form表单要指定enctype属性为multipart/form-data,method方法必须为post。struts1.x<html:form>默认method为post。
<html:form action="upload.do" method="post" enctype="multipart/form-data">
文件名称:<html:text property="fileName"></html:text><br/>
选择上传文件:<html:file property="file"></html:file><br/>
<html:submit value="上传"></html:submit>
</html:form>
必须通过io流操作文件。
this.getServlet().getServletContext().getRealPath("/")+"upload//"得到上传文件所在的文件夹的路径。
由uploadForm.getFile().getFileName()可以得到上传文件的原始名称。
上传文件时若需要改名则必须保存文件的后缀。
通过uploadForm.getFileName() 得到修改后的文件名称。
通过uploadForm.getFile().getFileName().split("//.")[1]可以得到上传文件的后缀。
最后得到上传文件的完整路径为:
this.getServlet().getServletContext().getRealPath("/")+"upload//"+uploadForm.getFileName()+"."+uploadForm.getFile().getFileName().split("//.")[1] ;
通过FormFile取得文件的字节流写入文件。
public ActionForward execute(ActionMapping mapping, ActionForm form,
HttpServletRequest request, HttpServletResponse response) {
UploadForm uploadForm = (UploadForm) form;// TODO Auto-generated method stub
String uploadPath = this.getServlet().getServletContext().getRealPath("/")+"upload//"+uploadForm.getFileName()+"."+uploadForm.getFile().getFileName().split("//.")[1] ;
try {
OutputStream out = new FileOutputStream(new File(uploadPath)) ;
FormFile ff = uploadForm.getFile() ;
byte b[] = ff.getFileData() ;
out.write(b) ;
out.close() ;
} catch (FileNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return null;
}

Validator自动校验数据

除了FormBean里的validate()方法外,struts还提供Validator插件进行数据校验,它能在JSP页面里生成javascript脚本,在客户端进行数据校验。
支持Validator的FormBean必须继承Struts的ValidatorForm。

public class ValidatorDemoForm extends ValidatorForm {

private String email;
private int age;
private String name;
……………………
}
输入表单validatorDemo.jsp,校验时Struts使用<html:javascript/>标签,在该标签处生成javascript校验代码。<html:javascript>标签的formName与validation.xml中的配置的form的name属性对应。表单使用onsubmit事件,此时onsubmit="return validateValidatorDemoForm(this);"中的函数名也用到了formName。

<html:form action="/validatorDemo" onsubmit="return validateValidatorDemoForm(this);">

姓名:<html:text property="name"></html:text><html:errors property="name"/><br/>
年龄:<html:text property="age"></html:text><html:errors property="age"/><br/>
邮件:<html:text property="email"></html:text><html:errors property="email"/><br/>
<html:submit value="提交"/>
<html:javascript formName="validatorDemoForm"/>
</html:form>
Validator插件使用配置式数据校验,校验规则配置在validation.xml中。

<?xml version="1.0" encoding="UTF-8"?>

<!DOCTYPE form-validation PUBLIC
"-//Apache Software Foundation//DTD Commons Validator Rules Configuration 1.1.3//EN"
"http://jakarta.apache.org/commons/dtds/validator_1_1_3.dtd">

<form-validation>
<formset>
<form name="validatorDemoForm">
<field property="name" depends="required">
<msg name="required"
key="validatorDemo.error.nameRequired" />
</field>
<field property="age"
depends="required, integer, intRange">
<arg position="0" name="intRange" key="${var:min}"
resource="false" />
<arg position="1" name="intRange" key="${var:max}"
resource="false" />
<var>
<var-name>min</var-name>
<var-value>0</var-value>
</var>
<var>
<var-name>max</var-name>
<var-value>100</var-value>
</var>

<msg name="required"
key="validatorDemo.error.ageRequired" />
<msg name="integer"
key="validatorDemo.error.ageInteger" />
<msg name="intRange" key="validatorDemo.error.ageRange" />
</field>
<field property="email" depends="required, email">

<arg position="0" key="email" />

<msg name="required"
key="validatorDemo.error.emailRequired" />
<msg name="email" key="validatorDemo.error.emailFormat" />
</field>
</form>
</formset>
</form-validation>
如校验失败会显示<msg>配置的错误信息,该信息配置在资源文件ApplicationResources.properties中。

validatorDemo.error.nameRequired = /u8BF7/u8F93/u5165/u59D3/u540D

validatorDemo.error.ageRequired = /u8BF7/u8F93/u5165/u5E74/u9F84
validatorDemo.error.ageInteger = /u5E74/u9F84/u5FC5/u987B/u4E3A/u6574/u6570
validatorDemo.error.ageRange = /u5E74/u9F84/u5FC5/u987B/u4ECE{0}/u5230{1}/u4E4B/u95F4
validatorDemo.error.emailRequired = /u8BF7/u8F93/u5165/u7535/u5B50/u90AE/u4EF6
validatorDemo.error.emailFormat = /u7535/u5B50/u90AE/u4EF6/u4E0D/u5408/u6CD5
之后将validation.xml连同校验规则库文件validator-rules.xml文件配置到struts-config.xml文件中,配置为plugin形式。
pathnames为校验规则库文件、校验规则配置文件的路径。
stopOnFirstError为如果前面校验失败是否停止后面的校验。

<message-resources parameter="com.hym.struts.ApplicationResources" />

<plug-in className="org.apache.struts.validator.ValidatorPlugIn">
<set-property property="pathnames"
value="/WEB-INF/validator-rules.xml, /WEB-INF/validation.xml" />
<set-property property="stopOnFirstError" value="false" />
</plug-in>

动态FormBean

Struts提供一种动态FormBean:DynaActionForm 这种FormBean不需要实现具体的类,即该FormBean类并不是真的存在。它的变量配置在struts-config.xml中。
如:下面为dynaDemo配置了3个属性:name、age、birthday,分为String、Integer、Date类型,并指定了初始值。

<form-bean name="dynaDemoForm" type="org.apache.struts.action.DynaActionForm">

<form-property name="birthday" type="java.sql.Date" initial=""></form-property>
<form-property name="age" type="java.lang.Integer" initial="18"></form-property>
<form-property name="name" type="java.lang.String" initial=""></form-property>
</form-bean>
由于不同一般的FormBean,所以Action中使用get(String key)来获取动态属性FormBean的属性值。

public class DynaDemoAction extends Action {

public ActionForward execute(ActionMapping mapping, ActionForm form,
HttpServletRequest request, HttpServletResponse response) {
DynaActionForm dynaForm = (DynaActionForm) form ;
String name = (String)dynaForm.get("name") ;
Integer age = (Integer)dynaForm.get("age") ;
Date birthday =(Date)dynaForm.get("birthday") ;
request.setAttribute("name", name) ;
request.setAttribute("age", age) ;
request.setAttribute("birthday", birthday) ;
return mapping.findForward("suc");
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐