struts2簡單使用

原本想先寫一下JAVA的反射機制的,整了兩天,感受沒整出個簡單和思路出來,想來,算了,後面再整吧。想一想,今天在支持使用Struts2框架開發的時候,發現基本的使用仍是有些生疏,仍是先小結一下Struts2的基本用法吧。 html

0、準備

準備工做當是準備使用框架時使用的包,具體以下: 前端

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

一、struts框架使用的基本應用佈局

總的來講,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文件:略。


二、使用struts框架應用處理類中獲取前端輸入參數的方式

在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!!!!!!)


三、使用struts框架應用請求處理類中數據傳到jsp頁面的方式

這一節的標題有點太俗了一些,官方的說法應該是:數據輸出到視圖資源(哎,這就小菜和大鳥的區別啊)。

原理:

首先,咱們要了解一些事實:

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對象等)。


四、使用struts框架應用返回JSON數據的方式

在講述響應返回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();
		}
		// 注意,這裏是沒有返回
	}

}


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標籤 -->
		</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對象中取出響應數據,返回給發起請求的前端。

五、使用struts框架應用實現上轉功能的相關配置

文件上傳功能的基本功能實現和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>
相關文章
相關標籤/搜索