上传文件
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事件,此时οnsubmit="return validateValidatorDemoForm(this);"中的函数名也用到了formName。
<html:form action="/validatorDemo" οnsubmit="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"); } } |