Struts2_day03

Struts2_day03

1.ognl概述

  1. 之前web階段,學習過EL表達式,EL表達式在jsp中獲取域對象里面的值

  2. OGNL是一種表達式,這個表達式功能更加強大,

    (1)在struts2里面操作值棧數據

    (2)一般把ognl在struts2操作:和struts2標簽一起使用操作值棧

  3. OGNL不是struts2的一部分,單獨的項目,經常和struts2一起使用

    (1)使用ognl時候首先導入jar包,struts2提供jar包

2.ognl入門案例

  1. 使用ognl+struts2標簽實現計算字符串長度

    • 支持對象方法調用。例如:objName.methodName()
  • 在java中調用字符串.length();
  1. 使用struts2標簽

    (1)使用jstl時候,導入jar包之外,在jsp頁面中引入標簽庫

    使用struts2標簽時候,也要在jsp中引入標簽庫

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

    (2)使用struts2標簽實現操作

    <!-- 使用ognl+struts2標簽實現計算字符串長度value屬性值:ognl表達式-->
    <s:property value="'hahaha'.length()" />
    <input type="submit" value="submit" />
    

3.什么是值棧

  1. 之前在web階段,在servlet里面進行操作,把數據放到域對象里面,在頁面中使用el表達式獲取到,域對象在一定范圍內,存值和取值

  2. 在struts2里面提供本身一種存儲機制,類似于域對象,是值棧,可以存值和取值

    (1)在action里面把數據放到值棧里面,在頁面中獲取到值棧數據

3.1servlet和action區別

(1)Servlet:默認在第一次訪問時候創建,創建一次,單實例對象

(2)Action:訪問時候創建,每次訪問action時候,都會創建action對象,創建多次,多實例對象

3.2值棧存儲位置

(1)每次訪問action時候,都會創建action對象

(2)在每個action對象里面都會有一個值棧對象(只有一個)

  • 值棧對象里面有action引用

4.怎么獲取值棧對象

  1. 使用ActionContext類里面的方法獲取值棧對象

5.值棧內部結構

5.1root:list集合

(1)一般操作都是root里面數據

5.2context:map集合

5.3debug標簽

struts2里面標簽s:debug,使用這個標簽可以查看值棧結構和存儲值

點擊超鏈接看到結構

(1)訪問action,執行action的方法有返回值,配置返回值到jsp頁面中,在jsp頁面中使用這個標簽

(2)在action沒有做任何操作,棧頂元素是 action引用

6.向值棧放數據

6.1向值棧放字符串

第一種 獲取值棧對象,調用值棧對象里面的 set 方法

// 1.獲取值棧對象,調用值棧對象里面的 set 方法
ActionContext context = ActionContext.getContext();
ValueStack stack = context.getValueStack();
stack.set("a", "b");

第二種 獲取值棧對象,調用值棧對象里面的 push方法

// 1.獲取值棧對象,調用值棧對象里面的 push 方法
ActionContext context = ActionContext.getContext();
ValueStack stack = context.getValueStack();
stack.push("hello");
return "success";

第三種 在action定義變量,生成變量的get方法

package com.ghw.action;

import com.opensymphony.xwork2.ActionContext;
import com.opensymphony.xwork2.ActionSupport;
import com.opensymphony.xwork2.util.ValueStack;

public class FormAction extends ActionSupport {
    // 1.定義變量
    private String name;

    // 2.生成變量的get方法
    public String getName() {
        return name;
    }

    public String execute() throws Exception {
        // 獲取值棧對象
        ActionContext context = ActionContext.getContext();
        ValueStack stack = context.getValueStack();
        // 3.給變量賦值
        name = "hello";
        return "success";
    }
}

6.2向值棧放對象

以下均為6.1的第三種方法

實現步驟:

第一步 定義對象變量

// 第一步 定義對象變量
private User user = new User();

第二步 生成變量的get方法

// 第二步 生成變量的get方法
public User getUser() {
    return user;
}

第三步 在執行的方法里面向對象中設置值

// 第三步 在執行的方法里面向對象中設置值
user.setUsername("hello");
user.setPassword("password");

6.3向值棧放list集合

以下均為6.1的第三種方法

實現步驟:

第一步 定義list集合變量

// 第一步 定義List變量
private List<User> list = new ArrayList<User>();

第二步 生成變量的get方法

// 第二步 生成變量List的get方法
public List<User> getList() {
    return list;
}

第三步 在執行的方法里面向list集合設置值

// 第三步 在執行的方法里面向List設置值
User user1 = new User();
user1.setUsername("hello");
user1.setPassword("world");
User user2 = new User();
user2.setUsername("aa");
user2.setPassword("bb");
list.add(user1);
list.add(user2);
return "success";

7.從值棧獲取數據

1 使用struts2的標簽+ognl表達式獲取值棧數據

<s:property value="ognl表達式"/>

7.1從值棧獲取字符串

  1. 向值棧放字符串,采用6.1第三種方法

    public class ValueStackAction extends ActionSupport {
     private String username;
    
     public String getUsername() {
         return username;
     }
    
     public String execute() throws Exception {
         username = "hello";
         return "success";
     }
    }
    
  2. 在jsp使用struts2標簽+ognl表達式獲取

    <s:property value="username" />
    

7.2從值棧獲取對象

  1. 向值棧放對象

    public class ValueStackAction extends ActionSupport {
     private User user = new User();
    
     public User getUser() {
         return user;
     }
    
     public String execute() throws Exception {
         user.setUsername("hello");
         user.setPassword("world");
         return "success";
     }
    }
    
  2. 在頁面中獲取值

    <s:property value="user.username" />
    <s:property value="user.password" />
    

7.3從值棧獲取list集合

  1. 向值棧放對象
public class ValueStackAction extends ActionSupport {
    private List<User> list = new ArrayList<User>();

    public List<User> getList() {
        return list;
    }

    public String execute() throws Exception {
        User user = new User();
        user.setUsername("hello");
        user.setPassword("world");
        User user2 = new User();
        user2.setUsername("aa");
        user2.setPassword("bb");
        list.add(user);
        list.add(user2);
        return "success";
    }
}
  1. 在頁面中獲取值

    獲取list集合的三種方法:

    方法一:

    <!-- 第一種方式實現 -->
    <s:property value="list[0].username" />
    <s:property value="list[0].password" />
    <s:property value="list[1].username" />
    <s:property value="list[2].password" />
    

    方法二:

    <!-- 遍歷list得到list里面的每個user對象 -->
    <s:iterator value="list">
     <s:property value="username" />
     <s:property value="password" />
    </s:iterator>
    

    方法三:

    <!-- 遍歷值棧list集合,得到每個user對象
     機制:把每次遍歷出來的user對象放到context里面
     獲取context里面的數據特點:寫ognl表達式,
     使用特殊符號#     -->
    <s:iterator value="list" var="user">
     <s:property value="#user.username" />
     <s:property value="#user.password" />
    </s:iterator>
    

7.4補充set和push方法

  1. set方法獲取值,直接用,name的值為set方法中第一個值

    <s:iterator value="name">

  2. 使用push方法向值棧放數據,獲取

    (1)使用push方法設置值,沒有名稱,只有設置的值

    (2)向值棧放數據,把向值棧放數據存到數組里面,數組名稱 top,根據數組獲取值

    <s:iterator value="[0].top">

8.EL表達式獲取值棧數據

EL表達式為什么能取到值棧中的數據?

一般不推薦使用EL表達式獲取值棧數據,效率低

  1. EL表達式獲取域對象值

  2. 向域對象里面放值使用setAttribute方法,獲取值使用getAttribute方法

  3. 底層增強(縱向增強,橫向是aop思想)request對象里面的方法getAttribute方法

(1)首先從request域獲取值,如果獲取到,直接返回

(2)如果從request域獲取不到值,到值棧中把值獲取出來,把值放到域對象里面

  1. 查看源代碼

9.ognl表達式#、%使用

9.1#使用

  1. 使用#獲取context里面數據,主要是域對象數據

    <!-- 遍歷值棧list集合,得到每個user對象
     機制:把每次遍歷出來的user對象放到context里面
     獲取context里面的數據特點:寫ognl表達式,
     使用特殊符號#     -->
    <s:iterator value="list" var="user">
     <s:property value="#user.username" />
     <s:property value="#user.password" />
    </s:iterator>
    
  2. 演示# 操作

    (1)向request域放值

    HttpServletRequest request = ServletActionContext.getRequest();
    request.setAttribute("req", "reqvalue");
    

    (2)在頁面中使用ognl獲取

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

9.2%使用

  1. 在struts2標簽中表單標簽

    (1)在struts2標簽里面使用ognl表達式,如果直接在struts2表單標簽里面使用ognl表達式不識別,只有%之后才會識別。

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

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 229,001評論 6 537
  • 序言:濱河連續發生了三起死亡事件,死亡現場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發現死者居然都...
    沈念sama閱讀 98,786評論 3 423
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 176,986評論 0 381
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 63,204評論 1 315
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 71,964評論 6 410
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發上,一...
    開封第一講書人閱讀 55,354評論 1 324
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,410評論 3 444
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 42,554評論 0 289
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當地人在樹林里發現了一具尸體,經...
    沈念sama閱讀 49,106評論 1 335
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 40,918評論 3 356
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發現自己被綠了。 大學時的朋友給我發了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 43,093評論 1 371
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,648評論 5 362
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質發生泄漏。R本人自食惡果不足惜,卻給世界環境...
    茶點故事閱讀 44,342評論 3 347
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 34,755評論 0 28
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 36,009評論 1 289
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 51,839評論 3 395
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 48,107評論 2 375

推薦閱讀更多精彩內容

  • 非本人總結的筆記,抄點筆記復習復習。感謝傳智博客和黑馬程序猿記筆記啊記筆記 Struts2國際化 什么是國際化 比...
    鍵盤瞎閱讀 413評論 0 3
  • 概述 什么是Struts2的框架Struts2是Struts1的下一代產品,是在 struts1和WebWork的...
    inke閱讀 2,269評論 0 50
  • action中如何接受頁面傳過來的參數 第一種情況:(同名參數) 例如:通過頁面要把id=1 name=tom a...
    清楓_小天閱讀 2,993評論 1 22
  • 標簽 如果要配置的標簽,那么必須要先配置標簽,代表的包的概念。 包含的屬性 name包的名稱,要求是唯一的,管理a...
    偷偷得路過閱讀 1,374評論 0 0
  • 非本人總結的筆記,抄點筆記復習復習。感謝傳智博客和黑馬程序猿記筆記啊記筆記 Ognl的簡介 Ognl是獨立的項目,...
    鍵盤瞎閱讀 533評論 0 2