Struts2预置了大量的拦截器,见struts-default.xml第122行。
有一部分拦截器是Struts2框架自身用到的,必须引用,这些拦截器打包在basicStack中,我们项目中引用的拦截器,不能少于basicStack中注册的拦截器。有一部分拦截器是最常用的,它们被打包在defaultStack中,该拦截器栈是Struts2默认引用的,我们不需要在Action中做任何处理,就相当于引用了这个拦截器栈。
注意:一旦我们在action配置下引用了任何拦截器,那么默认引用的拦截器就失效了,所以不要丢弃默认拦截器的引用。
下面的例子就是使用这个默认拦截器里面带的fileUpload拦截器所实现的功能。
首先导入下图所示jar包:
编写Action代码如下:
public class FileUpload { /** 接收拦截器传入的临时文件 **/ private File material; /** 接收拦截器注入的原始文件名,这个名字命名的规则是: File类型属性+FileName **/ private String materialFileName; public String getMaterialFileName() { return materialFileName; } public void setMaterialFileName(String materialFileName) { this.materialFileName = materialFileName; } public File getMaterial() { return material; } public void setMaterial(File material) { this.material = material; } public String upload() { //打印一下源文件的名称,验证是否得到了上传时文件的名称 System.out.println(materialFileName); //构建一个路径 String path = "/WEB-INF/upload/" + UUID.randomUUID(); //通过构建的路径得到一个在操作系统的真实路径 path = ServletActionContext.getServletContext().getRealPath(path); //把一个文件复制到指定的目录,FileUtil这个工具类源码在群(102992282)文件下载 FileUtil.copy(material, new File(path)); ServletActionContext.getRequest().setAttribute("message", "success"); return "message"; } }
<!-- struts上传文件最大值默认限制为2097152B,就是2M 如果想更改这个值可在struts.xml中配置如下 代码: <constant name="struts.multipart.maxSize" value="" /> --> <package name="material" namespace="/material" extends="struts-default"> <action name="uploadUI"> <result name="success"> /WEB-INF/page/upload.jsp </result> </action> <action name="upload" class="hxl.insist.FileUpload" method="upload"> <result name="message"> /WEB-INF/page/message.jsp </result> </action> </package>
jsp代码如下:
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> <html> <head> <title></title> </head> <body> <form action="upload" method="post" enctype="multipart/form-data"> <input type="file" name="material"/> <input type="submit" value="commit" /> </form> </body> </html>