編寫首頁,給出鏈接,并獲得Token —— index.jsp<%@ page language="java" pageEncoding="GBK"%><html><head> <title>獲得Token </title></head><body> <h3><a href="tokenforward.do">獲取Token,輸入數據</a></h3></body></html>
編寫ActionForm —— TokenforwardForm.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;public class TokenforwardForm extends ActionForm { public ActionErrors validate(ActionMapping mapping, HttpServletRequest request) { return null; } public void reset(ActionMapping mapping, HttpServletRequest request) { }}定義接收輸入數據的Action —— InputAction.java
package org.lxh.struts.action;import org.lxh.struts.form.InputForm;public class InputAction extends Action { public ActionForward execute(ActionMapping mapping, ActionForm form, HttpServletRequest request, HttpServletResponse response) { InputForm inputForm = (InputForm) form; if (super.isTokenValid(request)) { // 如果設置的Token正確,則輸出內容 System.out.修改struts-config.xml配置文件
<form-beans> <form-bean name="tokenforwardForm" type="org.lxh.struts.form.TokenforwardForm" /> <form-bean name="inputForm" type="org.lxh.struts.form.InputForm" /> </form-beans> <action-mappings> <action attribute="tokenforwardForm" input="/ch17/input.jsp" name="tokenforwardForm" path="/ch17/tokenforward" scope="request" type="org.lxh.struts.action.TokenforwardAction"> <forward name="input" path="/ch17/input.jsp"></forward> </action> <action attribute="inputForm" input="/ch17/input.jsp" name="inputForm" path="/ch17/input" scope="request" type="org.lxh.struts.action.InputAction" /> </action-mappings>
編寫資源文件,添加錯誤信息 —— applicationResources.properties
# 請不要重復提交!error.token = /u8bf7/u4e0d/u8981/u91cd/u590d/u63d0/u4ea4/uff01
2.文件上傳- 掌握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() | 普通 | 取得上傳文件的類型 |
<%@ 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="mult定義ActionForm,接收上傳文件 —— UploadForm.javapackage 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.javapublic 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("http://.")[uploadForm .getPhoto().getFileName().split("http://.").length - 1];// 生成文件名 File outFile = new File(super.getServlet().getServletContext() .getRealPath("/") + "upload"+ File.separator + uploadForm.getPhoto().getFileName().split("http://.")); // 輸出文件路徑 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>這樣就可以很方便的完成文件上傳操作。
3.怎么配置動態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.javapackage 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的最大弱點。
新聞熱點
疑難解答