在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中,預設的值棧實現是
在Struts2執行一次請求的過程中,Struts2會把當前的Action物件自動放入值棧。這樣,在渲染JSP時,JSP裡的程式碼使用<s:property value="..."/>之類標籤中的Ognl表示式會直接作用於Action物件,從而方便的讀取Action的屬性。
如何得到值棧:
- 在自定義的攔截器中,使用ActionInvocation.getStack()方法( ActionInvocation 是攔截器的方法引數)。
- 在Action類中,讓攔截器注入ValueStack或者使用
- 在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程式碼- // 此類為一個封裝資料的簡單類,在下面的例子會用到
- publicclass Person {
- private String name;
- public String getName() {
- return name;
- }
- publicvoid setName(String name) {
- this.name = name;
- }
- }
- // 此類為一個封裝資料的簡單類,在下面的例子會用到
- publicclass Person {
- private String name;
- public String getName() {
- return name;
- }
- publicvoid setName(String name) {
- this.name = name;
- }
- }
- // 本類將演示攔截器中對值棧的操作
- publicclass MyInterceptor extends AbstractInterceptor {
- public String intercept(ActionInvocation invocation) throws Exception {
- // 獲得值棧
- ValueStack valueStack = invocation.getStack();
- // 存入值
- Person person = new Person();
- valueStack.push(person);
- // 執行表示式獲取值
- String name = (String) valueStack.findValue("name");
- // 其他程式碼
- return invocation.invoke();
- }
- }
- // 本類將演示攔截器中對值棧的操作
- publicclass MyInterceptor extends AbstractInterceptor {
- public String intercept(ActionInvocation invocation) throws Exception {
- // 獲得值棧
- ValueStack valueStack = invocation.getStack();
- // 存入值
- Person person = new Person();
- valueStack.push(person);
- // 執行表示式獲取值
- String name = (String) valueStack.findValue("name");
- // 其他程式碼
- return invocation.invoke();
- }
- }
- // 本類將演示在Action中對值棧進行操作
- publicclass MyAction extends ActionSupport {
- @Override
- public String execute() throws Exception {
- // 獲得值棧
- ValueStack valueStack = ActionContext.getContext().getValueStack();
- // 存入值
- Person person = new Person();// 這是之前例子中定義的類
- valueStack.push(person);
- // 執行表示式獲取值
- String name = (String) valueStack.findValue("name");
- // 其他程式碼
- // ......
- return SUCCESS;
- }
- // 以下定義的屬性供接下來的JSP例子使用
- private String message;
- private Person person;
- private List<Person> personList;
- public String getMessage() {
- return message;
- }
- public Person getPerson() {
- return person;
- }
- public List<Person> getPersonList() {
- return personList;
- }
- }
- // 本類將演示在Action中對值棧進行操作
- publicclass MyAction extends ActionSupport {
- @Override
- public String execute() throws Exception {
- // 獲得值棧
- ValueStack valueStack = ActionContext.getContext().getValueStack();
- // 存入值
- Person person = new Person();// 這是之前例子中定義的類
- valueStack.push(person);
- // 執行表示式獲取值
- String name = (String) valueStack.findValue("name");
- // 其他程式碼
- // ......
- return SUCCESS;
- }
- // 以下定義的屬性供接下來的JSP例子使用
-
相關推薦
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中使用ValueStack、ActionContext、ServletContext、request、session等 .
筆者不知道該用哪個詞來形容ValueStack、ActionContext等可以在Struts2中用來存放資料的類。這些類使用的範圍不同,得到的方法也不同,下面就來一一介紹。 宣告:本文參考Struts2版本為2.3.1.2,內容僅供參考,限於筆者水平有
struts2在action中獲取request、session、application,並傳遞數據
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.
Struts2中的session、request、respsonse獲取方法
個人對於struts有一種複雜的心情,平心而論,struts2是個人最早接觸到的的框架,在學校的時候就已經開始學習了,大四畢業設計,無疑用的還是struct,那時候SSH還是很流行的,後來出來實習,直接接觸的是springmvc ,此時spring版本已經至少是3.X了,記得那時候
Struts2中的get、set方法作用:Action與頁面傳值
在Struts2中,客戶端和伺服器之間的資料傳輸全部要用到get、set方法:用set方法 ,可以將表單中的值存入Action類。通過Struts2.0標籤,呼叫get方法將Action類中的結果資料顯示在頁面上。
Servlet中request、response、ServletContext 及其常用方法
request物件的類是HttpServletRequest request的常見方法: request.getRequestURL(): 瀏覽器發出請求時的完整URL,包括協議 主機名 埠(如果有)request.getRequestURI(): 瀏覽器發出請求的資源名部分,去掉了協議和主機名reque
struts中ModelDriven()介面 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中的get、set方法作用
在Struts2中,客戶端和伺服器之間的資料傳輸全部要用到get、set方法:用set方法 ,可以將表單中的值存入Action類。通過Struts2.0標籤,呼叫get方法將Action類中的結果資料顯示在頁面上。 當在業務邏輯中需要用到頁面傳過來的值的時候,只要保證A
怎樣在struts2的Action中獲取request、response、session物件。
使用習慣servlet技術之後, 在進行後臺操作的時候通常會用到 request、response、session這些伺服器物件, request 通常用來接收前臺傳來的引數, 在 struts 中通常都用自動注入的方式解決, respone 是後臺處理
Struts2中利用filter、session實現安全訪問和身份認證
1、開發環境: Eclipse軟體 JDK 1.7 Apach Tomcat 7 2、通過eclipse建立Dynamic Web Project後,匯入相應的Struts2 的jar檔案: 3、匯入jar包後,建立如下圖所示專案相應目錄: 許可權說明 (1) 根
struts2中設定select、radio預設選中已設定的值
<s:radio> eg: <s:radio name="invalid" list="#{'0':'啟用(預設)','1':'禁用'}" theme="simple" value="'0'"/> <s:radio name="invalid"
Struts2中的get、set方法作用:
在Struts2中,客戶端和伺服器之間的資料傳輸全部要用到get、set方法:用set方法 ,可以將表單中的值存入Action類。通過Struts2.0標籤,呼叫get方法將Action類中的結果資料顯示在頁面上。 當在業務邏輯中需要用到頁面傳過來的值的時候,只要保證Action中屬性的se
eclipse中自動生成的get、set方法在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中的get、set方法重要性
在Struts2中,客戶端和伺服器之間的資料傳輸全部要用到get、set方法 當在業務邏輯中需要用到頁面傳過來的值的時候,只要保證Action中屬性的set方法和頁面中的name屬性值<s:textfield name=""/>相同