原本想先寫一下JAVA的反射機制的,整了兩天,感受沒整出個簡單和思路出來,想來,算了,後面再整吧。想一想,今天在支持使用Struts2框架開發的時候,發現基本的使用仍是有些生疏,仍是先小結一下Struts2的基本用法吧。 html
準備工做當是準備使用框架時使用的包,具體以下: 前端
Maven工程pom.xml中添加依賴: java
<dependency> <groupId>org.apache.struts</groupId> <artifactId>struts2-core</artifactId> <version>2.3.14</version> </dependency>(如今低版本struts2有比較嚴重的問題,不過用於Demo學習仍是能夠的,應該不會沒事把Demo應用掛到公網的,固然,想感覺一下struts2所帶來的安全風暴,也能夠放上去感覺感覺的,哈哈哈!!!)
struts2-core-2.3.14.jar
xwork-core-2.3.14.jar
commons-lang3-3.1.jar
asm-3.3.jar
asm-commons-3.3.jar
asm-tree-3.3.jar
freemarker-2.3.19.jar
ognl-3.0.6.jar
javassist-3.11.0.GA.jar
commons-fileupload-1.2.2.jar
commons-io-2.0.1.jar web
添加依賴後Maven包裏多了這幾個包,沒有建Maven工程的項目應用把這幾個包引入應用也沒問題的。(固然也有意外,具體就看人品了,沒試過,哪天中招了再說,^_^) apache
總的來講,Struts2使用時候大格局配置比較簡單: json
(1)web.xml配置:配置struts2的過濾器,用於請求的攔截,並按struts2自定義的流程去走(好像這個過濾器一般被稱爲Struts2請求分發器); api
(2)struts.xml:基本功能就是配置請求與處理類、處理類處理結果與響應內容的映射關係; 瀏覽器
(3)請求處理類:用於處理接收的請求,在struts.xml裏把請求action名稱與處理類映射上。 安全
Demo源碼以下: 服務器
web.xml文件:
<?xml version="1.0" encoding="utf-8"?> <web-app version="2.4" xmlns="http://java.sun.com/xml/ns/j2ee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd"> <display-name>Archetype Created Web Application</display-name> <filter> <filter-name>struts2</filter-name> <filter-class> org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter </filter-class> </filter> <filter-mapping> <filter-name>struts2</filter-name> <url-pattern>/*</url-pattern> </filter-mapping> <welcome-file-list> <welcome-file>error.jsp</welcome-file> </welcome-file-list> </web-app>
struts.xml配置文件:
<?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE struts PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 2.0//EN" "http://struts.apache.org/dtds/struts-2.0.dtd"> <struts> <!-- package的name屬性在我看來沒什麼用處,感受只是爲了配置的繼承方便而已 --> <!-- struts-default是一個struts框架包中自定的一個package, --> <!-- 在struts2-core包中的struts-default.xml進行定義 --> <!-- namespace如今的理解是URL除去域名和請求文件名後每剩下的那一部分 --> <!-- 處理URL:http://localhost/fristDemo.action --> <package name="demo1" namespace="/" extends="struts-default"> <!-- name是action的名稱 --> <!-- class對應請求爲firstDemo.action的處理對象類型 --> <!-- 還有一個method屬性省略了,默認是execute,即,下面這個配置至關於:: --> <!-- <action name="fristDemo" class="tutorial.demo.DemoAction" method="execute"> --> <action name="firstDemo" class="tutorial.demo.action.DemoAction"> <result name="success">/demo1Success.jsp</result> <result name="error">/demo1Fail.jsp</result> </action> </package> <!-- 處理URL:http://localhost/test/secondDemo.action --> <package name="demo2" namespace="/test" extends="struts-default"> <action name="secondDemo" class="tutorial.demo.action.DemoAction" method="sayHello"> <result name="success">/demo2Success.jsp</result> <result name="error">/demo2Fail.jsp</result> </action> </package> </struts>DemoAction.java請求處理類:
package tutorial.demo.action; import com.opensymphony.xwork2.ActionSupport; public class DemoAction extends ActionSupport { // 在struts。xml配置文件中, 若是不指定action對應的執行方法, // 則默認執行該action對應的方法名爲execute的方法 public String execute() { System.out.println("默認調用方法!"); return "success"; } public String sayHello() { System.out.println("配置文件中指定調用方法!"); return "success"; } }
其它jsp文件:略。
在struts2框下,在處理類中獲取前端輸入的參數有兩種方式:
(1)非IOC方式(感觀上講是經過HttpServletRequest對象獲取)
既然是經過HttpServletRequest對象獲取,首先要作的是獲取HttpServletRequest對象,而後再從HttpServletRequest對象中讀取相應名稱的參數,具體看以下處理類的修改後的代碼:
添加jar包:
servlet-api-2.5-6.1.14.jar
Maven依賴:
<dependency> <groupId>org.mortbay.jetty</groupId> <artifactId>servlet-api-2.5</artifactId> <version>6.1.14</version> </dependency>
DemoAction.java請求處理類(1):
package tutorial.demo.action; import javax.servlet.http.HttpServletRequest; import org.apache.struts2.ServletActionContext; import com.opensymphony.xwork2.ActionContext; import com.opensymphony.xwork2.ActionSupport; public class DemoAction extends ActionSupport { // 在struts。xml配置文件中, 若是不指定action對應的執行方法, // 則默認執行該action對應的方法名爲execute的方法 public String execute() { System.out.println("默認調用方法!"); return "success"; } public String sayHello() { System.out.println("配置文件中指定調用方法!"); // 取Action上下文 ActionContext context = ActionContext.getContext(); // 從上下文中取出Http請求對象,請求對象中保存了請求的全部內容 HttpServletRequest request = (HttpServletRequest)context.get(ServletActionContext.HTTP_REQUEST); // 請求對象中取出參數username的值 String username = request.getParameter("username"); // 請求對象中取出參數password的值 String password = request.getParameter("password"); // 輸出請求參數 System.out.println("前端輸入的參數是: " + username + "和 " + password); return "success"; } }
如請求URL:
http://localhost/test/secondDemo.action?username=demo&password=123456
Console打印結果:
配置文件中指定調用方法!
前端輸入的參數是: demo和 123456
固然,爲了方便,獲取HttpServletRequest的方式能夠經過繼承ServletRequestAware接口,並實現相應的方法便可,具體以下:
DemoAction.java請求處理類(2):
package tutorial.demo.action; import javax.servlet.http.HttpServletRequest; import org.apache.struts2.ServletActionContext; import org.apache.struts2.interceptor.ServletRequestAware; import com.opensymphony.xwork2.ActionContext; import com.opensymphony.xwork2.ActionSupport; public class DemoAction extends ActionSupport implements ServletRequestAware { private HttpServletRequest request; // 在struts。xml配置文件中, 若是不指定action對應的執行方法, // 則默認執行該action對應的方法名爲execute的方法 public String execute() { System.out.println("默認調用方法!"); return "success"; } public String sayHello() { System.out.println("配置文件中指定調用方法!"); // 請求對象中取出參數username的值 String username = request.getParameter("username"); // 請求對象中取出參數password的值 String password = request.getParameter("password"); // 輸出請求參數 System.out.println("前端輸入的參數是: " + username + "和 " + password); return "success"; } // 繼承ServletRequestAware實現的方法 public void setServletRequest(HttpServletRequest request) { this.request = request; } }
第三種獲HttpServletRequest對象的方式:
HttpServletRequest requst = ServletActionContext.getRequest();
從代碼簡潔程序方面來說,獲取HttpServletRequest的方式,繼承ServletRequestAware接口最優(第二種),ServletActionContext獲取次之(第三種),ActionContext獲取最差(第一種)。
(好了,回到正題,繼續咱們從前端獲取參數的方式!!!!!)
(2)IOC方式(感觀上講是經過struts2框架的自動賦值方式獲取)
IOC方式代碼很簡單,先看具體代碼:
DemoAction.java請求處理類:
package tutorial.demo.action; import com.opensymphony.xwork2.ActionSupport; public class DemoAction extends ActionSupport { private String aa; private int bb; // username對應set方法 public void setUsername(String username) { this.aa = username; } // password對應set方法 public void setPassword(int password) { this.bb = password; } // 在struts。xml配置文件中, 若是不指定action對應的執行方法, // 則默認執行該action對應的方法名爲execute的方法 public String execute() { System.out.println("默認調用方法!"); return "success"; } public String sayHello() { System.out.println("配置文件中指定調用方法!"); // 輸出請求參數 System.out.println("前端輸入的參數是: " + aa + "和 " + bb); return "success"; } }
在效果上與以前是同樣的,如請求URL:
http://localhost/test/secondDemo.action?username=demo&password=123456
Console打印結果:
配置文件中指定調用方法!
前端輸入的參數是: demo和 123456
說明,IOC方式須要作如下事情:
a. 在處理類(DemoAction)中添加用於接收參數值的變量:
b. 給添加的變量配上相應的setter方法(注意方法名構成:set + 轉入參數名第一個字母的大寫形式 + 轉入參數名第二個字母之後的字符[含第二個])。(如轉入參數名爲:username,對應setter名爲:setUsername)
以下,對應的配置這個以後,就可自動接收前端傳過來名爲username和password的參數,其中username爲字符串,password被解析爲整型:
private String aa; private int bb; // username對應set方法 public void setUsername(String username) { this.aa = username; } // password對應set方法 public void setPassword(int password) { this.bb = password; }
(爲何這麼隨意地使用個aa、bb的變量名,太丟廣大碼農的臉了!!!其實我是無辜的,爲了不把setter與變量名想固然地關係起來,只好忍痛弄個aa、bb的變量來接收數據,而沒有使用優雅的username和password!!!!!!)
這一節的標題有點太俗了一些,官方的說法應該是:數據輸出到視圖資源(哎,這就小菜和大鳥的區別啊)。
原理:
首先,咱們要了解一些事實:
a. HttpServlet對象(包括HttpServletRequest、HttpServletResponse)存在於服務器請求響應的整個生命週期中(粗劃分);(java web基本知識)
b. 在java中,只要咱們獲取一個對象,咱們就能夠獲取與改變這個對象裏開放的信息;(java基本知識)
c. 咱們能夠在Action類(處理類)和jsp文件最終轉化的servlet都獲取HttpServlet對象;(struts2知識、jsp與servlet關係)
d. Action類與jsp文件最終轉化的servlet處理於同一個請求響應的生命週期;(java web、struts2基本知識)
e. jsp文件最終轉化的servlet處理時間在Action類的後面。(java web、struts2基本知識)
(以上「事實」理解有誤之處,望指點,謝謝!!!^_^)
到如今,已經很明瞭了,也就是:
咱們能夠在Action類中獲取HttpServlet對象(事實c),把數據放到HttpServlet對象中(事實b),而後在jsp文件中獲取HttpServlet對象(事實c),把Action類放入的數據從HttpServlet對象中取出(事實b)。
因而,咱們也就獲得了下面的數據轉遞的例子(數據從DemoAction轉到demo2Success.jsp)。
實例:
DemoAction.java請求處理類:
package tutorial.demo.action; import javax.servlet.http.HttpServletRequest; import org.apache.struts2.interceptor.ServletRequestAware; import com.opensymphony.xwork2.ActionSupport; public class DemoAction extends ActionSupport implements ServletRequestAware { private HttpServletRequest request; // 繼承ServletRequestAware必須實現的request的setter方法 public void setServletRequest(HttpServletRequest request) { this.request = request; } // 在struts。xml配置文件中, 若是不指定action對應的執行方法, // 則默認執行該action對應的方法名爲execute的方法 public String execute() { System.out.println("默認調用方法!"); return "success"; } public String sayHello() { // 將要轉遞的數據 String aa = "Demo"; int bb = 123456; // 把數據放到HttpServletRequest中 request.setAttribute("username", aa); request.setAttribute("password", bb); return "success"; } }demo2Success.jsp:
<%@ page language="java" contentType="text/html; charset=ISO-8859-1" pageEncoding="utf-8"%> <% String username = (String)request.getAttribute("username"); Integer password = (Integer)request.getAttribute("password"); // 設置輸出字符串編碼,與數據轉遞主題無關 response.setContentType("text/html;charset=gbk"); out.println("在jsp中輸出從Action轉遞的數據:" + username + "和" + password.toString() ); %>輸出結果:
本例中使用的是HttpServletRequest對象進行傳遞,除此外也可使用其它對象傳遞,前提是:該對象在Action與jsp文件最終轉化的servlet均可以獲取而且能夠改變其數據(如:session對象、application對象、context對象等)。
在講述響應返回JSON格式數據方式以前,我以爲有必要處理一個問題:「JSON格式數據與咱們通常返回的HTML頁面數據有什麼區別?」
JSON格式數據是什麼樣的數據?說到底,JSON格式數據就是一個按JSON規範整出來的字符串,在後臺處理時,它就是一個普通的字符串;
HTML頁面數據是什麼樣的數據?同樣的,不一樣點是,HTML頁面數據是按HTML規範整出來的字符串,在前端瀏覽器,它解析成一個個好看的WEB頁面,那是瀏覽器的功勞,在後臺處理時,它也是一個普通的字符串。
在web服務器處理請求過程當中,在響應的過程當中,無論理是JSON格式數據仍是HTML頁面數據,web服務器識別的都只是一個字符串,作的都是隻是把字符串返回給請求端。
既然這樣,那麼是否是能夠像返回HTML頁面數據同樣響應返回JSON格式數據呢?答案是確定的!!!^_^
下面是和常見的響應方式同樣的返回JSON數據的方法(或把數據放到Response響應對象的方式):
(1)servlet方式(直接獲取HttpServletResponse對象獲取輸出流寫入數據):
DemoAction.java請求處理類:
package tutorial.demo.action; import java.io.IOException; import java.io.PrintWriter; import javax.servlet.http.HttpServletResponse; import org.apache.struts2.interceptor.ServletResponseAware; import com.opensymphony.xwork2.ActionSupport; public class DemoAction extends ActionSupport implements ServletResponseAware { private HttpServletResponse response; // 繼承ServletResponseAware必須實現的response的setter方法 public void setServletResponse(HttpServletResponse response) { this.response = response; } // 在struts。xml配置文件中, 若是不指定action對應的執行方法, // 則默認執行該action對應的方法名爲execute的方法 public String execute() { System.out.println("默認調用方法!"); return "success"; } public void sayHello() { // 向瀏覽器發送一個響應頭,設置瀏覽器的解碼方式爲UTF-8 response.setHeader("Content-type", "text/html;charset=UTF-8"); try { // 構造json字符串 String json = "{\"username\": \"Demo\", \"birthdate\": \"2013-08-03\"}"; PrintWriter out = response.getWriter(); out.println(json); out.flush(); out.close(); } catch (IOException e) { e.printStackTrace(); } // 注意,這裏是沒有返回 } }
<?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE struts PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 2.0//EN" "http://struts.apache.org/dtds/struts-2.0.dtd"> <struts> <!-- package的name屬性在我看來沒什麼用處,感受只是爲了配置的繼承方便而已 --> <!-- struts-default是一個struts框架包中自定的一個package, --> <!-- 在struts2-core包中的struts-default.xml進行定義 --> <!-- namespace如今的理解是URL除去域名和請求文件名後每剩下的那一部分 --> <!-- 處理URL:http://localhost/fristDemo.action --> <package name="demo1" namespace="/" extends="struts-default"> <!-- name是action的名稱 --> <!-- class對應請求爲firstDemo.action的處理對象類型 --> <!-- 還有一個method屬性省略了,默認是execute,即,下面這個配置至關於:: --> <!-- <action name="fristDemo" class="tutorial.demo.DemoAction" method="execute"> --> <action name="firstDemo" class="tutorial.demo.action.DemoAction"> <result name="success">/demo1Success.jsp</result> <result name="error">/demo1Fail.jsp</result> </action> </package> <!-- 處理URL:http://localhost/test/secondDemo.action --> <package name="demo2" namespace="/test" extends="struts-default"> <action name="secondDemo" class="tutorial.demo.action.DemoAction" method="sayHello"> <!-- 注意:這裏不用添加result標籤 --> </action> </package> </struts>
(2)正常struts2映射jsp(或其它視圖文件)返回方式 :
DemoAction.java請求處理類:
package tutorial.demo.action; import java.io.IOException; import java.io.PrintWriter; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import org.apache.struts2.interceptor.ServletRequestAware; import org.apache.struts2.interceptor.ServletResponseAware; import com.opensymphony.xwork2.ActionSupport; public class DemoAction extends ActionSupport implements ServletRequestAware { private HttpServletRequest request; // 繼承ServletRequestAware必須實現的request的setter方法 public void setServletRequest(HttpServletRequest request) { this.request = request; } // 在struts。xml配置文件中, 若是不指定action對應的執行方法, // 則默認執行該action對應的方法名爲execute的方法 public String execute() { System.out.println("默認調用方法!"); return "success"; } public String sayHello() { // 構造json字符串 String json = "{\"username\": \"Demo\", \"birthdate\": \"2013-08-03\"}"; request.setAttribute("json", json); return "success"; } }strtus.xml(主要是相應的secondDemo對應Action的配置有所修改):
<?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE struts PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 2.0//EN" "http://struts.apache.org/dtds/struts-2.0.dtd"> <struts> <!-- package的name屬性在我看來沒什麼用處,感受只是爲了配置的繼承方便而已 --> <!-- struts-default是一個struts框架包中自定的一個package, --> <!-- 在struts2-core包中的struts-default.xml進行定義 --> <!-- namespace如今的理解是URL除去域名和請求文件名後每剩下的那一部分 --> <!-- 處理URL:http://localhost/fristDemo.action --> <package name="demo1" namespace="/" extends="struts-default"> <!-- name是action的名稱 --> <!-- class對應請求爲firstDemo.action的處理對象類型 --> <!-- 還有一個method屬性省略了,默認是execute,即,下面這個配置至關於:: --> <!-- <action name="fristDemo" class="tutorial.demo.DemoAction" method="execute"> --> <action name="firstDemo" class="tutorial.demo.action.DemoAction"> <result name="success">/demo1Success.jsp</result> <result name="error">/demo1Fail.jsp</result> </action> </package> <!-- 處理URL:http://localhost/test/secondDemo.action --> <package name="demo2" namespace="/test" extends="struts-default"> <action name="secondDemo" class="tutorial.demo.action.DemoAction" method="sayHello"> <result name="success">/json.jsp</result> <result name="error">/error.jsp</result> </action> </package> </struts>json.jsp:
<%@ page language="java" contentType="text/html; charset=ISO-8859-1" pageEncoding="utf-8"%> <%@ taglib prefix="s" uri="/struts-tags" %> ${request.json}(3)使用struts2提供的json插件功能
在前面的兩個方法中,構造json串的話都是咱們本身構造的,在方法(3)中,咱們將使用到struts2的json插件功能,自動地把咱們的對象轉化爲json字符串返回給前端,具休實例以下:
DemoAction.java請求處理類(添加jsonTest方法):
package tutorial.demo.action; import java.io.IOException; import java.io.PrintWriter; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; import javax.servlet.http.HttpServletRequest; import org.apache.struts2.interceptor.ServletRequestAware; import com.opensymphony.xwork2.ActionSupport; public class DemoAction extends ActionSupport implements ServletRequestAware { private HttpServletRequest request; private Map<String, Object> dataMap = new HashMap<String, Object>(); public Map<String, Object> getDataMap() { return dataMap; } public void setDataMap(Map<String, Object> dataMap) { this.dataMap = dataMap; } // 繼承ServletRequestAware必須實現的request的setter方法 public void setServletRequest(HttpServletRequest request) { this.request = request; } // 在struts。xml配置文件中, 若是不指定action對應的執行方法, // 則默認執行該action對應的方法名爲execute的方法 public String execute() { System.out.println("默認調用方法!"); return "success"; } public String sayHello() { // 構造json字符串 String json = "{\"username\": \"Demo\", \"birthdate\": \"2013-08-03\"}"; request.setAttribute("json", json); return "success"; } public String jsonTest() { Person person1 = new Person("Jack", 170, 100); Person person2 = new Person("Lucy", 160, 90); Person person3 = new Person("Lili", 165, 95); Person person4 = new Person("Cray", 186, 130); List<Person> personList = new ArrayList<Person>(); personList.add(person1); personList.add(person2); personList.add(person3); personList.add(person4); dataMap.put("status", "success"); dataMap.put("personList", personList); return "success"; } }
struts.xml(添加jsonAction.action的處理配置):
<?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE struts PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 2.0//EN" "http://struts.apache.org/dtds/struts-2.0.dtd"> <struts> <!-- package的name屬性在我看來沒什麼用處,感受只是爲了配置的繼承方便而已 --> <!-- struts-default是一個struts框架包中自定的一個package, --> <!-- 在struts2-core包中的struts-default.xml進行定義 --> <!-- namespace如今的理解是URL除去域名和請求文件名後每剩下的那一部分 --> <!-- 處理URL:http://localhost/fristDemo.action --> <package name="demo1" namespace="/" extends="struts-default"> <!-- name是action的名稱 --> <!-- class對應請求爲firstDemo.action的處理對象類型 --> <!-- 還有一個method屬性省略了,默認是execute,即,下面這個配置至關於:: --> <!-- <action name="fristDemo" class="tutorial.demo.DemoAction" method="execute"> --> <action name="firstDemo" class="tutorial.demo.action.DemoAction"> <result name="success">/demo1Success.jsp</result> <result name="error">/demo1Fail.jsp</result> </action> </package> <!-- 處理URL:http://localhost/test/secondDemo.action --> <package name="demo2" namespace="/test" extends="struts-default"> <action name="secondDemo" class="tutorial.demo.action.DemoAction" method="sayHello"> <result name="success">/json.jsp</result> <result name="error">/error.jsp</result> </action> </package> <!-- 自動把action中的dataMap轉化爲json字符串的配置 --> <package name="json" namespace="/json" extends="json-default"> <action name="jsonAction" class="tutorial.demo.action.DemoAction" method="jsonTest"> <result type="json"> <param name="root">dataMap</param> </result> </action> </package> </struts>
配置總結:
在配置利用struts2的json插件自動將對象以json字符串返回時須要作如下幾件事:
a. 添加struts2的json插件包及相應依賴:
Maven工程的pom.xml文件添加依賴:
<dependency> <groupId>org.apache.struts</groupId> <artifactId>struts2-json-plugin</artifactId> <version>2.3.14</version> </dependency>b. 定義一個對象用於構造json對象(即最終將被插件轉成json串的字符串,如例中的:dataMap);
c. struts.xml添加一個繼承json-default的包(package),並進行相應的輸出配置。
(這裏講的是使用struts2進行json字符串返回最基本的配置,還有基本功能的配置具體可查看官方文檔。)
注:無論web應用有沒有使用struts框架,無論在servlet處理類,仍是在JSP文件中(JSP文件最後也是被轉化爲一個servlet類的),在響應處理上的本質都是同樣的,都是把響應的字符串寫入HttpServletResponse對象中,web服務器在向前端響應時,就從HttpServletResponse對象中取出響應數據,返回給發起請求的前端。
文件上傳功能的基本功能實現和struts2的基本映射功能是同樣的,只是上傳功能爲實現一些額外功能,存在它一些特有的配置項目而已,基本上傳框架以下:
UploadDemoAction.java上傳請求處理類:
package tutorial.demo.action; import java.io.File; import java.io.IOException; import org.apache.commons.io.FileUtils; import com.opensymphony.xwork2.ActionSupport; public class UploadDemoAction extends ActionSupport { private File file; private String fileName; private String fileContentType; public String fileUpload() { // 文件保存路徑 File savefile = new File("c:\\test.txt"); try { // 複製臨時文件到指定文件中 FileUtils.copyFile(file, savefile); } catch (IOException e) { e.printStackTrace(); } return "success"; } public File getFile() { return file; } public void setFile(File file) { this.file = file; } public String getFileName() { return fileName; } public void setFileName(String fileName) { this.fileName = fileName; } public String getFileContentType() { return fileContentType; } public void setFileContentType(String fileContentType) { this.fileContentType = fileContentType; } }struts.xml添加配置以下:
<!-- 上傳功能添加配置 --> <package name="upload" namespace="/upload" extends="struts-default"> <action name="fileUpload" class="tutorial.demo.action.UploadDemoAction" method="fileUpload"> <result name="success">/upload.jsp</result> <result name="fail">/error.jsp</result> </action> </package>upload.jsp(上傳前端頁面):
<%@ page language="java" contentType="text/html; charset=utf-8" pageEncoding="utf-8" %> <%@ taglib prefix="s" uri="/struts-tags" %> <form enctype="multipart/form-data" action="upload/fileUpload.action" method="post"> 請選擇上傳文件: <input type="file" name="file" /> <input type="submit" value="submit" /> </form>