熱點推薦:
您现在的位置: 電腦知識網 >> 編程 >> Java編程 >> JSP教程 >> 正文

JSP中Action屬性的功能淺析

2013-11-15 12:20:18  來源: JSP教程 

   完整的action

﹤action path=/aFullAction
type=somePackagesomeActionClass
name=someForm
input=someJSPjsp
﹤forward name=successful path=someJSPjsp/﹥
﹤forward name=failed path=someOtherJSPjsp/﹥
﹤/action﹥

  首先Struts的ActionServlet接收到一個請求然後根據strutsconfigXML的配置定位到相應的mapping(映射)接下來假如form的范圍是request或在定義的范圍中很難找到這個form創建一個新的form實例取得form實例以後調用其reset ()方法然後將表單中的參數放入form假如validate屬性不為false調用validate()方法假如validate()返回非空的ActionErrors將會被轉到input屬性指定的URI假如返回空的ActionErrors那麼執行Action的execute() 方法根據返回的ActionForward確定目標URI

  這樣做的效果是execute()僅當validate()成功以後才執行input屬性指定的是個URI

   僅有Form的action

﹤action path=/aFormOnlyAction
type=orgapachestrutsactionsForwardAction
name=someForm
input=someJSPjsp
parameter=someOtherJSPjsp
/>

  首先Struts會在定義的scope搜尋someForm假如找到則重用假如很難找到則新建一個實例取得form實例以後調用其reset()方法然後將表單中的參數放入form假如validate屬性不為false調用validate()方法假如validate()返回非空的 ActionErrors將會被轉到input屬性指定的URI假如返回空的ActionErrors那麼轉到parameter屬性指定的目標 URI

  這樣做的效果是沒有action類能夠存放我們的業務邏輯所以任何需要寫入的邏輯都只能寫到form的reset()或 validate()方法中validate()的作用是驗證和訪問業務層因為這裡的action映射不包括forward(也沒有意義)所以不能重定向只能用默認的那個forward這種僅有form的action能夠用來處理數據獲取並forward到另一個JSP來顯示

   僅有Action的action

﹤action path=/anActionOnlyAction
type=somePackagesomeActionClass
input=someJSPjsp
﹤forward name=successful path=someJSPjsp/﹥
﹤forward name=failed path=someOtherJSPjsp/﹥
﹤/action﹥

  首先ActionServlet接收到請求後取得action類實例調用execute()方法然後根據返回的ActionForward在配置中找forwardforward到指定的URI或action

  這樣做的效果是沒有form實例被傳入execute()方法於是execute()必須自己從請求中獲取參數Action能夠被forward或重定向這種action不能處理通過HTML FORM提交的請求只能處理鏈接式的請求

   僅有JSP的action

﹤action path=/aJSPOnlyAction
type=orgapachestrutsactionsForwardAction
parameter=someOtherJSPjsp
/﹥

  首先ActionServlet接到請求後調用ForwardAction的execute()方法execute()根據配置的parameter屬性值來forward到那個URI

  這樣做的效果是沒有任何form被實例化比較現實的情形可能是form在request更高級別的范圍中定義或這個action被用作在應用程式編譯好後充當系統參數只需要更改這個配置文檔而無需重新編譯系統

   兩個action對應一個form

﹤action path=/anAction
type=somePackagesomeActionClass
name=someForm
input=someJSPjsp
﹤forward name=successful path=/anotherActiondo/﹥
﹤/action﹥
﹤action path=/anotherAction
type=somePackagesomeOtherActionClass
name=someForm
input=someOtherJSPjsp
﹤forward name=successful path=someResultJSPjsp/﹥
﹤/action﹥

  就每個單獨的action來講處理上並沒有和完整的action有什麼實質的區分這個組合模式能夠被用來傳遞命令對象(form)需要注意的是在後一個action中同樣會調用form的reset()和validate()方法因此我們必須確保form中的信息不被重寫

  處理的方式大致分為兩種

  a) 在request中放入一個指示器表明前一個action有意向後一個action傳遞form從而在後一個action能夠保留那個form中的值這一方式只能在使用forward時使用b) 當使用redirect而不是forward時能夠把指示器放在session或更高的級別在命令鏈的最後一環將這個指示器清除

﹤action path=/anAction
type=somePackagesomeActionClass
name=someForm
input=someJSPjsp
﹤forward name=successful path=/anotherActiondo redirect=true/﹥
﹤/action﹥
﹤action path=/anotherAction
type=somePackagesomeOtherActionClass
name=someOtherForm
input=someOtherJSPjsp
﹤forward name=successful path=someResultJSPjsp/﹥
﹤/action﹥

  這個組合方式跟前一種在流程上沒有太大區分只是我們現在對於兩個action分別提供了form於是代碼看上去更加清楚於是我們能夠分別處理Web應用程式的輸入和輸出值得注意的是後一個action同樣會嘗試往form中寫入那些參數但是我們能夠這樣處理

  a) 在後一個form中使用另一套屬性名

  b) 只提供getter而不提供setter

  大致的處理是這樣

  前一個action接收輸入驗證然後將數據寫入業務層或持久層重定向到後一個action後一個action手動的從業務層/持久層取出數據寫入form(通過其他方式)交給前台JSP顯示

  這樣做的好處是不必保留輸入form中的值因此能夠使用redirect而不是forward這樣就降低了兩個action之間的耦合度同時也避免了不必要的重復提交


From:http://tw.wingwit.com/Article/program/Java/JSP/201311/20756.html
    推薦文章
    Copyright © 2005-2013 電腦知識網 Computer Knowledge   All rights reserved.