最近学习struts2的文件上传和下载,由于书中的方法ServletActionContext.getRequest().getRealPath("/")已经过时,所以寻找了其它获取工程根目录方法。

在尝试过程中曾试过使用相对路径方法,结果相对路径为eclipse的根目录,所以此方法行不通。

由于工程路径封装在了Servlet的ServletContext中,我们可以在Action中直接访问Servlet API进行操作:struts2提供的Actioncontext不能直接访问servlet API实例,所以为了直接访问servlet API,struts2提供了如下三个接口:

1. SerlvetContextAware:实现接口的Action可以访问web应用的ServletContext实例。

2. ServletRequestAware:实现接口的Action可以访问用户请求的HttpServletRequest实例。

3. ServletResponseAware:实现接口的Action可以访问服务器响应的HttpServletResponse实例。

获取路径需要让Action实现SerlvetContextAware接口,Action代码如下:

packageorg.struts2;importjava.io.File;importjava.io.FileInputStream;importjava.io.FileOutputStream;importjavax.servlet.ServletContext;importorg.apache.struts2.util.ServletContextAware;importcom.opensymphony.xwork2.ActionContext;publicclassFileUpLoadActionimplementsServletContextAware{privateStringtitle;privateFileuploadFile;privateServletContextservletcontext;publicStringgetTitle(){returntitle;}publicvoidsetTitle(Stringtitle){this.title=title;}publicFilegetUploadFile(){returnuploadFile;}publicvoidsetUploadFile(FileuploadFile){this.uploadFile=uploadFile;}privateStringgetPath(){returnservletcontext.getRealPath("files");}publicStringexecute()throwsException{Stringname=getTitle();Stringpath=getPath()+"\\"+getTitle();FileOutputStreamfos=newFileOutputStream(path);FileInputStreamfis=newFileInputStream(getUploadFile());byte[]buffer=newbyte[1024];intlen;while((len=fis.read(buffer))>0){fos.write(buffer,0,len);}ActionContext.getContext().put("path",path);return"success";}@OverridepublicvoidsetServletContext(ServletContextarg0){this.servletcontext=arg0;}}

serlvetcontext.getRealPath("files")为获取根目录下files文件夹的路径,files文件夹必须存在,可以在action中判断是否存在该文件夹,若不存在则创建该文件夹。此函数获取的路径后不带"\\"。

若获取跟目录则将files换成"/"即可。