<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    小菜毛毛技術分享

    與大家共同成長

      BlogJava :: 首頁 :: 聯系 :: 聚合  :: 管理
      164 Posts :: 141 Stories :: 94 Comments :: 0 Trackbacks

    OGNL介紹
    OGNL是Object-Graph Navigation Language的縮寫,它是一種功能強大的表達式語言(Expression Language,簡稱為EL),通過它簡單一致的表達式語法,可以存取對象的任意屬性,調用對象的方法,遍歷整個對象的結構圖,實現字段類型轉化等功 能。它使用相同的表達式去存取對象的屬性。
    XWork遵循“不要重復地發明同一個輪子”的理論,它的表達式語言核心用的就是這個OGNL。我們先 來看看一個簡單的例子:
    還記得我們用戶注冊的那個例子嗎?我們輸入框的name用到的名字就是OGNL的表達式,比如:用戶名的輸入 框:“<input type="text" name="user.username">”,在用戶注冊成功之后我們要顯示用戶注冊的信息,用了“<ww:property value="user.username"/>”。Input輸入框里的“user.username”,它解析成Java語句 為:getUser().setUsername();,property標簽里的“user.username”解析為Java語 句:getUser.getUsername();。
    我們的兩個表達式都是相同的,但前一個保存對象屬性的值,后一個是取得對象屬性的值。表達式 語言簡單、易懂卻又功能強大,關于OGNL更多的介紹可以去http://www.ognl.org, 那里有很詳細的文檔
     
    值堆棧-OgnlValueStack
    OGNL在框架中的應用,最主要是支持我們的值堆棧(Value Stack)——OgnlValueStack,它主要的功能是通過表達式語言來存取對象的屬性。用戶界面輸入數據,它會根據保存表達式將數據依次保存到 它堆棧的對象中,業務操作完成,結果數據會通過表達式被獲取、輸出。
    還記得我們用戶注冊的例子嗎?下面我們用一段程序來演示它向 OgnlValueStack中保存、取得數據的步驟:
     
    // DemoRegisterValueStack
    package example.register;
    import com.opensymphony.xwork.util.OgnlValueStack;
     
    public class DemoRegisterValueStack {
        public void demo(){
            RegisterAction action = new RegisterAction();
            OgnlValueStack valueStack= new OgnlValueStack();
            valueStack.push(action);
           
            valueStack.setValue("user.username","Babydavic");
            System.out.println("username = "+valueStack.findValue("user.username"));
        }
     
        public static void main(String[] args) {
    DemoRegisterValueStack demoValueStack = new DemoRegisterValueStack();
            demoValueStack.demo();
        }
    }
     
    我們來看一看它的demo()方法:
    1、   創建我們的Action(RegisterAction)類的對象action,將action對象壓入堆棧valueStack中。在WebWrok中 Action的創建、入棧是在DefaultActionInvocation構造函數中進行的,詳細介紹見:ServletDispatcher原理。
    2、   通過表達式語言,調用堆棧對象的get()、set()方法,設置該對象的值。
       public void setValue(String expr, Object value)
       語句:valueStack.setValue("user.username","Babydavic");
       的作用等同于:action.getUser().setUsername("Babydavic");
    3、   通過表達式語言,去堆棧對象中查找我們前面保存的值,并在控制臺打印。valueStack.findValue("user.username")等同 與語句:
    action.getUser().getUsername()
    最后控制臺打印的結果:
             username = Babydavic
     
     
    CompoundRoot
    在OgnlValueStack中,一個堆棧其 實是一個List。查看OgnlValueStack你會發現,堆棧就是 com.opensymphony.xwork.util.CompoundRoot類的對象:
     
    public class CompoundRoot extends ArrayList {
        //~ Constructors /////////////////////////////////////
        public CompoundRoot() {
    }
     
        public CompoundRoot(List list) {
            super(list);
    }
     
        //~ Methods ////////////////////////////////////////////
        public CompoundRoot cutStack(int index) {
            return new CompoundRoot(subList(index, size()));
    }
     
        public Object peek() {
            return get(0);
        }
        public Object pop() {
            return remove(0);
        }
        public void push(Object o) {
            add(0, o);
        }
    }

    我們通過表達式向堆棧對象操作時,我們并不知道堆棧中有哪些對象。OgnlValueStack會根據堆棧由上向下的順序(先入棧在下面,最后入棧 在最上面)依次去查找與表達式匹配的對象方法,找到即進行相應的存取操作。假設后面對象也有相同的方法,將不會被調用。
    下面我們看一個對 OgnlValueStack操作的程序,它主要演示了如何對Map對象的存取和OgnlValueStack堆棧的原理
     
    package example.register;
     
    import com.opensymphony.xwork.util.OgnlValueStack;
     
    public class DemoGroupValueStack {
       
        public void demoAction(){
            DemoGroupAction action = new DemoGroupAction();
            OgnlValueStack valueStack= new OgnlValueStack();
            valueStack.push(action);
           
            User zhao = new User();
            zhao.setUsername("zhao");
            zhao.setEmail("zhao@yahoo.com.cn");
           
            User qian = new User();
            qian.setUsername("qian");
            qian.setEmail("qian@yahoo.com.cn");
           
            valueStack.setValue("users['zhao']",zhao);
            valueStack.setValue("users['qian']",qian);
           
           
            System.out.println("users['zhao'] = "+valueStack.findValue("users['zhao']"));
            System.out.println("users['qian'] = "+valueStack.findValue("users['qian']"));
            System.out.println("users size = "+valueStack.findValue("users.size"));
           
            System.out.println("allUserName[0] = "+valueStack.findValue("allUserName[0]"));
        }
       
        public void demoModels(){
           
            User model_a = new User();
            model_a.setUsername("model_a");
            User model_b = new User();
            model_b.setUsername("model_b");
            User model_c = new User();
            model_c.setUsername("model_c");
           
            OgnlValueStack valueStack= new OgnlValueStack();
            valueStack.push(model_a);
            valueStack.push(model_b);
            valueStack.push(model_c);
           
            System.out.println("username = "+valueStack.findValue("username"));
            System.out.println("[1].username = "+valueStack.findValue("[1].username"));
            System.out.println("[0].toString = "+valueStack.findValue("[0]"));
            System.out.println("[1].toString = "+valueStack.findValue("[1]"));
            System.out.println("[2].toString = "+valueStack.findValue("[2]"));
           
        }
        public static void main(String[] args) {
            DemoGroupValueStack demoValueStack = new DemoGroupValueStack();
            demoValueStack.demoAction();
            demoValueStack.demoModels();
        }
    }
     
     
    package example.register;
     
    import java.util.ArrayList;
    import java.util.HashMap;
    import java.util.List;
    import java.util.Map;
     
    public class DemoGroupAction {
       
        private Map users = new HashMap();
       
        public Map getUsers(){
            return this.users;
        }
       
        public List getAllUserName(){
            return new ArrayList(users.keySet());
        }
        public String execute(){
            //執行業務操作
            return null;
        }
        public String toString(){
            return users.toString();
        }
    }
    注意:1、 Map屬性的存取,它的表達式語言如:users['zhao'],注意它用’’來引用HashMap的key字符串。
    2、 demoModels()方法演示了OgnlValueStack中堆棧的原理,請特別注意它的 [0].toString、[1].toString、[2].toString,它們依次調用堆棧中對象的toString()方法,并逐一的減少堆棧 最上面的對象。
    控制臺輸出的結果如下:
    users['zhao'] = username=zhao;password=null;email=zhao@yahoo.com.cn;age=0
    users['qian'] = username=qian;password=null;email=qian@yahoo.com.cn;age=0
    users size = 2
    allUserName[0] = qian
     
    username = model_c
    [1].username = model_b
    [0].toString = [username=model_c;password=null;email=null;age=0, username=model_b;password=null;email=null;age=0, username=model_a;password=null;email=null;age=0]
    [1].toString = [username=model_b;password=null;email=null;age=0, username=model_a;password=null;email=null;age=0]
    [2].toString = [username=model_a;password=null;email=null;age=0]

    posted on 2010-03-31 10:52 小菜毛毛 閱讀(483) 評論(0)  編輯  收藏 所屬分類: struts2

    只有注冊用戶登錄后才能發表評論。


    網站導航:
     
    主站蜘蛛池模板: 亚洲老妈激情一区二区三区| 最新国产精品亚洲| 国产妇乱子伦视频免费| 激情内射亚洲一区二区三区爱妻| 成年女人午夜毛片免费看| 免费一级毛片在线播放放视频| 亚洲AV永久青草无码精品| 好大好深好猛好爽视频免费| 国产福利在线观看永久免费| 亚洲欧洲日产专区| 亚洲国产精品一区二区九九| 91视频免费网址| 免费激情网站国产高清第一页| 久久久久亚洲av无码专区喷水| 国产免费人人看大香伊| 少妇人妻偷人精品免费视频 | 亚洲AV无码精品蜜桃| 免费人成激情视频| 免费A级毛片无码视频| MM1313亚洲国产精品| 久久久久亚洲av无码专区喷水 | 成人国产mv免费视频| 久久久久久AV无码免费网站| 婷婷亚洲综合一区二区| 久久精品国产亚洲AV嫖农村妇女| 免费夜色污私人影院在线观看| 0588影视手机免费看片| 精品免费久久久久国产一区 | 日韩亚洲综合精品国产| 久久夜色精品国产噜噜亚洲AV| 亚洲 无码 在线 专区| 成年男女免费视频网站| 无码av免费一区二区三区| 黄色a三级免费看| 亚洲色www永久网站| 国产亚洲综合成人91精品| 免费永久看黄在线观看app| 黄瓜视频影院在线观看免费| 国偷自产一区二区免费视频| 一级午夜免费视频| 三年片在线观看免费大全|