<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 小菜毛毛 閱讀(480) 評論(0)  編輯  收藏 所屬分類: struts2

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


    網站導航:
     
    主站蜘蛛池模板: 免费观看黄色的网站| 最刺激黄a大片免费网站| 国产男女猛烈无遮挡免费网站| 亚洲无线电影官网| 久久久久久影院久久久久免费精品国产小说 | 99精品视频在线观看免费播放| 国产AV无码专区亚洲Av| 久久精品免费观看| 久久久无码精品亚洲日韩蜜桃| 成在人线av无码免费高潮喷水| 久久99国产亚洲精品观看| 99精品视频在线观看免费专区| 亚洲国产韩国一区二区| 欧美三级在线电影免费| 色噜噜噜噜亚洲第一| ZZIJZZIJ亚洲日本少妇JIZJIZ| 国产高清视频免费在线观看| 久久亚洲国产视频| 99久久综合国产精品免费| 国产精品亚洲一区二区三区在线观看| mm1313亚洲精品国产| 99视频在线免费观看| 亚洲韩国在线一卡二卡| 手机在线毛片免费播放| 免费无码婬片aaa直播表情| 亚洲高清国产AV拍精品青青草原| 99视频在线免费| 色偷偷尼玛图亚洲综合| 亚洲精品乱码久久久久久按摩| 亚州免费一级毛片| 亚洲av日韩综合一区二区三区| 国产亚洲一区区二区在线| 亚洲高清免费在线观看| 另类小说亚洲色图| 亚洲AV午夜福利精品一区二区 | 182tv免费视视频线路一二三| 久久无码av亚洲精品色午夜| 日韩亚洲欧洲在线com91tv| 成熟女人牲交片免费观看视频| 人妻18毛片a级毛片免费看| 亚洲国产精品乱码在线观看97|