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

資訊專欄INFORMATION COLUMN

Struts2【OGNL、valueStack】就是這么簡單

Jenny_Tong / 809人閱讀

摘要:也被稱作值棧對象當用戶訪問,都會創建一個對象,對象對象把對象放進對象之中。對象維護了對象的數據存儲著等數據也就是說通過對象可以獲取大部分我們需要的數據了。

什么是OGNL表達式?

OGNL是Object Graphic Navigation Language 是操作對象屬性的開源表達式。 Struts2框架使用OGNL作為默認的表達式語言。

為什么我們學習OGNL

在學習JSP的時候,我們已經學習過了EL表達式。EL表達式用起來也十分簡單...我們在Struts2框架中也是可以使用EL表達式的...那么OGNL表達式好在哪里呢??

支持對象方法調用,如xxx.doSomeSpecial()

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

支持賦值操作和表達式串聯【這個其實EL表達式也能做】

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

操作集合對象【EL只能遍歷集合,OGNL可以創建集合】

OGNL是Struts2的默認表達式語言,OGNL是配搭Strut2的標簽使用的..我們學習了OGNL表達式,就可以更好地理解Struts2標簽的運行以及Struts2內部的存儲結構.

valueStack對象

在講解OGNL表達式之前,我們先來看看valueStack對象...valueStack是Struts2數據存儲的核心...我們首先要知道數據是怎么存的,存到哪里,然后才講解OGNL表達式是怎么取出數據的

valueStack也被稱作值棧對象..

當用戶訪問Action,都會創建一個Action對象,ActionContext對象、valueStack對象..

Struts2把Action對象放進valueStack對象之中

將valueStack放進request域中,傳入JSP頁面(key: struts.valueStack)

JSP頁面就可以使用OGNL表達式獲取值棧中的數據了

獲取valueStack對象

在Action中我們可以手動獲取值棧對象,有兩種方式獲取

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

上面已經說了,用戶訪問Action時,會創建Action對象,valueStack對象。Struts2內部會將Action對象存到valueStack對象之中...那么valueStack的存儲結構是什么樣的呢???我們來看看

CompoundRoot

Action對象和Action的成員屬性等值都是存到CompoundRoot下的.該CompoundRoot繼承著ArrayList,因此它是List結構的

    public class CompoundRoot extends ArrayList {}
OgnlContext

OgnlContext對象存儲著相關的域對象:request、response、session等數據,實現Map集合,是Map結構..

為了讓request、response等域對象可以存儲多個值,值也是使用Map結構...

public class OgnlContext implements Map {}
小總結

CompoundRoot保存著這樣的數據:

Action對象以及Action對象的成員屬性數據

使用ValueStack對象.push()進去的數據

使用ValueStack對象.set()進去的數據

其他代理對象的數據

OgnlContext保存著這樣的數據:

維護了CompoundRoot中所有的數據

request、response等域對象所有的數據

OGNL表達式取值

Struts2會將valueStack對象封裝進request對象域中,傳入JSP頁面。

valueStack存儲著OgnlContext對象。

OgnlContext對象維護了CompoundRoot對象的數據

CompoundRoot存儲著Action等數據

也就是說通過OgnlContext對象可以獲取大部分我們需要的數據了。

那么OGNL表達式是怎么取出OgnlContext對象中數據的呢??下面我們通過硬編碼的方式來講解

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

也就是說,JSP頁面中取出數據的時候,它會先構建一個OGNL表達式,再解析表達式

如果是CompoundRoot類的數據,表達式不需要帶#號

如果不是CompoundRoot類的數據,表達式需要帶#號

例子:

      
     
1. 取根元素的值

2. 取非根元素的值


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

一、.構建 map集合

構建Map集合的時候,需要使用#號

OGNL 幾個特殊的符號

#獲取非根元素值 、 動態都建map集合
$ 在配置文件取值
% 提供一個ognl表達式運行環境


       
獲取request域數據



國家:
如果文章有錯的地方歡迎指正,大家互相交流。習慣在微信看技術文章,想要獲取更多的Java資源的同學,可以關注微信公眾號:Java3y

文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。

轉載請注明本文地址:http://m.specialneedsforspecialkids.com/yun/68738.html

相關文章

  • 納稅服務系統【總結】

    摘要:要是使用到日歷的話,我們想到使用這個日歷類上面僅僅是我個人總結的要點,如果有錯誤的地方還請大家給我指正。 納稅服務系統總結 納稅服務系統是我第一個做得比較大的項目(不同于javaWeb小項目),該項目系統來源于傳智Java32期,十天的視頻課程(想要視頻的同學關注我的公眾號就可以直接獲取了) 我跟著練習一步一步完成需求,才發覺原來Java是這樣用來做網站的,Java有那么多的類庫,頁面...

    ispring 評論0 收藏0
  • Java3y文章目錄導航

    摘要:前言由于寫的文章已經是有點多了,為了自己和大家的檢索方便,于是我就做了這么一個博客導航。 前言 由于寫的文章已經是有點多了,為了自己和大家的檢索方便,于是我就做了這么一個博客導航。 由于更新比較頻繁,因此隔一段時間才會更新目錄導航哦~想要獲取最新原創的技術文章歡迎關注我的公眾號:Java3y Java3y文章目錄導航 Java基礎 泛型就這么簡單 注解就這么簡單 Druid數據庫連接池...

    KevinYan 評論0 收藏0
  • Struts2【UI標簽、數據回顯、資源國際化】

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

    graf 評論0 收藏0
  • Struts 攔截器

    摘要:介紹實現的方式用于實現之前之后執行一般用于事物操作一般用于對某些未授權的頁面訪問的時候進行攔截操作攔截非法訪問開箱即用攔截器攔截器傳遞屬性攔截器測算執行時間必須有傳遞屬性這個攔截器運行輸出日志如下可以 介紹 實現aop的方式用于實現action之前,之后執行一般用于事物操作.一般用于對某些未授權的頁面訪問的時候,進行攔截操作,攔截非法訪問. 開箱即用攔截器 ...

    roland_reed 評論0 收藏0

發表評論

0條評論

最新活動
閱讀需要支付1元查看
<