Struts2 Result詳解

Struts2 Result詳解             

 

               

1,Result原理

 1) Result組件是Struts2中用於輸出的組件,實際上就是Java代碼。

 2)Struts2中預製了10中類型的Result,這些Result什麼在struts-default.xml中。

    這些類實際上都事先了統一的接口:Result.

Java代碼  收藏代碼

  1. <result-types>  

  2.          <result-type name="chain" class="com.opensymphony.xwork2.ActionChainResult"/>  

  3.          <result-type name="dispatcher" class="org.apache.struts2.dispatcher.ServletDispatcherResult" default="true"/>  

  4.          <result-type name="freemarker" class="org.apache.struts2.views.freemarker.FreemarkerResult"/>  

  5.          <result-type name="httpheader" class="org.apache.struts2.dispatcher.HttpHeaderResult"/>  

  6.          <result-type name="redirect" class="org.apache.struts2.dispatcher.ServletRedirectResult"/>  

  7.          <result-type name="redirectAction" class="org.apache.struts2.dispatcher.ServletActionRedirectResult"/>  

  8.          <result-type name="stream" class="org.apache.struts2.dispatcher.StreamResult"/>  

  9.          <result-type name="velocity" class="org.apache.struts2.dispatcher.VelocityResult"/>  

  10.          <result-type name="xslt" class="org.apache.struts2.views.xslt.XSLTResult"/>  

  11.          <result-type name="plainText" class="org.apache.struts2.dispatcher.PlainTextResult" />  

  12.      </result-types>  

 

3)重點講解一下類型的Result

--dispatcher  默認類型,轉發到一個頁面)

   當一個請求到來,服務器直接轉發到另一個頁面,不能是另一個action。由於這個過程在服務器內部完成,客戶端(瀏覽器)並不知道,所以在地址欄不會顯示真實訪問的頁面,而顯示都是所請求的action的地址。在servlet中相當與forword轉發。

 

--redirect  (重定向到一個頁面)。

   當一個請求到來,服務端將實際地址response給瀏覽器,然後瀏覽器重新發起請求,這個過程,瀏覽器是知道訪問的頁面的實際地址的,所以在瀏覽器的地址欄顯示的是實際訪問的jsp頁面地址。但是這種類型不能重定向到一個action.

 

--chain  轉發到一個action,而不是頁面

  

--redirectAction 重定向到一個action

  跳轉到其他包的action:

 

Java代碼  收藏代碼

  1. <action name="login" class="...">  

  2.         <!-- Chain to another namespace -->  

  3.         <result type="chain">  

  4.             <param name="actionName">dashboard</param>  

  5.             <param name="namespace">/secure</param>  

  6.         </result>  

  7.     </action>  

使用redirectAction 帶參數

Java代碼  收藏代碼

  1. <span style="font-size: 14px; font-family: 'Microsoft YaHei', 微軟雅黑, SimHei, tahoma, arial, helvetica, sans-serif;"><action name="temp" class="com.lydia.web.action.TempAction">  

  2.         <result type="redirectAction">  

  3.             <param name="actionName">test.action</param>  

  4.             <param name="name">${name}</param>  

  5.         </result>  

  6. </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代碼  收藏代碼

  1. <!-- 生成驗證碼的Action -->  

  2.         <action name="createImage"  

  3.             class="com.netctoss.action.CreateImageAction">  

  4.             <result name="success" type="stream">  

  5.                 <param name="inputName">  

  6.                     imageStream  

  7.                 </param>  

  8.             </result>  

  9.         </action>  

 

    CreateImageAction.java

Java代碼  收藏代碼

  1. public class CreateImageAction   

  2.     extends BaseAction {  

  3.       

  4.     //ouput  

  5.     private InputStream imageStream;  

  6.       

  7.     public String execute() {  

  8.         //生成驗證碼圖片  

  9.         Map<String,BufferedImage> map =   

  10.             ImageUtil.createImage();  

  11.         //通過遍歷得到唯一生成的驗證碼  

  12.         String imageCode =   

  13.             map.keySet().iterator().next();  

  14.         //將驗證碼記錄到session,在登錄驗證時使用  

  15.         session.put("imageCode", imageCode);  

  16.         //根據驗證碼,得到圖片  

  17.         BufferedImage image = map.get(imageCode);  

  18.         //將圖片轉換爲輸入流,由result作輸出  

  19.         try {  

  20.             imageStream =   

  21.                 ImageUtil.getInputStream(image);  

  22.         } catch (IOException e) {  

  23.             e.printStackTrace();  

  24.             return "error";  

  25.         }  

  26.         return "success";  

  27.     }  

  28.   

  29.     public InputStream getImageStream() {  

  30.         return imageStream;  

  31.     }  

  32.   

  33.     public void setImageStream(InputStream imageStream) {  

  34.         this.imageStream = imageStream;  

  35.     }  

  36.   

  37. }  

 

 

Java代碼  收藏代碼

  1. <script language="javascript" type="text/javascript">  

  2.             function change(imageObj) {  

  3.                 imageObj.src = "createImage?date=" + new Date().getTime();  

  4.             }  

  5. </script>  

  6.   

  7. <tr>  

  8.      <td class="login_info">驗證碼:</td>  

  9.      <td class="width70"><input name="code" type="text" class="width70" /></td>  

  10.      <td><img src="createImage" alt="驗證碼" title="點擊更換" onclick="change(this);"/></td>    

  11.      <td><span class="required"></span></td>                

  12. </tr>       

  BaseAction.java 實現接口SessionAware

Java代碼  收藏代碼

  1. /** 

  2.  *  所有Action的父類,可以將通用的代碼 

  3.  *  提取出來放到父類中。 

  4.  *  這裏,我們讓BaseAction實現接口SessionAware, 

  5.  *  那麼繼承與BaseAction的Action就相當於實現了 

  6.  *  這個接口。在實例化Action之後,Struts2會自動 

  7.  *  調用setSession方法把session注入給Action, 

  8.  * 這裏我們利用全局變量session來接收,Action 

  9.  * 可以在調用業務方法時使用它來調用session。 

  10.  */  

  11. public class BaseAction implements SessionAware {  

  12.   

  13.     protected Map<String, Object> session;  

  14.       

  15.     public void setSession(Map<String, Object> session) {  

  16.         this.session = session;  

  17.     }  

  18.   

  19. }  

 

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代碼  收藏代碼

  1. <result name="success" type="json" >  

  2.         <param name="root">  

  3.                 指定Action的一個屬性名  

  4.         <param>  

  5.   </result>  

   注意: name="root"是固定用法;

 

               如指定的屬性是boolean類型,那麼Result會把這個屬性做成字符串"true";

               如指定的屬性是JavaBean,那麼Result會把這個屬性做成字符串{"code":"12"}

 

--輸出多個屬性

    

Java代碼  收藏代碼

  1. <result name="success" type="json">  

  2.         <param name="includeProperties">  

  3.                 屬性名1,屬性名2,...  

  4.         </param>  

  5. </result>  

 注意:Result會將這一組屬性做成一個json輸出,

如Action中有屬性code="aaa",name="zs"

可以將這2個屬性做成一個json

{"code":"aaa","name":"zs"}

 

--輸出Action中的所有屬性

Java代碼  收藏代碼

  1. <result name="success" type="json">  

  2.                       

  3. </result>  

注意:Result會將Action中所有的屬性做成一個

json輸出{"":"","":""}

 

  • d588b724-4a61-3747-939a-a371ada91270-thu



發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章