Struts2_day03

Struts2_day03

1.ognl概述

  1. 之前web階段,學(xué)習(xí)過EL表達(dá)式,EL表達(dá)式在jsp中獲取域?qū)ο罄锩娴闹?/p>

  2. OGNL是一種表達(dá)式,這個(gè)表達(dá)式功能更加強(qiáng)大,

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

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

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

    (1)使用ognl時(shí)候首先導(dǎo)入jar包,struts2提供jar包

2.ognl入門案例

  1. 使用ognl+struts2標(biāo)簽實(shí)現(xiàn)計(jì)算字符串長度

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

    (1)使用jstl時(shí)候,導(dǎo)入jar包之外,在jsp頁面中引入標(biāo)簽庫

    使用struts2標(biāo)簽時(shí)候,也要在jsp中引入標(biāo)簽庫

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

    (2)使用struts2標(biāo)簽實(shí)現(xiàn)操作

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

3.什么是值棧

  1. 之前在web階段,在servlet里面進(jìn)行操作,把數(shù)據(jù)放到域?qū)ο罄锩?,在頁面中使用el表達(dá)式獲取到,域?qū)ο笤谝欢ǚ秶鷥?nèi),存值和取值

  2. 在struts2里面提供本身一種存儲(chǔ)機(jī)制,類似于域?qū)ο?,是值棧,可以存值和取?/p>

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

3.1servlet和action區(qū)別

(1)Servlet:默認(rèn)在第一次訪問時(shí)候創(chuàng)建,創(chuàng)建一次,單實(shí)例對(duì)象

(2)Action:訪問時(shí)候創(chuàng)建,每次訪問action時(shí)候,都會(huì)創(chuàng)建action對(duì)象,創(chuàng)建多次,多實(shí)例對(duì)象

3.2值棧存儲(chǔ)位置

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

(2)在每個(gè)action對(duì)象里面都會(huì)有一個(gè)值棧對(duì)象(只有一個(gè))

  • 值棧對(duì)象里面有action引用

4.怎么獲取值棧對(duì)象

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

5.值棧內(nèi)部結(jié)構(gòu)

5.1root:list集合

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

5.2context:map集合

5.3debug標(biāo)簽

struts2里面標(biāo)簽s:debug,使用這個(gè)標(biāo)簽可以查看值棧結(jié)構(gòu)和存儲(chǔ)值

點(diǎn)擊超鏈接看到結(jié)構(gòu)

(1)訪問action,執(zhí)行action的方法有返回值,配置返回值到j(luò)sp頁面中,在jsp頁面中使用這個(gè)標(biāo)簽

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

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

6.1向值棧放字符串

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

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

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

// 1.獲取值棧對(duì)象,調(diào)用值棧對(duì)象里面的 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 {
        // 獲取值棧對(duì)象
        ActionContext context = ActionContext.getContext();
        ValueStack stack = context.getValueStack();
        // 3.給變量賦值
        name = "hello";
        return "success";
    }
}

6.2向值棧放對(duì)象

以下均為6.1的第三種方法

實(shí)現(xiàn)步驟:

第一步 定義對(duì)象變量

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

第二步 生成變量的get方法

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

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

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

6.3向值棧放list集合

以下均為6.1的第三種方法

實(shí)現(xiàn)步驟:

第一步 定義list集合變量

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

第二步 生成變量的get方法

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

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

// 第三步 在執(zhí)行的方法里面向List設(shè)置值
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的標(biāo)簽+ognl表達(dá)式獲取值棧數(shù)據(jù)

<s:property value="ognl表達(dá)式"/>

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標(biāo)簽+ognl表達(dá)式獲取

    <s:property value="username" />
    

7.2從值棧獲取對(duì)象

  1. 向值棧放對(duì)象

    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. 向值棧放對(duì)象
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集合的三種方法:

    方法一:

    <!-- 第一種方式實(shí)現(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里面的每個(gè)user對(duì)象 -->
    <s:iterator value="list">
     <s:property value="username" />
     <s:property value="password" />
    </s:iterator>
    

    方法三:

    <!-- 遍歷值棧list集合,得到每個(gè)user對(duì)象
     機(jī)制:把每次遍歷出來的user對(duì)象放到context里面
     獲取context里面的數(shù)據(jù)特點(diǎn):寫ognl表達(dá)式,
     使用特殊符號(hào)#     -->
    <s:iterator value="list" var="user">
     <s:property value="#user.username" />
     <s:property value="#user.password" />
    </s:iterator>
    

7.4補(bǔ)充set和push方法

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

    <s:iterator value="name">

  2. 使用push方法向值棧放數(shù)據(jù),獲取

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

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

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

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

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

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

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

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

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

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

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

  1. 查看源代碼

9.ognl表達(dá)式#、%使用

9.1#使用

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

    <!-- 遍歷值棧list集合,得到每個(gè)user對(duì)象
     機(jī)制:把每次遍歷出來的user對(duì)象放到context里面
     獲取context里面的數(shù)據(jù)特點(diǎn):寫ognl表達(dá)式,
     使用特殊符號(hào)#     -->
    <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標(biāo)簽中表單標(biāo)簽

    (1)在struts2標(biāo)簽里面使用ognl表達(dá)式,如果直接在struts2表單標(biāo)簽里面使用ognl表達(dá)式不識(shí)別,只有%之后才會(huì)識(shí)別。

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

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 非本人總結(jié)的筆記,抄點(diǎn)筆記復(fù)習(xí)復(fù)習(xí)。感謝傳智博客和黑馬程序猿記筆記啊記筆記 Struts2國際化 什么是國際化 比...
    鍵盤瞎閱讀 463評(píng)論 0 3
  • 概述 什么是Struts2的框架Struts2是Struts1的下一代產(chǎn)品,是在 struts1和WebWork的...
    inke閱讀 2,343評(píng)論 0 50
  • action中如何接受頁面?zhèn)鬟^來的參數(shù) 第一種情況:(同名參數(shù)) 例如:通過頁面要把id=1 name=tom a...
    清楓_小天閱讀 3,292評(píng)論 1 22
  • 標(biāo)簽 如果要配置的標(biāo)簽,那么必須要先配置標(biāo)簽,代表的包的概念。 包含的屬性 name包的名稱,要求是唯一的,管理a...
    偷偷得路過閱讀 1,516評(píng)論 0 0
  • 非本人總結(jié)的筆記,抄點(diǎn)筆記復(fù)習(xí)復(fù)習(xí)。感謝傳智博客和黑馬程序猿記筆記啊記筆記 Ognl的簡介 Ognl是獨(dú)立的項(xiàng)目,...
    鍵盤瞎閱讀 636評(píng)論 0 2

友情鏈接更多精彩內(nèi)容