struts2 Ognl

什么是Ognl

1链韭、存取對(duì)象的任意屬性,簡(jiǎn)單說(shuō)就是對(duì)javabean進(jìn)行操作(重要)
2窍株、調(diào)用對(duì)象方法民轴。
3、調(diào)用類的靜態(tài)方法
4球订、索引數(shù)組元素
5后裸、操作集合(重 要)

Ognl操作方法

操作之前必須知道如何使用OGNL表達(dá)式,并且了解OGNL表達(dá)式的取值范圍只能在其context和root中辙售,格式為

Ognl.getValue(expression,context,root);
//expression:為我們編寫(xiě)的ognl表達(dá)式轻抱,從后兩個(gè)參數(shù)中獲取值,獲取規(guī)則會(huì)從下面的例子中詳細(xì)講解
//context:ognl的上下文旦部,類型為map祈搜,
//root:ognl的根较店,可以為javabean、list容燕、map梁呈、.... 等等很多值
  • 對(duì)javabean操作
package other;

import ognl.Ognl;
import ognl.OgnlException;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

public class OgnlLearn {
    public static void main(String[] args) throws Exception{
        // Ognl.getValue(expression,context,root);
        test1();   // 取值
        test2();
        test3();
        test4();
        test5();   // 設(shè)定值
        test6();
        test7();   // 其他操作
        test8();
        test9();
        test10();
    }

    public static void test1() throws OgnlException {
        User user = new User();
        user.setName("monster");
        String name = (String) Ognl.getValue("name",new HashMap(),user);
        System.out.println(name);
    }

    public static void test2() throws OgnlException {
        User user = new User();
        user.setAge(2);
        int name = (Integer) Ognl.getValue("age",new HashMap(),user);
        System.out.println(name);
    }

    public static void test3() throws OgnlException {
        User user = new User();
        user.setPassword("123456");
        String name = (String) Ognl.getValue("password",new HashMap(),user);
        System.out.println(name);
    }

    public static void test4() throws OgnlException {
        User user = new User();
        Address address = new Address();
        address.setCity("beijing");
        address.setStreet("haidian");
        user.setAddress(address);
        String city = (String) Ognl.getValue("address.city",new HashMap(),user);
        String street = (String) Ognl.getValue("address.street",new HashMap(),user);
        System.out.println(city + "***" + street);
    }

    public static void test5() throws OgnlException {
        User user = new User();
        Ognl.getValue("name = 'monster1'",new HashMap(),user);
        System.out.println(user.getName());
    }

    public static void test6() throws OgnlException {
        User user = new User();
        Address address = new Address();
        address.setCity("shanghai");
        user.setAddress(address);
        //Ognl.getValue("address = address",new HashMap(),user);
        String city = (String) Ognl.getValue("address.city",new HashMap(),user);

        System.out.println(city);

    }

    public static void test7() throws OgnlException{
        List<User> uList = new ArrayList<>();
        User user1 = new User();
        user1.setName("monster1");
        uList.add(user1);
        User user2 = new User();
        user2.setName("monster2");
        uList.add(user2);
        System.out.println(Ognl.getValue("[0].name",new HashMap(),uList));
        System.out.println(Ognl.getValue("[1].name",new HashMap(),uList));
    }

    public static void test8() throws OgnlException{
        Map<String,String> mymap = new HashMap<>();
        mymap.put("key1","value1");
        mymap.put("key2","value2");

        System.out.println(Ognl.getValue("key1",new HashMap(),mymap));
        System.out.println(Ognl.getValue("key2",new HashMap(),mymap));
    }

    public static void test9() throws OgnlException{
        User user = new User();
        List<String> nameList = (List<String>) Ognl.getValue("{'TOM','PETER'}",new HashMap(),user);
    }

    public static void test10() throws OgnlException{
        User user = new User();
        Map<String,String> mymap = (Map<String, String>) Ognl.getValue("#{'TOM':'cat','PETER':'bigdog'}",new HashMap(),user);
    }

}

user.java

package other;

public class User {
    private String name;
    private String password;
    private int age;
    private Address address;

    public Address getAddress() {
        return address;
    }

    public void setAddress(Address address) {
        this.address = address;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }

    public String getPassword() {
        return password;
    }

    public void setPassword(String password) {
        this.password = password;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }
}

address.java

package other;

public class Address {
    private String city;
    private String street;

    public String getStreet() {
        return street;
    }

    public void setStreet(String street) {
        this.street = street;
    }

    public String getCity() {
        return city;
    }

    public void setCity(String city) {
        this.city = city;
    }
}
  • 集合操作
    • 操作list集合,list結(jié)合本質(zhì)就是一個(gè)數(shù)組蘸秘,所以從list中讀取數(shù)據(jù)跟對(duì)數(shù)組的操作是一樣的官卡。
    • 操作map集合
    • 創(chuàng)建list集合
    • 創(chuàng)建map集合

Ognl 與 Struts2 的集合

OGNL中的上下文即struts2中的actionContext
OGNL中的root即struts2中的valueStack

actionContext 與 valueStack 的關(guān)系

ActionContext:
充當(dāng)OGNL的context。是action的上下文醋虏,也可以叫做action的數(shù)據(jù)中心寻咒,本質(zhì)是一個(gè)map,在其中颈嚼,所有的數(shù)據(jù)都存放在這里毛秘,那其中到底存放了哪些東西呢,actionContext中存放數(shù)據(jù)的方式又是怎樣的阻课?
actionContext是一個(gè)map叫挟,所以其中都是以鍵值對(duì)的形式存儲(chǔ)對(duì)象,如下圖所示限煞,
request抹恳、session、application這種我們熟知的作用域署驻,注意是作用域奋献,而不是對(duì)象,
paramters:這個(gè)是表單提交的參數(shù)旺上,全部都會(huì)放到這個(gè)map中秽荞,
attr(attributes):三個(gè)作用域所有的屬性都會(huì)放在該map下,如果有重復(fù)的抚官,那么以request域中的為準(zhǔn)。
VALUE_STACK:值棧阶捆,存放著valueStack對(duì)象凌节,也就是說(shuō),通過(guò)ActionContext能夠獲取到valueStack洒试。


圖片.png

也就是說(shuō)倍奢,通過(guò)valueStack可以獲取到actionContext,通過(guò)ActionContext也可以獲取到valueStack垒棋。
valueStack是對(duì)root進(jìn)行操作卒煞,而actionContext是對(duì)context進(jìn)行操作。(root和context是OGNL中的根和上下文)

獲取值棧的方式:

ActionContext.getContext.getValueStack();//常用

ActionContext.getContext.get("VALUE_STACK");

獲取actionContext的方式
ActionContext.getContext();  //常用

valueStack.getContext();

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末叼架,一起剝皮案震驚了整個(gè)濱河市畔裕,隨后出現(xiàn)的幾起案子衣撬,更是在濱河造成了極大的恐慌,老刑警劉巖扮饶,帶你破解...
    沈念sama閱讀 217,406評(píng)論 6 503
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件具练,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡甜无,警方通過(guò)查閱死者的電腦和手機(jī)扛点,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,732評(píng)論 3 393
  • 文/潘曉璐 我一進(jìn)店門(mén),熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)岂丘,“玉大人陵究,你說(shuō)我怎么就攤上這事“铝保” “怎么了铜邮?”我有些...
    開(kāi)封第一講書(shū)人閱讀 163,711評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)翩概。 經(jīng)常有香客問(wèn)我牲距,道長(zhǎng),這世上最難降的妖魔是什么钥庇? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,380評(píng)論 1 293
  • 正文 為了忘掉前任牍鞠,我火速辦了婚禮,結(jié)果婚禮上评姨,老公的妹妹穿的比我還像新娘难述。我一直安慰自己,他們只是感情好吐句,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,432評(píng)論 6 392
  • 文/花漫 我一把揭開(kāi)白布胁后。 她就那樣靜靜地躺著,像睡著了一般嗦枢。 火紅的嫁衣襯著肌膚如雪攀芯。 梳的紋絲不亂的頭發(fā)上,一...
    開(kāi)封第一講書(shū)人閱讀 51,301評(píng)論 1 301
  • 那天文虏,我揣著相機(jī)與錄音侣诺,去河邊找鬼。 笑死氧秘,一個(gè)胖子當(dāng)著我的面吹牛年鸳,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播丸相,決...
    沈念sama閱讀 40,145評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼搔确,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起膳算,我...
    開(kāi)封第一講書(shū)人閱讀 39,008評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤座硕,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后畦幢,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體坎吻,經(jīng)...
    沈念sama閱讀 45,443評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,649評(píng)論 3 334
  • 正文 我和宋清朗相戀三年宇葱,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了瘦真。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 39,795評(píng)論 1 347
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡黍瞧,死狀恐怖诸尽,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情印颤,我是刑警寧澤您机,帶...
    沈念sama閱讀 35,501評(píng)論 5 345
  • 正文 年R本政府宣布,位于F島的核電站年局,受9級(jí)特大地震影響际看,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜矢否,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,119評(píng)論 3 328
  • 文/蒙蒙 一仲闽、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧僵朗,春花似錦赖欣、人聲如沸。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 31,731評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至粪薛,卻和暖如春悴了,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背违寿。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 32,865評(píng)論 1 269
  • 我被黑心中介騙來(lái)泰國(guó)打工让禀, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人陨界。 一個(gè)月前我還...
    沈念sama閱讀 47,899評(píng)論 2 370
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像痛阻,于是被迫代替她去往敵國(guó)和親菌瘪。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,724評(píng)論 2 354

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