生活随笔
收集整理的這篇文章主要介紹了
Struts2 Result详解
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
1,Result原理
?1) Result組件是Struts2中用于輸出的組件,實際上就是Java代碼。
?2)Struts2中預制了10中類型的Result,這些Result什么在struts-default.xml中。
? ? 這些類實際上都事先了統一的接口:Result.
Java代碼 ?
<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:
?
Java代碼 ?
<action?name="login"?class="...">??????????<!--?Chain?to?another?namespace?-->??????????<result?type="chain">??????????????<param?name="actionName">dashboard</param>??????????????<param?name="namespace">/secure</param>??????????</result>??????</action>??
使用redirectAction 帶參數
Java代碼 ?
<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中配置:
Java代碼 ?
<!--?生成驗證碼的Action?-->??????????<action?name="createImage"??????????????class="com.netctoss.action.CreateImageAction">??????????????<result?name="success"?type="stream">??????????????????<param?name="inputName">??????????????????????imageStream??????????????????</param>??????????????</result>??????????</action>??
?
? ? CreateImageAction.java
Java代碼 ?
public?class?CreateImageAction???????extends?BaseAction?{??????????????????private?InputStream?imageStream;????????????public?String?execute()?{????????????????????Map<String,BufferedImage>?map?=???????????????ImageUtil.createImage();????????????????????String?imageCode?=???????????????map.keySet().iterator().next();????????????????????session.put("imageCode",?imageCode);????????????????????BufferedImage?image?=?map.get(imageCode);????????????????????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;??????}????}??
?
?
Java代碼 ?
<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="點擊更換"?οnclick="change(this);"/></td>?????????<td><span?class="required"></span></td>????????????????</tr>???????
? BaseAction.java?實現接口SessionAware
Java代碼 ?
???????????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
? ? ? ? ?--最常用,只是輸出單個屬性
?
Java代碼 ?
<result?name="success"?type="json"?>??????????<param?name="root">??????????????????指定Action的一個屬性名??????????<param>????</result>??
? ?
注意: name="root"是固定用法;
?
? ? ? ? ? ? ? ?如指定的屬性是boolean類型,那么Result會把這個屬性做成字符串"true";
? ? ? ? ? ? ? ?如指定的屬性是JavaBean,那么Result會把這個屬性做成字符串{"code":"12"}
?
--輸出多個屬性
? ??
Java代碼 ?
<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中的所有屬性
Java代碼 ?
<result?name="success"?type="json">????????????????????????</result>??
注意:Result會將Action中所有的屬性做成一個
json輸出{"":"","":""}
總結
以上是生活随笔為你收集整理的Struts2 Result详解的全部內容,希望文章能夠幫你解決所遇到的問題。
如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。