值棧
- 在struts2中提供的一種存儲機制,類似于域對象,可以存值和取值
- 在action裡把資料放到值棧中,在頁面中擷取到值棧資料
- servlet和action的差別:
- Servlet:預設在第一次通路時建立,隻建立一次,單執行個體對象
- Action:通路時建立,每次通路action時,都會建立一個action對象,建立多次,多執行個體對象
- 值棧存儲位置:
- 每次通路action時,都會建立action對象
- 在每個action對象裡有且隻有一個值棧對象
- 擷取值棧對象:
- 常用方式:使用ActionContext類裡面的方法得到值棧對象
- (ActionContext.getContext()).getValueStack()
- 常用方式:使用ActionContext類裡面的方法得到值棧對象
- 值棧的内部結構:
- 分兩部分
- root:繼承ArrayLiat類,結構是list集合
- context:繼承Map類,結構是map集合
- 使用s:debug标簽可以檢視值棧結構和存儲值
- 值棧對象中有action的引用
- 分兩部分
- 向值棧中存放資料的三種方式
- 擷取值棧對象,調用值棧對象裡的set方法
- 擷取值棧對象,調用值棧對象裡的push方法
- 在action中定義變量,生成變量的get方法
- 變量定義在action中,不用配置設定額外空間
- 向值棧中存放對象
- 實作步驟:
- 定義對象變量
- 生成變量的get方法
- 在執行的方法裡面設定對象的值
- 實作步驟:
ognl
- struts2預設的表達式語言,不屬于struts2,但一般一起使用
- 在struts2中操作值棧資料
- ognl.jar包
- 在jsp頁面引入ognl标簽庫
<%@ taglib uri="/struts-tags" prefix="s"%>
ognl操作值棧
- 從值棧中擷取資料
- 擷取字元串:在jsp頁面ognl标簽中的name和值棧中的屬性名相同,如
- 擷取對象:
- 擷取list對象:
-
<s:property value="list[0].username"/>
-
-
“`java
//周遊值棧list集合
* * ```java //用這種方式周遊會在值棧的context部分配置設定一段臨時空間,把周遊出來的user對象放到裡面,因為context是map結構,是以放進去的key是ognl表達式var的值,value是周遊出來的user對象的引用。要取context中的值在ognl表達式中要加#符号 <s:iterator value="list" value="user"> <s:property value="#user.username"/> <s:property value="#user.password"/> </s:iterator>
-
-
- 擷取push方法設定的值
- 使用push方法設定的值沒有名稱,隻有設定的值
- 用push方法向值棧放的資料都存在top數組中,根據數組來擷取值
- EL表達式也能擷取到值棧中的值,但效率低,因為它先在域對象中找對應的值,如果找到則直接傳回,如果沒找到則到值棧中的擷取,并放入域對象中
ognl中的#和%
- #:擷取context中的資料, 如
<s:property value="#request.req"/>
- %:struts2标簽中的表單标簽
- 如果直接在struts2表單标簽裡使用ognl表達式不能夠被識别。隻有%之後才會識别。如
<s:textfield name="username" value="%{#request.req}"></s:textfield>
- 如果直接在struts2表單标簽裡使用ognl表達式不能夠被識别。隻有%之後才會識别。如