Struts2(五)之OGNL、contextMap

1、OGNL

  1.一、定義

    OGNL是Object-Graph Navigation Language的縮寫,它是一個單獨的開源項目。 Struts2框架使用OGNL做爲默認的表達式語言。它是一種功能強大的表達式語言,java

    經過它簡單一致的表達式語法,能夠存取對象的任意屬性,調用對象的方法,遍歷整個對象的結構圖,實現字段類型轉化等功能。它使用相同的表達式去存取對象的屬性。express

  1.二、OGNL的功能

    1.2.一、支持普通方法的調用

      基礎:<s:property value="">相似於jsp中的表達式(jsp表達式是<%= %>,el中的表達式是${}),把value的值直接輸出到頁面上數組

      value的屬性值就是OGNL的表達式,注意它不是一個字符串。若是想把value中的值看成普通的字符串,請加引號。安全

      

      注意:el表達式只能調用靜態的方法,而ognl能夠訪問普通方法就像上面的length方法框架

    1.2.二、訪問靜態成員(靜態屬性、靜態方法)

        1.OGNL訪問靜態屬性jsp

          方式:@全類名@靜態屬性名稱測試

          

              

        2.OGNL訪問靜態方法spa

          方式:@全類名@靜態方法名線程

          

          注意:在struts2中,OGNL默認禁用靜態方法,在default.properties中struts.ognl.allowStaticMethodAccess=false之控制,debug

            因此咱們要在struts.xml中配置

          

          

     1.2.三、OGNL操做map和list集合

        

 

          

     1.三、OGNL的功能實現   

      一、存取對象的任意屬性,簡單說就是對javabean進行操做(重要)

      二、調用對象方法。

      三、調用類的靜態方法

      四、索引數組元素

      五、操做集合(重 要)

    

    操做以前必須知道如何使用OGNL表達式,而且瞭解OGNL表達式的取值範圍只能在其context和root中,格式爲

         Ognl.getValue(expression,context,root);

         //expression:爲咱們編寫的ognl表達式,從後兩個參數中獲取值,獲取規則會從下面的例子中詳細講解

         //context:ognl的上下文,類型爲map,

         //root:ognl的根,能夠爲javabean、list、map、.... 等等不少值

    

    一、對javabean進行操做

        User.java

            

        Address.java

            

 

        獲取javabean中的屬性值

            

        獲取javabean中的對象的屬性值

                

        對javabean中的屬性進行賦值操做

            

         

 

        二、調用對象方法

             

        三、調用類的靜態方法或屬性

            

        

         四、索引數組元素

            

         五、操做集合

            操做list集合,list結合本質就是一個數組,因此從list中讀取數據跟對數組的操做是同樣的。

                  

            操做map集合

                  

            建立list集合

                  

            建立map集合

                  

2、ccontextMap(重點)

  2.一、動做類的生命週期

    明確:動做類是多例的,每次動做訪問,動做類都會實例化。因此是線程安全的。與Struts1的區別是,struts1的動做類是單例的。

  2.二、請求動做的數據存放    

  每次請求時,都會產生一些請求數據,這些數據存放到哪裏去了?
  明確:
  在每次動做執行前,核心控制器StrutsPrepareAndExecuteFilter都會建立一個ActionContext和ValueStack對象。且每次動做訪問都會建立。
  這兩個對象存儲了整個動做訪問期間用到的數據。而且把數據綁定到了線程局部變量(ThreadLocal)上了。因此是線程安全的。

  

 

 

  2.三、contextMap存儲數據

  Struts2的官方文檔對contextMap的說明:

    

  

  注意:除了value stack以外,全是map,而contextMap也是一個map。其實就是Map中又封裝的Map。(很像dbutils中KeyedHandler封裝數據的結構,只是封裝數據的結構)

  

  2.四、查看contextMap中的數據

  在jsp中引入struts2的核心標籤庫,而後使用<S:debug />    

   

  

    測試存入數據

    

 

    

3、contextMap中的數據操做

    

 

  3.一、存數據

    須要熟悉ActionContext和valueStackAPI.框架會爲咱們存數據

    3.1.一、使用ActionContext存數據

    

    在demo1.jsp點擊dubug時

    

 

    3.1.二、使用ValueStack存數據

      

      結果:

        

    ValueStacj中的getRoot()方法

    

    CompoundRoot類是什麼:

      

  在動做類中寫一個棧操做

    

 

 

 

 

  3.二、取數據

    用Struts2的標籤(OGNL表達式)在JSP上(用的最多)
    使用OGNL表達式來去,struts2的OGNL表達式必須寫在struts2標籤中。

    3.2.一、取得contextMap中的數據,須要是要#

    使用s:property取數據

    

    在demo1.jsp中

    

 問了一下同窗,原來是本身的結果視圖中,把type類型設置成了redirect,致使數據丟失了。下次必定要注意。

  3.2.二、取ContextMap裏面ValueStack中對象的屬性:直接寫屬性名

    

    結果:

    

    若是遇有對象屬性重名,能夠經過OGNL表達式,選擇查找的起始位置

  

  

 

   

  3.三、OGNL的使用總結

  取根中的對象屬性不使用#

  取contextMap中的key的值,要使用#

  3.四、ValueStack的其餘方法

    1.setValue()方法

  

  jsp中

     結果:

  在debug中

 

                    

Stack Context

  2.set方法

    

 

 

  

 

    

  

 

 

    

         

      

 

      

  

相關文章
相關標籤/搜索