小菜毛毛技術分享

          與大家共同成長

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

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


          網站導航:
           
          主站蜘蛛池模板: 雷山县| 兰州市| 兰考县| 沙坪坝区| 犍为县| 龙陵县| 财经| 英德市| 攀枝花市| 永靖县| 祁连县| 石嘴山市| 海城市| 山阴县| 彩票| 江孜县| 中山市| 三明市| 专栏| 宜章县| 长春市| 民乐县| 沂南县| 吴川市| 汤原县| 黄平县| 和顺县| 凤凰县| 宁武县| 马关县| 曲阳县| 长垣县| 西昌市| 衡水市| 闵行区| 寿宁县| 铜鼓县| 仙游县| 山东省| 明光市| 金寨县|