国产xxxx99真实实拍_久久不雅视频_高清韩国a级特黄毛片_嗯老师别我我受不了了小说

資訊專欄INFORMATION COLUMN

Struts2【OGNL、valueStack】就是這么簡(jiǎn)單

Jenny_Tong / 798人閱讀

摘要:也被稱作值棧對(duì)象當(dāng)用戶訪問,都會(huì)創(chuàng)建一個(gè)對(duì)象,對(duì)象對(duì)象把對(duì)象放進(jìn)對(duì)象之中。對(duì)象維護(hù)了對(duì)象的數(shù)據(jù)存儲(chǔ)著等數(shù)據(jù)也就是說通過對(duì)象可以獲取大部分我們需要的數(shù)據(jù)了。

什么是OGNL表達(dá)式?

OGNL是Object Graphic Navigation Language 是操作對(duì)象屬性的開源表達(dá)式。 Struts2框架使用OGNL作為默認(rèn)的表達(dá)式語(yǔ)言。

為什么我們學(xué)習(xí)OGNL

在學(xué)習(xí)JSP的時(shí)候,我們已經(jīng)學(xué)習(xí)過了EL表達(dá)式。EL表達(dá)式用起來也十分簡(jiǎn)單...我們?cè)赟truts2框架中也是可以使用EL表達(dá)式的...那么OGNL表達(dá)式好在哪里呢??

支持對(duì)象方法調(diào)用,如xxx.doSomeSpecial()

支持類靜態(tài)的方法調(diào)用和值訪問,表達(dá)式的格式【例如:"@@floor(10.9)"就是調(diào)用Math.floor()的方法了】

支持賦值操作和表達(dá)式串聯(lián)【這個(gè)其實(shí)EL表達(dá)式也能做】

訪問OGNL上下文(OGNL context)和ActionContext

操作集合對(duì)象【EL只能遍歷集合,OGNL可以創(chuàng)建集合】

OGNL是Struts2的默認(rèn)表達(dá)式語(yǔ)言,OGNL是配搭Strut2的標(biāo)簽使用的..我們學(xué)習(xí)了OGNL表達(dá)式,就可以更好地理解Struts2標(biāo)簽的運(yùn)行以及Struts2內(nèi)部的存儲(chǔ)結(jié)構(gòu).

valueStack對(duì)象

在講解OGNL表達(dá)式之前,我們先來看看valueStack對(duì)象...valueStack是Struts2數(shù)據(jù)存儲(chǔ)的核心...我們首先要知道數(shù)據(jù)是怎么存的,存到哪里,然后才講解OGNL表達(dá)式是怎么取出數(shù)據(jù)的

valueStack也被稱作值棧對(duì)象..

當(dāng)用戶訪問Action,都會(huì)創(chuàng)建一個(gè)Action對(duì)象,ActionContext對(duì)象、valueStack對(duì)象..

Struts2把Action對(duì)象放進(jìn)valueStack對(duì)象之中

將valueStack放進(jìn)request域中,傳入JSP頁(yè)面(key: struts.valueStack)

JSP頁(yè)面就可以使用OGNL表達(dá)式獲取值棧中的數(shù)據(jù)了

獲取valueStack對(duì)象

在Action中我們可以手動(dòng)獲取值棧對(duì)象,有兩種方式獲取

    //獲取值棧對(duì)象的2種方式
    private void getVs() {
        // 獲取值棧對(duì)象,方式1:
        HttpServletRequest request = ServletActionContext.getRequest();
        ValueStack vs1 = (ValueStack) request.getAttribute("struts.valueStack");
        
        // 獲取值棧對(duì)象,方式2: 
        ActionContext ac = ActionContext.getContext();
        ValueStack vs2 = ac.getValueStack();
        
        System.out.println(vs1 == vs2);//true
    }
    
valueStack內(nèi)部存儲(chǔ)結(jié)構(gòu)

上面已經(jīng)說了,用戶訪問Action時(shí),會(huì)創(chuàng)建Action對(duì)象,valueStack對(duì)象。Struts2內(nèi)部會(huì)將Action對(duì)象存到valueStack對(duì)象之中...那么valueStack的存儲(chǔ)結(jié)構(gòu)是什么樣的呢???我們來看看

CompoundRoot

Action對(duì)象和Action的成員屬性等值都是存到CompoundRoot下的.該CompoundRoot繼承著ArrayList,因此它是List結(jié)構(gòu)的

    public class CompoundRoot extends ArrayList {}
OgnlContext

OgnlContext對(duì)象存儲(chǔ)著相關(guān)的域?qū)ο螅簉equest、response、session等數(shù)據(jù),實(shí)現(xiàn)Map集合,是Map結(jié)構(gòu)..

為了讓request、response等域?qū)ο罂梢源鎯?chǔ)多個(gè)值,值也是使用Map結(jié)構(gòu)...

public class OgnlContext implements Map {}
小總結(jié)

CompoundRoot保存著這樣的數(shù)據(jù):

Action對(duì)象以及Action對(duì)象的成員屬性數(shù)據(jù)

使用ValueStack對(duì)象.push()進(jìn)去的數(shù)據(jù)

使用ValueStack對(duì)象.set()進(jìn)去的數(shù)據(jù)

其他代理對(duì)象的數(shù)據(jù)

OgnlContext保存著這樣的數(shù)據(jù):

維護(hù)了CompoundRoot中所有的數(shù)據(jù)

request、response等域?qū)ο笏械臄?shù)據(jù)

OGNL表達(dá)式取值

Struts2會(huì)將valueStack對(duì)象封裝進(jìn)request對(duì)象域中,傳入JSP頁(yè)面。

valueStack存儲(chǔ)著OgnlContext對(duì)象。

OgnlContext對(duì)象維護(hù)了CompoundRoot對(duì)象的數(shù)據(jù)

CompoundRoot存儲(chǔ)著Action等數(shù)據(jù)

也就是說通過OgnlContext對(duì)象可以獲取大部分我們需要的數(shù)據(jù)了。

那么OGNL表達(dá)式是怎么取出OgnlContext對(duì)象中數(shù)據(jù)的呢??下面我們通過硬編碼的方式來講解

    /**
     * 1. Ognl表達(dá)式語(yǔ)言語(yǔ)言取值,取非根元素的值,必須用#號(hào)
     * @throws Exception
     */
    @Test
    public void testOgnl() throws Exception {
        // 創(chuàng)建一個(gè)Ognl上下文對(duì)象
        OgnlContext context = new OgnlContext();
        // 放入數(shù)據(jù)
        User user = new User();
        user.setId(100);
        user.setName("Jack");
        // 【往非根元素放入數(shù)據(jù), 取值的時(shí)候表達(dá)式要用"#"】
        context.put("user", user);
        
        // 獲取數(shù)據(jù)(map)
        // 先構(gòu)建一個(gè)Ognl表達(dá)式, 再解析表達(dá)式
        Object ognl = Ognl.parseExpression("#user.name");
        Object value = Ognl.getValue(ognl, context, context.getRoot());
        
        System.out.println(value);
    }
    
    /**
     * 2. Ognl表達(dá)式語(yǔ)言語(yǔ)言取值,取根元素的值,不用帶#號(hào)
     * @throws Exception
     */
    @Test
    public void testOgn2() throws Exception {
        // 創(chuàng)建一個(gè)Ognl上下文對(duì)象
        OgnlContext context = new OgnlContext();
        // 放入數(shù)據(jù)
        User user = new User();
        user.setId(100);
        user.setName("Jack");
        // 【往根元素放入數(shù)據(jù)】
        context.setRoot(user);
        
        // 獲取數(shù)據(jù)(map)
        // 先構(gòu)建一個(gè)Ognl表達(dá)式, 再解析表達(dá)式
        Object ognl = Ognl.parseExpression("address.province");
        Object value = Ognl.getValue(ognl, context, context.getRoot());
        
        System.out.println(value);
    }
    

也就是說,JSP頁(yè)面中取出數(shù)據(jù)的時(shí)候,它會(huì)先構(gòu)建一個(gè)OGNL表達(dá)式,再解析表達(dá)式

如果是CompoundRoot類的數(shù)據(jù),表達(dá)式不需要帶#號(hào)

如果不是CompoundRoot類的數(shù)據(jù),表達(dá)式需要帶#號(hào)

例子:

      
     
1. 取根元素的值

2. 取非根元素的值


OGNL對(duì)靜態(tài)方法的調(diào)用
    /**
     * 3.Ognl對(duì) 靜態(tài)方法調(diào)用的支持
     * @throws Exception
     */
    @Test
    public void testOgn3() throws Exception {
        // 創(chuàng)建一個(gè)Ognl上下文對(duì)象
        OgnlContext context = new OgnlContext();
        
        // Ognl表單式語(yǔ)言,調(diào)用類的靜態(tài)方法
        //Object ognl = Ognl.parseExpression("@Math@floor(10.9)");
        // 由于Math類在開發(fā)中比較常用,所以也可以這樣寫
        Object ognl = Ognl.parseExpression("@@floor(10.9)");
        Object value = Ognl.getValue(ognl, context, context.getRoot());
        System.out.println(value);
    }
OGNL創(chuàng)建集合
    
一、.構(gòu)建 list集合

一、.構(gòu)建 map集合

構(gòu)建Map集合的時(shí)候,需要使用#號(hào)

OGNL 幾個(gè)特殊的符號(hào)

#獲取非根元素值 、 動(dòng)態(tài)都建map集合
$ 在配置文件取值
% 提供一個(gè)ognl表達(dá)式運(yùn)行環(huán)境


       
獲取request域數(shù)據(jù)



國(guó)家:
如果文章有錯(cuò)的地方歡迎指正,大家互相交流。習(xí)慣在微信看技術(shù)文章,想要獲取更多的Java資源的同學(xué),可以關(guān)注微信公眾號(hào):Java3y

文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請(qǐng)注明本文地址:http://specialneedsforspecialkids.com/yun/68738.html

相關(guān)文章

  • 納稅服務(wù)系統(tǒng)【總結(jié)】

    摘要:要是使用到日歷的話,我們想到使用這個(gè)日歷類上面僅僅是我個(gè)人總結(jié)的要點(diǎn),如果有錯(cuò)誤的地方還請(qǐng)大家給我指正。 納稅服務(wù)系統(tǒng)總結(jié) 納稅服務(wù)系統(tǒng)是我第一個(gè)做得比較大的項(xiàng)目(不同于javaWeb小項(xiàng)目),該項(xiàng)目系統(tǒng)來源于傳智Java32期,十天的視頻課程(想要視頻的同學(xué)關(guān)注我的公眾號(hào)就可以直接獲取了) 我跟著練習(xí)一步一步完成需求,才發(fā)覺原來Java是這樣用來做網(wǎng)站的,Java有那么多的類庫(kù),頁(yè)面...

    ispring 評(píng)論0 收藏0
  • Java3y文章目錄導(dǎo)航

    摘要:前言由于寫的文章已經(jīng)是有點(diǎn)多了,為了自己和大家的檢索方便,于是我就做了這么一個(gè)博客導(dǎo)航。 前言 由于寫的文章已經(jīng)是有點(diǎn)多了,為了自己和大家的檢索方便,于是我就做了這么一個(gè)博客導(dǎo)航。 由于更新比較頻繁,因此隔一段時(shí)間才會(huì)更新目錄導(dǎo)航哦~想要獲取最新原創(chuàng)的技術(shù)文章歡迎關(guān)注我的公眾號(hào):Java3y Java3y文章目錄導(dǎo)航 Java基礎(chǔ) 泛型就這么簡(jiǎn)單 注解就這么簡(jiǎn)單 Druid數(shù)據(jù)庫(kù)連接池...

    KevinYan 評(píng)論0 收藏0
  • Struts2【UI標(biāo)簽、數(shù)據(jù)回顯、資源國(guó)際化】

    摘要:值得注意的是的值是文件的全名也就是說,如果有包,就把包名寫上并且,不需要寫上后綴標(biāo)簽使用國(guó)際化的值是配置文件中配置的信息,寫上就行了登陸測(cè)試注意,已經(jīng)替換成了中文了如果文章有錯(cuò)的地方歡迎指正,大家互相交流。 Struts2UI標(biāo)簽 Sturts2為了簡(jiǎn)化我們的開發(fā),也為我們提供了UI標(biāo)簽...也就是顯示頁(yè)面的標(biāo)簽..... 但是呢,Struts2是服務(wù)端的框架,因此使用頁(yè)面的標(biāo)簽是需要...

    graf 評(píng)論0 收藏0
  • Struts 攔截器

    摘要:介紹實(shí)現(xiàn)的方式用于實(shí)現(xiàn)之前之后執(zhí)行一般用于事物操作一般用于對(duì)某些未授權(quán)的頁(yè)面訪問的時(shí)候進(jìn)行攔截操作攔截非法訪問開箱即用攔截器攔截器傳遞屬性攔截器測(cè)算執(zhí)行時(shí)間必須有傳遞屬性這個(gè)攔截器運(yùn)行輸出日志如下可以 介紹 實(shí)現(xiàn)aop的方式用于實(shí)現(xiàn)action之前,之后執(zhí)行一般用于事物操作.一般用于對(duì)某些未授權(quán)的頁(yè)面訪問的時(shí)候,進(jìn)行攔截操作,攔截非法訪問. 開箱即用攔截器 ...

    roland_reed 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

最新活動(dòng)
閱讀需要支付1元查看
<