Struts2_day03

Struts2_day03

1.ognl概述

  1. 之前web階段天吓,學習過EL表達式,EL表達式在jsp中獲取域?qū)ο罄锩娴闹?/p>

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

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

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

  3. OGNL不是struts2的一部分,單獨的項目汤功,經(jīng)常和struts2一起使用

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

2.ognl入門案例

  1. 使用ognl+struts2標簽實現(xiàn)計算字符串長度

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

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

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

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

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

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

3.什么是值棧

  1. 之前在web階段餐茵,在servlet里面進行操作科阎,把數(shù)據(jù)放到域?qū)ο罄锩妫陧撁嬷惺褂胑l表達式獲取到忿族,域?qū)ο笤谝欢ǚ秶鷥?nèi)锣笨,存值和取值

  2. 在struts2里面提供本身一種存儲機制,類似于域?qū)ο蟮琅侵禇4碛ⅲ梢源嬷岛腿≈?/p>

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

3.1servlet和action區(qū)別

(1)Servlet:默認在第一次訪問時候創(chuàng)建屹徘,創(chuàng)建一次走趋,單實例對象

(2)Action:訪問時候創(chuàng)建,每次訪問action時候,都會創(chuàng)建action對象簿煌,創(chuàng)建多次氮唯,多實例對象

3.2值棧存儲位置

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

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

  • 值棧對象里面有action引用

4.怎么獲取值棧對象

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

5.值棧內(nèi)部結構

5.1root:list集合

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

5.2context:map集合

5.3debug標簽

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

點擊超鏈接看到結構

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

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

6.向值棧放數(shù)據(jù)

6.1向值棧放字符串

第一種 獲取值棧對象,調(diào)用值棧對象里面的 set 方法

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

第二種 獲取值棧對象伍玖,調(diào)用值棧對象里面的 push方法

// 1.獲取值棧對象,調(diào)用值棧對象里面的 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的第三種方法

實現(xiàn)步驟:

第一步 定義對象變量

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

第二步 生成變量的get方法

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

第三步 在執(zhí)行的方法里面向?qū)ο笾性O置值

// 第三步 在執(zhí)行的方法里面向?qū)ο笾性O置值
user.setUsername("hello");
user.setPassword("password");

6.3向值棧放list集合

以下均為6.1的第三種方法

實現(xiàn)步驟:

第一步 定義list集合變量

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

第二步 生成變量的get方法

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

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

// 第三步 在執(zhí)行的方法里面向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.從值棧獲取數(shù)據(jù)

1 使用struts2的標簽+ognl表達式獲取值棧數(shù)據(jù)

<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集合的三種方法:

    方法一:

    <!-- 第一種方式實現(xiàn) -->
    <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里面的數(shù)據(jù)特點:寫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方法向值棧放數(shù)據(jù),獲取

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

    (2)向值棧放數(shù)據(jù),把向值棧放數(shù)據(jù)存到數(shù)組里面茅撞,數(shù)組名稱 top帆卓,根據(jù)數(shù)組獲取值

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

8.EL表達式獲取值棧數(shù)據(jù)

EL表達式為什么能取到值棧中的數(shù)據(jù)?

一般不推薦使用EL表達式獲取值棧數(shù)據(jù)米丘,效率低

  1. EL表達式獲取域?qū)ο笾?/p>

  2. 向域?qū)ο罄锩娣胖凳褂胹etAttribute方法鳞疲,獲取值使用getAttribute方法

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

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

(2)如果從request域獲取不到值悔橄,到值棧中把值獲取出來靶累,把值放到域?qū)ο罄锩?/p>

  1. 查看源代碼

9.ognl表達式#、%使用

9.1#使用

  1. 使用#獲取context里面數(shù)據(jù)癣疟,主要是域?qū)ο髷?shù)據(jù)

    <!-- 遍歷值棧list集合挣柬,得到每個user對象
     機制:把每次遍歷出來的user對象放到context里面
     獲取context里面的數(shù)據(jù)特點:寫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>

最后編輯于
?著作權歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末扎狱,一起剝皮案震驚了整個濱河市侧到,隨后出現(xiàn)的幾起案子勃教,更是在濱河造成了極大的恐慌,老刑警劉巖匠抗,帶你破解...
    沈念sama閱讀 212,383評論 6 493
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件故源,死亡現(xiàn)場離奇詭異,居然都是意外死亡汞贸,警方通過查閱死者的電腦和手機绳军,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,522評論 3 385
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來矢腻,“玉大人门驾,你說我怎么就攤上這事《喔蹋” “怎么了奶是?”我有些...
    開封第一講書人閱讀 157,852評論 0 348
  • 文/不壞的土叔 我叫張陵,是天一觀的道長顷蟆。 經(jīng)常有香客問我诫隅,道長,這世上最難降的妖魔是什么帐偎? 我笑而不...
    開封第一講書人閱讀 56,621評論 1 284
  • 正文 為了忘掉前任逐纬,我火速辦了婚禮,結果婚禮上削樊,老公的妹妹穿的比我還像新娘豁生。我一直安慰自己,他們只是感情好漫贞,可當我...
    茶點故事閱讀 65,741評論 6 386
  • 文/花漫 我一把揭開白布甸箱。 她就那樣靜靜地躺著,像睡著了一般迅脐。 火紅的嫁衣襯著肌膚如雪芍殖。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,929評論 1 290
  • 那天谴蔑,我揣著相機與錄音豌骏,去河邊找鬼。 笑死隐锭,一個胖子當著我的面吹牛窃躲,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播钦睡,決...
    沈念sama閱讀 39,076評論 3 410
  • 文/蒼蘭香墨 我猛地睜開眼蒂窒,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起洒琢,我...
    開封第一講書人閱讀 37,803評論 0 268
  • 序言:老撾萬榮一對情侶失蹤秧秉,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后纬凤,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體福贞,經(jīng)...
    沈念sama閱讀 44,265評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,582評論 2 327
  • 正文 我和宋清朗相戀三年停士,在試婚紗的時候發(fā)現(xiàn)自己被綠了挖帘。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 38,716評論 1 341
  • 序言:一個原本活蹦亂跳的男人離奇死亡恋技,死狀恐怖拇舀,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情蜻底,我是刑警寧澤骄崩,帶...
    沈念sama閱讀 34,395評論 4 333
  • 正文 年R本政府宣布,位于F島的核電站薄辅,受9級特大地震影響要拂,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜站楚,卻給世界環(huán)境...
    茶點故事閱讀 40,039評論 3 316
  • 文/蒙蒙 一脱惰、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧窿春,春花似錦拉一、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,798評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至尺栖,卻和暖如春嫡纠,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背延赌。 一陣腳步聲響...
    開封第一講書人閱讀 32,027評論 1 266
  • 我被黑心中介騙來泰國打工货徙, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人皮胡。 一個月前我還...
    沈念sama閱讀 46,488評論 2 361
  • 正文 我出身青樓,卻偏偏與公主長得像赏迟,于是被迫代替她去往敵國和親屡贺。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 43,612評論 2 350

推薦閱讀更多精彩內(nèi)容

  • 非本人總結的筆記,抄點筆記復習復習甩栈。感謝傳智博客和黑馬程序猿記筆記啊記筆記 Struts2國際化 什么是國際化 比...
    鍵盤瞎閱讀 396評論 0 3
  • 概述 什么是Struts2的框架Struts2是Struts1的下一代產(chǎn)品泻仙,是在 struts1和WebWork的...
    inke閱讀 2,247評論 0 50
  • action中如何接受頁面?zhèn)鬟^來的參數(shù) 第一種情況:(同名參數(shù)) 例如:通過頁面要把id=1 name=tom a...
    清楓_小天閱讀 2,944評論 1 22
  • 標簽 如果要配置的標簽,那么必須要先配置標簽量没,代表的包的概念玉转。 包含的屬性 name包的名稱,要求是唯一的殴蹄,管理a...
    偷偷得路過閱讀 1,327評論 0 0
  • 非本人總結的筆記究抓,抄點筆記復習復習。感謝傳智博客和黑馬程序猿記筆記啊記筆記 Ognl的簡介 Ognl是獨立的項目袭灯,...
    鍵盤瞎閱讀 514評論 0 2