天天看點

Struts2值棧和ognl表達式

值棧

  • 在struts2中提供的一種存儲機制,類似于域對象,可以存值和取值
  • 在action裡把資料放到值棧中,在頁面中擷取到值棧資料
  • servlet和action的差別:
    • Servlet:預設在第一次通路時建立,隻建立一次,單執行個體對象
    • Action:通路時建立,每次通路action時,都會建立一個action對象,建立多次,多執行個體對象
  • 值棧存儲位置:
    • 每次通路action時,都會建立action對象
    • 在每個action對象裡有且隻有一個值棧對象
  • 擷取值棧對象:
    • 常用方式:使用ActionContext類裡面的方法得到值棧對象
      • (ActionContext.getContext()).getValueStack()
  • 值棧的内部結構:
    • 分兩部分
      • root:繼承ArrayLiat類,結構是list集合
      • context:繼承Map類,結構是map集合
      • Struts2值棧和ognl表達式
    • 使用s:debug标簽可以檢視值棧結構和存儲值
    • 值棧對象中有action的引用
  • 向值棧中存放資料的三種方式
    • 擷取值棧對象,調用值棧對象裡的set方法
    • Struts2值棧和ognl表達式
    • 擷取值棧對象,調用值棧對象裡的push方法
    • Struts2值棧和ognl表達式
    • 在action中定義變量,生成變量的get方法
      • 變量定義在action中,不用配置設定額外空間
  • 向值棧中存放對象
    • 實作步驟:
      • 定義對象變量
      • 生成變量的get方法
      • 在執行的方法裡面設定對象的值

ognl

  • struts2預設的表達式語言,不屬于struts2,但一般一起使用
  • 在struts2中操作值棧資料
  • ognl.jar包
  • 在jsp頁面引入ognl标簽庫

    <%@ taglib uri="/struts-tags" prefix="s"%>

ognl操作值棧

  • 從值棧中擷取資料
    1. 擷取字元串:在jsp頁面ognl标簽中的name和值棧中的屬性名相同,如
    2. 擷取對象:
    3. 擷取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>
                     
    4. 擷取push方法設定的值
      • 使用push方法設定的值沒有名稱,隻有設定的值
      • 用push方法向值棧放的資料都存在top數組中,根據數組來擷取值
      • Struts2值棧和ognl表達式
  • EL表達式也能擷取到值棧中的值,但效率低,因為它先在域對象中找對應的值,如果找到則直接傳回,如果沒找到則到值棧中的擷取,并放入域對象中

ognl中的#和%

  • #:擷取context中的資料, 如

    <s:property value="#request.req"/>

  • %:struts2标簽中的表單标簽
    • 如果直接在struts2表單标簽裡使用ognl表達式不能夠被識别。隻有%之後才會識别。如

      <s:textfield name="username" value="%{#request.req}"></s:textfield>