OGNL是Object-Graph Navigation Language的縮寫,它是一個單獨的開源項目。 Struts2框架使用OGNL做爲默認的表達式語言。它是一種功能強大的表達式語言,java
經過它簡單一致的表達式語法,能夠存取對象的任意屬性,調用對象的方法,遍歷整個對象的結構圖,實現字段類型轉化等功能。它使用相同的表達式去存取對象的屬性。express
基礎:<s:property value="">相似於jsp中的表達式(jsp表達式是<%= %>,el中的表達式是${}),把value的值直接輸出到頁面上數組
value的屬性值就是OGNL的表達式,注意它不是一個字符串。若是想把value中的值看成普通的字符串,請加引號。安全
注意:el表達式只能調用靜態的方法,而ognl能夠訪問普通方法就像上面的length方法框架
1.OGNL訪問靜態屬性jsp
方式:@全類名@靜態屬性名稱測試
2.OGNL訪問靜態方法spa
方式:@全類名@靜態方法名線程
注意:在struts2中,OGNL默認禁用靜態方法,在default.properties中struts.ognl.allowStaticMethodAccess=false之控制,debug
因此咱們要在struts.xml中配置
一、存取對象的任意屬性,簡單說就是對javabean進行操做(重要)
二、調用對象方法。
三、調用類的靜態方法
四、索引數組元素
五、操做集合(重 要)
操做以前必須知道如何使用OGNL表達式,而且瞭解OGNL表達式的取值範圍只能在其context和root中,格式爲
Ognl.getValue(expression,context,root);
//expression:爲咱們編寫的ognl表達式,從後兩個參數中獲取值,獲取規則會從下面的例子中詳細講解
//context:ognl的上下文,類型爲map,
//root:ognl的根,能夠爲javabean、list、map、.... 等等不少值
User.java
Address.java
獲取javabean中的屬性值
獲取javabean中的對象的屬性值
對javabean中的屬性進行賦值操做
操做list集合,list結合本質就是一個數組,因此從list中讀取數據跟對數組的操做是同樣的。
操做map集合
建立list集合
建立map集合
明確:動做類是多例的,每次動做訪問,動做類都會實例化。因此是線程安全的。與Struts1的區別是,struts1的動做類是單例的。
每次請求時,都會產生一些請求數據,這些數據存放到哪裏去了?
明確:
在每次動做執行前,核心控制器StrutsPrepareAndExecuteFilter都會建立一個ActionContext和ValueStack對象。且每次動做訪問都會建立。
這兩個對象存儲了整個動做訪問期間用到的數據。而且把數據綁定到了線程局部變量(ThreadLocal)上了。因此是線程安全的。
Struts2的官方文檔對contextMap的說明:
注意:除了value stack以外,全是map,而contextMap也是一個map。其實就是Map中又封裝的Map。(很像dbutils中KeyedHandler封裝數據的結構,只是封裝數據的結構)
在jsp中引入struts2的核心標籤庫,而後使用<S:debug />
測試存入數據
須要熟悉ActionContext和valueStackAPI.框架會爲咱們存數據
在demo1.jsp點擊dubug時
結果:
ValueStacj中的getRoot()方法
CompoundRoot類是什麼:
在動做類中寫一個棧操做
用Struts2的標籤(OGNL表達式)在JSP上(用的最多)
使用OGNL表達式來去,struts2的OGNL表達式必須寫在struts2標籤中。
使用s:property取數據
在demo1.jsp中
問了一下同窗,原來是本身的結果視圖中,把type類型設置成了redirect,致使數據丟失了。下次必定要注意。
結果:
若是遇有對象屬性重名,能夠經過OGNL表達式,選擇查找的起始位置
取根中的對象屬性不使用#
取contextMap中的key的值,要使用#
1.setValue()方法
jsp中
結果:
在debug中
2.set方法