验证Action的指定方法,只需将重写的validate方法名改为“validate+要验证的方法名”即可!注意方法名的首字母都得大写。
基于配置文件的表单的验证,可以减少java代码的编写,如果要验证的Action是“LoginAction”,那么配置文件需命名为“LoginAction-validation.xml”
需要根据work-validator-1.0来写,注意action同样需要继承actionsupport,基于xml的指定方法的验证,将配置文件名改为”ActionClassName-ActionMethodName-validation.xml“即可。
Struts2中采用令牌机制来解决表单重复提交问题,产生一个随机字符串,在服务端和客户端同时保留此字符串的副本,在客户端向服务端发送请求的时候,会自动发送此副本,服务端接受到请求之后,判断本地上的令牌是否与提交上来的令牌保持一致,若一致则执行提交到数据库等业务逻辑操作。完成之后服务器端会生成新的令牌副本,而客户端没有变,此时,如果客户端再提交,那么服务端与客户端的令牌就不一致了,判定为重复提交。
1.直接在重复提交的页面添加<s:token>标签,并在struts.xml中添加拦截器栈,子节点加入 name=“token”的拦截器
在上传文件时,若只是单纯的上传文件或多个文件(使用FIile数组即可),直接在execute()方法中,利用FileUtils.copyFile方法(第一个参数是你POJO定义的file对象,例如photo。第二个参数是你上传文件的存放路径,可以存放到当前工程中,利用ServletActionContext.getContext.getRealpath(‘/upload’)+你的文件名,其中upload为你的上传的文件存放的文件夹,或者直接写上你要存放的路径全称例如D://+你的文件名)
public String
editUser()
throws IOException {
System.
out.println(
this.
photoFileName)
;
System.
out.println(
this.
photoContentType)
;
String filename = ServletActionContext.
getServletContext().getRealPath(
"/upload/" +
photoFileName)
;
File destFile =
new File(filename)
;
FileUtils.
copyFile(
photo
, destFile)
;
//struts2是将上传的文件先存储为临时文件
return
"success"
;
}
<constant
name
="struts.devMode"
value
="true"
/>
<constant
name
="struts.custom.i18n.resources"
value
="msg"
/>
<constant
name
="struts.multipart.maxSize"
value
="5242880"
/>
2.在对文件进行限制时,例如对文件名,文件大小和文件类型限制时。
(1)文件名可以直接在方法中手动操作,或者给定UUID.randomUUID.toString()来给每个文件一个不重复的id
(2)如果要限制文件的格式,可以配置fileupload拦截器,通常情况下可以将默认文件大小限制改大一点,默认为2M。
<action
name
="editUser"
class
="action.UserAction"
method
="editUser"
>
<result
name
="success"
>load.jsp
</result>
<result
name
="input"
>index.jsp
</result>
<interceptor-ref
name
="fileUpload"
>
<param
name
="allowedTypes"
>
image/jpeg/png
</param>
<param
name
="maximumSize"
>
2097152
</param>
</interceptor-ref>
<interceptor-ref
name
="defaultStack"
/>
</action>
3.下载文件时,需要在action类中创建输出流,并在配置文件中,将result 的type类型改为stram类型,默认为转发,并在子节点中配置参数,param=“inputName” 和param=“
contentDisposition” attachment;filename=${filename}
public String
execute(){
//读取文件到输出流
filename =
"1.png"
;
input = ServletActionContext.
getServletContext().getResourceAsStream(
"/upload/"+
filename)
;
return
"success"
;
}
<action
name
="download"
class
="action.DownLoadAction"
>
<result
name
="success"
type
="stream"
>
<param
name
="inputName"
>input
</param>
<param
name
="contentDisposition"
>attachment;filename=${filename}
</param>
</result>
</action>