struts2經常使用類型的Result

2.2.1. dispatcher

dispatcher類型是用於轉發的Result,能夠將請求轉發給JSP。這種類型的Result對應的類爲 ServletDispatcherResult,它是Struts2默認的Result類型,該默認行爲是定義該Result時,經過 default="true"指定的 。json

在此以前,咱們使用的Result都是這種默認的dispatcher類型的Result。設計模式

2.2.2. stream

stream類型是用於向頁面輸出二進制數據,這種類型的Result,能夠將二進制數據輸出到請求發起的位置, 它對應的類爲StreamResult 。瀏覽器

2.2.3. redirectAction

redirectAction類型是用於將請求重定向給另一個Action,這種類型Result對應的類爲ServletActionRedirectResult 。session

2.2.4. json

json類型是用於向頁面輸出json格式的數據,這種類型的Result,能夠將json字符串輸出到請求發起的位置,它對應的類爲JSONResult。編碼

此類Result不是Struts2預置的Result,可是確是十分經常使用的類型 。spa

3. stream Result

3.1. 做用

3.1.1. stream Result的做用

用於向頁面輸出二進制數據,此種類型的Result,能夠將二進制數據輸出到請求發起端。它會自動建立輸出流,接入Action中定義的輸入流並將其輸出。設計

3.2. 使用方式

3.2.1. 語法

代碼示例:code

 
  1. <result name=」success」 type=」stream」>
  2.     <param name=」inputName」>codeStream</param>
  3. </result>

代碼說明:orm

  • type=」stream」中的stream,引用的是Struts2在struts-default.xml中定義的result的名稱,是固定寫法。
  • name=」inputName」中的inputName,指的是該result對應的類StreamResult中的屬性,用意是要爲其屬性賦值,是固定寫法。
  • codeStream指的是Action中某屬性名,該屬性需爲InputStream類型,所以這裏的寫法不固定,看屬性名而定。

關係圖示:xml

圖-5

3.2.2. 使用步驟

一、在Action中,定義InputStream類型的輸出屬性 。

二、在struts.xml中,配置該Action。

三、在action下,配置stream類型的result。

3.3. 登陸驗證碼

3.3.1. 需求描述

打開登陸頁面時,生成一張隨機的驗證碼圖片。當點擊驗證碼圖片時,從新生成一張新圖片。點擊登陸按鈕時,要先校驗驗證碼是否正確,若正確再校驗帳號及密碼,不然給與錯誤提示。

3.3.2. 開發思路

一、生成驗證碼圖片

登陸頁面上,經過img標記加載圖片,這是瀏覽器讀取登陸頁面時單獨發送的一次請求。在此次請求中,咱們須要生成動態圖片並輸出給img顯示。

此次請求的處理過程以下圖所示:

圖-6

在此次請求中,咱們須要編碼的位置有ImageUtil、Action、struts.xml、JSP。其中重點內容是Action調用ImageUtil圖片生成組件來生成圖片,並利用stream類型的result將圖片輸出給頁面的img。

二、驗證碼校驗

點擊登陸時,咱們在對應Action中校驗了帳號及密碼,那麼對驗證碼的校驗,也能夠加入到此Action中,代碼位置在校驗帳號及密碼以前。

回顧校驗帳號及密碼的處理過程,以下圖

圖-7

在此過程當中,咱們須要重構的代碼有Action和JSP。

3.3.3. 開發步驟-請求1

  • 定義輸出屬性,類型爲InputStream。
  • 業務方法中,調用ImageUtil生成圖片,並將圖片流化賦值給輸出屬性。
  • 取得圖片中的文字內容,並將其存入session,便於驗證碼校驗時使用。

3.3.4. 開發步驟-請求2

  • 追加輸入屬性,接收傳入的驗證碼。
  • 業務方法中,在校驗帳號、密碼前校驗驗證碼是否正確,即將接收到的驗證碼與session保存的驗證碼比較。

4. redirectAction Result

4.1. 做用

4.1.1. redirectAction Result的做用

用於將請求重定向給另一個Action。在MVC設計模式下,咱們應該把每次請求都發送給控制器,即Action。所以重定向時是發送一次新的請求,那麼也應該把此次請求發送給Action,避免出現直接把請求發送給JSP的狀況。

4.2. 使用方式

4.2.1. 語法

 
  1. <result name=」login」 type=」redirectAction」>
  2. <param name=」namespace」>/命名空間</param>
  3. <param name=」actionName」>action名</param>
  4. <param name=」method」>方法名</param>
  5. </result>
  • type=」redirectAction」中的redirectAction引用的是struts-default.xml中定義的result的名稱,是固定寫法。
  • name=」namespace」中的namespace,指的是該result類中的屬性,用意是要給該屬性賦值,告訴result要重定向的包的命名空間,是固定寫法。
  • name=」actionName」中的actionName,指的是該result類中的屬性,用意是要給該屬性賦值,告訴result要重定向的action名稱,是固定寫法。
  • name=」method」中的method指的是該result類中的屬性,用意是要給該屬性賦值,告訴result要調用目標Action哪一個方法,是固定寫法。
  • param標記中的內容,都是針對其name所指定的屬性要賦值的內容,該內容是動態的,跟具體業務相關。

若是重定向的Action與當前的Action在同一個namespace下,那麼能夠省略命名空間的參數設置,即

 
  1. <result name=」login」 type=」redirectAction」>
  2. <param name=」actionName」>action名</param>
  3. <param name=」method」>方法名</param>
  4. </result>

若是調用的是目標Action的execute方法,那麼能夠省略方法名的參數設置,即

 
  1. <result name=」login」 type=」redirectAction」>
  2. <param name=」actionName」>action名</param>
  3. </result>

像上面這樣的狀況,只須要配置actionName時,其實還能夠進一步簡化

 
  1. <result name=」login」 type=」redirectAction」>
  2. action名
  3. </result>

4.2.2. 使用步驟

4.3. 資費刪除

4.3.1. 需求描述

點擊刪除按鈕,刪除當前行的資費數據。刪除以後,須要刷新資費列表頁面。

4.3.2. 開發思路

刪除的請求中,須要將選中數據的ID傳給Action,Action調用DAO將當前ID對應的數據刪除。刪除結束後,爲了刷新列表頁面,須要將請求重定向給查詢Action。

請求過程以下圖:

圖-8

刪除的請求,咱們重點要理解請求結束時的重定向

  • 從業務角度來講,刪除與查詢是2個獨立的業務,彼此之間並不相互依賴,所以應該是用2種請求來分別處理。那麼這2次請求之間的銜接是業務場景要求的,咱們須要使用重定向來實現。
  • 從代碼角度來講,若是刪除後不是重定向,而是直接將請求轉發給查詢頁面的話,那麼對於查詢頁面而言,它所處的此次請求 中,ValueStack棧頂Action是刪除Action,該Action中沒有它要顯示的列表數據以及分頁數據,會致使頁面顯示數據有誤,沒法實現 真正的刷新。

4.3.3. 開發步驟

  • 定義輸入屬性id。
  • 業務方法中調用DAO,根據id刪除資費數據。
  • 配置刪除Action。
  • 配置result,將請求重定向給查詢。 
相關文章
相關標籤/搜索