Struts2 Result詳解
1,Result原理
1) Result組件是Struts2中用於輸出的組件,實際上就是Java代碼。
2)Struts2中預製了10中類型的Result,這些Result什麼在struts-default.xml中。
這些類實際上都事先了統一的接口:Result.
<result-types>
<result-type name="chain" class="com.opensymphony.xwork2.ActionChainResult"/>
<result-type name="dispatcher" class="org.apache.struts2.dispatcher.ServletDispatcherResult" default="true"/>
<result-type name="freemarker" class="org.apache.struts2.views.freemarker.FreemarkerResult"/>
<result-type name="httpheader" class="org.apache.struts2.dispatcher.HttpHeaderResult"/>
<result-type name="redirect" class="org.apache.struts2.dispatcher.ServletRedirectResult"/>
<result-type name="redirectAction" class="org.apache.struts2.dispatcher.ServletActionRedirectResult"/>
<result-type name="stream" class="org.apache.struts2.dispatcher.StreamResult"/>
<result-type name="velocity" class="org.apache.struts2.dispatcher.VelocityResult"/>
<result-type name="xslt" class="org.apache.struts2.views.xslt.XSLTResult"/>
<result-type name="plainText" class="org.apache.struts2.dispatcher.PlainTextResult" />
</result-types>
3)重點講解一下類型的Result
--dispatcher (默認類型,轉發到一個頁面)
當一個請求到來,服務器直接轉發到另一個頁面,不能是另一個action。由於這個過程在服務器內部完成,客戶端(瀏覽器)並不知道,所以在地址欄不會顯示真實訪問的頁面,而顯示都是所請求的action的地址。在servlet中相當與forword轉發。
--redirect (重定向到一個頁面)。
當一個請求到來,服務端將實際地址response給瀏覽器,然後瀏覽器重新發起請求,這個過程,瀏覽器是知道訪問的頁面的實際地址的,所以在瀏覽器的地址欄顯示的是實際訪問的jsp頁面地址。但是這種類型不能重定向到一個action.
--chain 轉發到一個action,而不是頁面
--redirectAction 重定向到一個action
跳轉到其他包的action:
<action name="login" class="...">
<!-- Chain to another namespace -->
<result type="chain">
<param name="actionName">dashboard</param>
<param name="namespace">/secure</param>
</result>
</action>
使用redirectAction 帶參數
<span style="font-size: 14px; font-family: 'Microsoft YaHei', 微軟雅黑, SimHei, tahoma, arial, helvetica, sans-serif;"><action name="temp" class="com.lydia.web.action.TempAction">
<result type="redirectAction">
<param name="actionName">test.action</param>
<param name="name">${name}</param>
</result>
</action></span>
--stream
--json
4)使用方式
<result name="ok" type="類型">
</result>
2、Stream類型的Result詳解
1)Stream是用於向頁面直接輸出二進制數據,比如登陸頁面的驗證碼圖片,就可以在服務端生成,然後由這種類型的Result輸出
2) 使用
<result name="success" type="stream">
<param name="inputName">
輸出屬性名
</param>
</result>
--在struts.xml中,我們可以使用param來給組件的屬性注入默認值
--<param name="inputName">,這裏inputName對應的是StreamResult的inputName屬性,這樣配置相當於會調用StreamResult的setInputName方法給它注入屬性值。
--注入的屬性值,是Action中的某個屬性的名稱,如下圖,inputName是StreamResult中的一個屬性。在Action中作二進制輸出的屬性要求其類型爲InputStream。
-- Result會創建一個輸出流,接到Action中的輸入流,向頁面輸出。
3) 驗證碼案例:
struts.xml中配置:
<!-- 生成驗證碼的Action -->
<action name="createImage"
class="com.netctoss.action.CreateImageAction">
<result name="success" type="stream">
<param name="inputName">
imageStream
</param>
</result>
</action>
CreateImageAction.java
public class CreateImageAction
extends BaseAction {
//ouput
private InputStream imageStream;
public String execute() {
//生成驗證碼圖片
Map<String,BufferedImage> map =
ImageUtil.createImage();
//通過遍歷得到唯一生成的驗證碼
String imageCode =
map.keySet().iterator().next();
//將驗證碼記錄到session,在登錄驗證時使用
session.put("imageCode", imageCode);
//根據驗證碼,得到圖片
BufferedImage image = map.get(imageCode);
//將圖片轉換爲輸入流,由result作輸出
try {
imageStream =
ImageUtil.getInputStream(image);
} catch (IOException e) {
e.printStackTrace();
return "error";
}
return "success";
}
public InputStream getImageStream() {
return imageStream;
}
public void setImageStream(InputStream imageStream) {
this.imageStream = imageStream;
}
}
<script language="javascript" type="text/javascript">
function change(imageObj) {
imageObj.src = "createImage?date=" + new Date().getTime();
}
</script>
<tr>
<td class="login_info">驗證碼:</td>
<td class="width70"><input name="code" type="text" class="width70" /></td>
<td><img src="createImage" alt="驗證碼" title="點擊更換" onclick="change(this);"/></td>
<td><span class="required"></span></td>
</tr>
BaseAction.java 實現接口SessionAware
/**
* 所有Action的父類,可以將通用的代碼
* 提取出來放到父類中。
* 這裏,我們讓BaseAction實現接口SessionAware,
* 那麼繼承與BaseAction的Action就相當於實現了
* 這個接口。在實例化Action之後,Struts2會自動
* 調用setSession方法把session注入給Action,
* 這裏我們利用全局變量session來接收,Action
* 可以在調用業務方法時使用它來調用session。
*/
public class BaseAction implements SessionAware {
protected Map<String, Object> session;
public void setSession(Map<String, Object> session) {
this.session = session;
}
}
3、Json類型的Result詳解
1) 向頁面輸出json格式的字符串
2) struts2 並沒有預製這種類型的Result,但是他非常常用,往往用於頁面的異步校驗。
3) 使用步驟
a,導包:struts2-json-plugin-2.1.8.1.jar
b,struts.xml中將要使用json類型Result的package繼承json-default
c,在struts.xml中配置result
--最常用,只是輸出單個屬性
<result name="success" type="json" >
<param name="root">
指定Action的一個屬性名
<param>
</result>
注意: name="root"是固定用法;
如指定的屬性是boolean類型,那麼Result會把這個屬性做成字符串"true";
如指定的屬性是JavaBean,那麼Result會把這個屬性做成字符串{"code":"12"}
--輸出多個屬性
<result name="success" type="json">
<param name="includeProperties">
屬性名1,屬性名2,...
</param>
</result>
注意:Result會將這一組屬性做成一個json輸出,
如Action中有屬性code="aaa",name="zs"
可以將這2個屬性做成一個json
{"code":"aaa","name":"zs"}
--輸出Action中的所有屬性
<result name="success" type="json">
</result>
注意:Result會將Action中所有的屬性做成一個
json輸出{"":"","":""}