1.文件上传
- 掌握Struts文件上传的基本操作原理;
- 可以使用Struts完成文件的上传功能实现。
文件上传
在WEB项目中文件上传是一个必不可少的操作,前面介绍过两种上传组件的使用,分别是SmartUpload、FileUpload,这两种组件相比较起来SmartUpload更加的容易,而FileUpload却较为复杂,幸运的是在Struts中也对文件上传有所支持,而且上传使用的组件就是FileUpload,但是此时的使用比起直接使用FileUpload就要方便许多了。
如果要想正确的使用FileUpload组件完成操作,还需要依靠<html:file>标签完成,此标签核心语法如下所示:
<html:file property="对应ActionForm中的属性名称"/>
FormFile类的常用方法
No. | 方法 | 类型 | 描述 |
1 | public byte[] getFileData() throws FileNotFoundException,IOException | 普通 | 取得上传文件大小 |
2 | public InputStream getInputStream() throws FileNotFoundException,IOException | 普通 | 取得上传文件的输入流 |
3 | public int getFileSize() | 普通 | 取得上传文件的大小 |
4 | public String getFileName() | 普通 | 取得上传文件的名称 |
5 | public String getContentType() | 普通 | 取得上传文件的类型 |
定义表单 —— upload.jsp
<%@ page language="java" pageEncoding="GBK"%><%@ taglib uri="http://www.mldn.cn/struts/bean" prefix="bean"%><%@ taglib uri="http://www.mldn.cn/struts/html" prefix="html"%><%@ taglib uri="http://www.mldn.cn/struts/logic" prefix="logic"%><html:html lang="true"><head> <title>文件上传</title></head><body> <html:form action="/ch17/upload.do" method="post" enctype="multipart/form-data"> 请选择要上传的文件;<html:file property="photo"/> <html:submit value="上传"></html:submit> </html:form></body></html:html>
定义ActionForm,接收上传文件 —— UploadForm.java
package org.lxh.struts.form;import javax.servlet.http.HttpServletRequest;import org.apache.struts.action.ActionErrors;import org.apache.struts.action.ActionForm;import org.apache.struts.action.ActionMapping;import org.apache.struts.upload.FormFile;public class UploadForm extends ActionForm { private FormFile photo ; // 接收上传文件 public ActionErrors validate(ActionMapping mapping, HttpServletRequest request) { // 暂不验证 return null; } public void reset(ActionMapping mapping, HttpServletRequest request) { } public FormFile getPhoto() { return photo; } public void setPhoto(FormFile photo) { this.photo = photo; }}
定义Action —— UploadAction.java
public class UploadAction extends Action { public ActionForward execute(ActionMapping mapping, ActionForm form, HttpServletRequest request, HttpServletResponse response) { UploadForm uploadForm = (UploadForm) form; IPTimeStamp its = new IPTimeStamp(request.getRemoteAddr()); // 自动生成文件名 String fileName = its.getIPTimeRand() + "." + uploadForm.getPhoto().getFileName().split("\\.")[uploadForm .getPhoto().getFileName().split("\\.").length - 1];// 生成文件名 File outFile = new File(super.getServlet().getServletContext() .getRealPath("/") + "upload"+ File.separator + uploadForm.getPhoto().getFileName().split("\\.")); // 输出文件路径 try{ OutputStream output = new FileOutputStream(outFile) ; // 文件输出 byte data[] = new byte[1024] ; // 接收文件 int temp = 0 ; // 结束判断 while ((temp = uploadForm.getPhoto().getInputStream() .read(data, 0, 1024)) != -1) { // 分块保存 output.write(data) ; // 保存文件 } output.close() ; // 关闭输出 }catch(Exception e){ e.printStackTrace() ; // 错误输出 } return null; }}
配置struts-config.xml文件
<struts-config> <form-beans> <form-bean name="uploadForm" type="org.lxh.struts.form.UploadForm" /> </form-beans> <action-mappings> <action attribute="uploadForm" input="/upload.jsp" name="uploadForm" path="/upload" scope="request" type="org.lxh.struts.action.UploadAction" /> </action-mappings></struts-config>
这样就可以很方便的完成文件上传操作。
2.怎么配置动态ActionForm?
在正常操作中,每一个Action必须对应一个ActionForm,但是这样一来就会造成ActionForm过多的情况,所以为了解决此类问题,在Struts中专门提供了动态ActionForm,以解决ActionForm过多的问题。
动态ActionForm对应的操作类是:org.apache.struts.action.DynaActionForm,使用此类时,不需要定义具体的类,只需要在struts-config.xml文件中配置即可。
配置一个动态ActionForm,包含两个属性 —— struts-config.xml
<struts-config> <form-beans> <form-bean name="newsForm" type="org.apache.struts.action.DynaActionForm"> <form-property name="title" type="java.lang.String"> </form-property> <form-property name="content" type="java.lang.String"> </form-property> </form-bean> </form-beans> <action-mappings> <action attribute="newsForm" input="/ch17/news.jsp" name="newsForm" path="/ch17/news" scope="request" type="org.lxh.struts.action.NewsAction" /> </action-mappings></struts-config>
定义输入表单 —— news.jsp
<%@ page language="java" pageEncoding="GBK"%><%@ taglib uri="http://www.mldn.cn/struts/bean" prefix="bean"%><%@ taglib uri="http://www.mldn.cn/struts/html" prefix="html"%><%@ taglib uri="http://www.mldn.cn/struts/logic" prefix="logic"%><html:html lang="true"><head> <title>动态actionForm</title></head><body> <html:form action="/ch17/news.do" method="post"> 标题:<html:text property="title"/><br> 内容:<html:text property="content"/><br> <html:submit value="提交"/><html:reset value="重置"/> </html:form></body></html:html>
接收参数 —— NewsAction.java
package org.lxh.struts.action;import javax.servlet.http.HttpServletRequest;import javax.servlet.http.HttpServletResponse;import org.apache.struts.action.Action;import org.apache.struts.action.ActionForm;import org.apache.struts.action.ActionForward;import org.apache.struts.action.ActionMapping;import org.apache.struts.action.DynaActionForm;public class NewsAction extends Action { public ActionForward execute(ActionMapping mapping, ActionForm form, HttpServletRequest request, HttpServletResponse response) { DynaActionForm dynaForm = (DynaActionForm) form ; String title = dynaForm.getString("title") ; // 取得title输入内容 String content = dynaForm.getString("content") ; // 取得content输入内容 System.out.println("title --> " + title) ; // 输出title内容 System.out.println("content --> " + content); // 输出content内容 return null; }}
动态ActionForm依靠配置完成,可以解决ActionForm过多的问题,但是ActionForm本身依然属于Struts的最大弱点。