1. 程式人生 > >在Struts2中使用ValueStack、ActionContext、ServletContext、request、session等 .

在Struts2中使用ValueStack、ActionContext、ServletContext、request、session等 .

筆者不知道該用哪個詞來形容ValueStack、ActionContext等可以在Struts2中用來存放資料的類。這些類使用的範圍不同,得到的方法也不同,下面就來一一介紹。

    宣告:本文參考Struts2版本為2.3.1.2,內容僅供參考,限於筆者水平有限,難免有所疏漏,望您能友善指出。本文發表於ITEYE,謝絕轉載。

1. ValueStack

    ValueStack在中文版的《Struts2深入淺出》一書中譯作“值棧”。其本身資料結構是一個棧,使用者可以把一些物件(又稱作bean)存入值棧中,然後使用動態的表示式來讀取bean的屬性,或者對bean進行一些其他操作。由於值棧中可能有多個bean,值棧會按bean出棧的順序依次嘗試使用動態的表示式來讀取值,直到成功讀取值為止。在Struts2中,預設的值棧實現是

OgnlValueStack,即預設使用Ognl這個動態表示式語言來讀取值。

    在Struts2執行一次請求的過程中,Struts2會把當前的Action物件自動放入值棧。這樣,在渲染JSP時,JSP裡的程式碼使用<s:property value="..."/>之類標籤中的Ognl表示式會直接作用於Action物件,從而方便的讀取Action的屬性。

     如何得到值棧:
  • 在自定義的攔截器中,使用ActionInvocation.getStack()方法( ActionInvocation 是攔截器的方法引數)。
  • 在Action類中,讓攔截器注入ValueStack或者使用
    ActionContext
    .getContext().getValueStack()來值棧(ActionContext.getContext()為靜態方法)。注意:ActionContext分配context的方式是基於執行緒的,如果使用這種方法,請確保它不會出錯。
  • 在JSP中,直接使用標籤即可獲得值棧裡的資料,而一般不用獲取值棧本身。
    如何將物件存入值棧:
  • Struts2自動存入Action:之前已經提到,Struts2在執行一次請求的過程中會把當前的Action物件自動存入值棧中。
  • ModelDrivenInterceptor會存入Action的model屬性:如果你使用了Struts2提供的 ModelDrivenInterceptor,則它會把Action物件的getModel()方法得到的物件存入值棧中。此時,值棧最底層為Action類,其次為這個model。
  • 在自定義的攔截器中存入值棧:得到值棧物件後呼叫ValueStack.put(Object object)方法。
  • 在Action類中存入值棧:得到值棧物件後呼叫ValueStack.put(Object object)方法。
  • 在JSP中存入值棧:標籤<s:push value="..."></s:push>是專門用來在JSP中把指定的value放入值棧的,但value被放入值棧的時間僅在s:push標籤內,即程式執行到</s:push>標籤處會把value從值棧中移出。另外,還有一些標籤比如<s:iterator/>由於其功能的需要也會把一些物件放到值棧中。
    讓值棧執行表示式來獲得值:
  • 在自定義的攔截器中,獲得值棧後,使用ValueStack.findValue(...)等方法。
  • 在Action類中,獲得值棧後,使用ValueStack.findVlaue(...)等方法。
  • 在JSP中,一些標籤的屬性是直接在值棧上執行Ognl表示式的,比如<s:property/>的value屬性。如果標籤的屬性不是直接執行Ognl表示式的,則需要使用“%{}”將表示式括起來,這樣Struts2就會以Ognl表示式來執行了。至於到底哪些標籤是直接執行Ognl而哪些不是,請參考完整的官方文件
    在JSP中跳過棧頂元素直接訪問第二層:
  • 在JSP中,使用[0]、[1]等表示式來指定從棧的第幾層開始執行表示式。[0]表示從棧頂開始,[1]表示從棧的第二層開始。比如表示式“name”等價於“[0].name”。參見此處。
    在JSP中訪問值棧物件本身(而不是它們的屬性)
  • 在表示式中使用top關鍵字來訪問物件本身。比如,表示式“name”等價於“top.name”,表示式“[0].top”等價於“top”,表示式“[1].top.name”等價於“[1].name”。

    總之,值棧主要目的是為了讓JSP內能方便的訪問Action的屬性。

    一些例子: Java程式碼 複製程式碼 收藏程式碼
  1. // 此類為一個封裝資料的簡單類,在下面的例子會用到 
  2. publicclass Person {   
  3. private String name;   
  4. public String getName() {   
  5. return name;   
  6.     }   
  7. publicvoid setName(String name) {   
  8. this.name = name;   
  9.     }   
  10. }  
  1. // 此類為一個封裝資料的簡單類,在下面的例子會用到
  2. publicclass Person {  
  3.     private String name;  
  4.     public String getName() {  
  5.         return name;  
  6.     }  
  7.     publicvoid setName(String name) {  
  8.         this.name = name;  
  9.     }  
  10. }  
  Java程式碼 複製程式碼 收藏程式碼
  1. // 本類將演示攔截器中對值棧的操作 
  2. publicclass MyInterceptor extends AbstractInterceptor {   
  3. public String intercept(ActionInvocation invocation) throws Exception {   
  4. // 獲得值棧 
  5.         ValueStack valueStack = invocation.getStack();   
  6. // 存入值 
  7.         Person person = new Person();   
  8.         valueStack.push(person);   
  9. // 執行表示式獲取值 
  10.         String name = (String) valueStack.findValue("name");   
  11. // 其他程式碼 
  12. return invocation.invoke();   
  13.     }   
  14. }  
  1. // 本類將演示攔截器中對值棧的操作
  2. publicclass MyInterceptor extends AbstractInterceptor {  
  3.     public String intercept(ActionInvocation invocation) throws Exception {  
  4.         // 獲得值棧
  5.         ValueStack valueStack = invocation.getStack();  
  6.         // 存入值
  7.         Person person = new Person();  
  8.         valueStack.push(person);  
  9.         // 執行表示式獲取值
  10.         String name = (String) valueStack.findValue("name");  
  11.         // 其他程式碼
  12.         return invocation.invoke();  
  13.     }  
  14. }  
Java程式碼 複製程式碼 收藏程式碼
  1. // 本類將演示在Action中對值棧進行操作 
  2. publicclass MyAction extends ActionSupport {   
  3. @Override
  4. public String execute() throws Exception {   
  5. // 獲得值棧 
  6.         ValueStack valueStack = ActionContext.getContext().getValueStack();   
  7. // 存入值 
  8.         Person person = new Person();// 這是之前例子中定義的類
  9.         valueStack.push(person);   
  10. // 執行表示式獲取值 
  11.         String name = (String) valueStack.findValue("name");   
  12. // 其他程式碼 
  13. // ...... 
  14. return SUCCESS;   
  15.     }   
  16. // 以下定義的屬性供接下來的JSP例子使用 
  17. private String message;   
  18. private Person person;   
  19. private List<Person> personList;   
  20. public String getMessage() {   
  21. return message;   
  22.     }   
  23. public Person getPerson() {   
  24. return person;   
  25.     }   
  26. public List<Person> getPersonList() {   
  27. return personList;   
  28.     }   
  29. }  
  1. // 本類將演示在Action中對值棧進行操作
  2. publicclass MyAction extends ActionSupport {  
  3.     @Override
  4.     public String execute() throws Exception {  
  5.         // 獲得值棧
  6.         ValueStack valueStack = ActionContext.getContext().getValueStack();  
  7.         // 存入值
  8.         Person person = new Person();// 這是之前例子中定義的類
  9.         valueStack.push(person);  
  10.         // 執行表示式獲取值
  11.         String name = (String) valueStack.findValue("name");  
  12.         // 其他程式碼
  13.         // ......
  14.         return SUCCESS;  
  15.     }  
  16.     // 以下定義的屬性供接下來的JSP例子使用
  17. 相關推薦

    Struts2傳值問題後臺如和獲取request response session

    從瀏覽器傳至後臺三種情況 /** * 1.ModelDriven介面傳值 * 2.set get 方法傳值 * 3.物件導航傳值 */ private Cal cal=new Cal(); private String num1; private Cal cal2=new

    Struts2的ognl標籤介紹(property標籤iterator標籤if/elseif/else標籤url標籤url標籤radio單選框select下拉選擇框)

    Struts2中的ognl標籤介紹(property標籤、iterator標籤、if/elseif/else標籤、url標籤、url標籤、radio單選框、select下拉選擇框) property標籤用於輸出指定值: <s:set name="name" value="'kk'" /> &l

    struts2 ServletActionContext與ActionContext區別

    copy 實現 沒有 action ins page comm 獲得 有一點 1. ActionContext 在Struts2開發中,除了將請求參數自動設置到Action的字段中,我們往往也需要在Action裏直接獲取請求(Request)或會話(Session)的一些信

    Struts2使用ValueStackActionContextServletContextrequestsession .

    筆者不知道該用哪個詞來形容ValueStack、ActionContext等可以在Struts2中用來存放資料的類。這些類使用的範圍不同,得到的方法也不同,下面就來一一介紹。     宣告:本文參考Struts2版本為2.3.1.2,內容僅供參考,限於筆者水平有

    struts2在action獲取requestsessionapplication,並傳遞數據

    ride b2c 傳遞 sets content context 分享 https fcm 假設僅僅是通過request、session、application傳遞數據,則不須要獲取對應的對象也能夠傳遞數據,代碼例如以下: ScopeAction.java: packa

    struts2的返回類型struts的標簽庫struts2完成國際化

    let 頁面 const patch red struts2標簽 property 單選 bmi struts2的返回類型:在jsp-servlet中, 返回的類型主要有 轉發, 重定向; 轉發主要是RequestDispatcher的forward方法來進行操作的req.

    Struts2sessionrequestrespsonse獲取方法

      個人對於struts有一種複雜的心情,平心而論,struts2是個人最早接觸到的的框架,在學校的時候就已經開始學習了,大四畢業設計,無疑用的還是struct,那時候SSH還是很流行的,後來出來實習,直接接觸的是springmvc ,此時spring版本已經至少是3.X了,記得那時候

    Struts2的getset方法作用:Action與頁面傳值

    在Struts2中,客戶端和伺服器之間的資料傳輸全部要用到get、set方法:用set方法 ,可以將表單中的值存入Action類。通過Struts2.0標籤,呼叫get方法將Action類中的結果資料顯示在頁面上。      

    ServletrequestresponseServletContext 及其常用方法

    request物件的類是HttpServletRequest request的常見方法: request.getRequestURL(): 瀏覽器發出請求時的完整URL,包括協議 主機名 埠(如果有)request.getRequestURI(): 瀏覽器發出請求的資源名部分,去掉了協議和主機名reque

    strutsModelDriven()介面 Struts2的ModelDriven機制及其運用refreshModelBeforeResult屬性解決的問題

    Struts2中的ModelDriven機制及其運用、refreshModelBeforeResult屬性解決的問題   1.為什麼需要ModelDriven? 所謂ModelDriven,意思是直接把實體類當成頁面資料的收集物件。比如,有實體類User如下:

    Struts2學習(四)———— ognl表示式值棧actionContext之間的關係

    一、什麼是Ognl?       通過百度百科查詢到的解釋,其中詳細的說明了OGNL的作用。                  下面我們就對OGNL這5個作用進行講解       1、存取物件的任意屬性,簡單說就是對javabean進行操作(重要)       2、呼叫物件方法。       3、

    Struts2學習(四)———— ognl表達式值棧actionContext之間的關系

    需要 三種 查詢 哪些 tac 一次 詳細講解 大堆 存儲對象 一、什麽是Ognl?       通過百度百科查詢到的解釋,其中詳細的說明了OGNL的作用。                  下面我們就對OGNL這5個作用進行講解       1、存取對象的任意屬性,簡單說

    struts學習【1】——Struts2的getset方法作用

            在Struts2中,客戶端和伺服器之間的資料傳輸全部要用到get、set方法:用set方法 ,可以將表單中的值存入Action類。通過Struts2.0標籤,呼叫get方法將Action類中的結果資料顯示在頁面上。         當在業務邏輯中需要用到頁面傳過來的值的時候,只要保證A

    怎樣在struts2的Action獲取requestresponsesession物件。

    使用習慣servlet技術之後, 在進行後臺操作的時候通常會用到 request、response、session這些伺服器物件, request 通常用來接收前臺傳來的引數, 在 struts 中通常都用自動注入的方式解決, respone 是後臺處理

    Struts2利用filtersession實現安全訪問和身份認證

    1、開發環境: Eclipse軟體 JDK 1.7 Apach Tomcat 7 2、通過eclipse建立Dynamic Web Project後,匯入相應的Struts2 的jar檔案: 3、匯入jar包後,建立如下圖所示專案相應目錄:   許可權說明 (1) 根

    struts2設定selectradio預設選中已設定的值

    <s:radio> eg: <s:radio name="invalid" list="#{'0':'啟用(預設)','1':'禁用'}" theme="simple" value="'0'"/> <s:radio name="invalid"

    Struts2的getset方法作用:

    在Struts2中,客戶端和伺服器之間的資料傳輸全部要用到get、set方法:用set方法 ,可以將表單中的值存入Action類。通過Struts2.0標籤,呼叫get方法將Action類中的結果資料顯示在頁面上。        當在業務邏輯中需要用到頁面傳過來的值的時候,只要保證Action中屬性的se

    eclipse自動生成的getset方法在struts2的問題

    今天程式遇到一個奇怪的問題,應用在本地的tomcat執行沒問題,放到websphere就出問題了,本地是windows平臺,websphere是linux,出問題原因是變數用eclipse生成的get、set方法導致的。變數是一個小寫字母開頭,第二個是大寫字母,這種變數不能

    ServletContext物件(4)web專案路徑使用ServletConfig,ServletContext方法總結

    一、ServletContext物件: 1、web專案中路徑使用: package sram.path; import java.io.IOException; import java.io.P

    Struts2的getset方法重要性

           在Struts2中,客戶端和伺服器之間的資料傳輸全部要用到get、set方法        當在業務邏輯中需要用到頁面傳過來的值的時候,只要保證Action中屬性的set方法和頁面中的name屬性值<s:textfield name=""/>相同