OGNL概述
- 之前在web階段,學習過EL表達式,EL表達式在jsp中獲取域對象裏面的值
- OGNL是一種表達式,這個表達式功能更加強大
OGNL(Object-Graph-Navigation-Language),即對象圖導航語言,它是一種功能強大的開源表達式語言,使用這種表達式語言,可以通過某種表達式語法,存取Java對象的任意屬性,調用Java對象的方法,同時能夠自動實現必要的類型轉換。如果把表達式看作是一個帶有語義的字符串,那麼OGNL無疑成爲了這個語義字符串與Java對象之間溝通的橋樑。
注意:
- 一般把OGNL與Struts2標籤一起使用來操作值棧
- OGNL不是Struts2的一部分,因此使用OGNL的時候需要先導入jar包,在Struts2中提供了jar包
特點:
案例:(使用ognl+struts2標籤實現計算字符串長度的功能)
(1)使用JSTL的時候,導入jar包之外,還需要在jsp頁面中引入標籤庫,而使用struts2標籤的時候,也需要引入標籤庫
(2)使用struts2標籤實現操作
值棧
概述:
- 之前在web階段,在servlet裏面進行操作,把數據放到域對象裏面,在頁面中使用EL表達式獲取到,域對象在一定範圍內,存值和取值
- 在struts2裏面提供了一種存儲機制,類似於域對象,是值棧,也可以存值和取值(在action裏面,把數據放到值棧裏面,在頁面中獲取到值棧數據)
值棧存儲位置:
- 每次訪問action的時候,都會創建action對象
- 在每個action對象裏面都會有一個值棧對象(只有一個)
servlet和action區別:
- servlet:默認在第一次訪問時候創建,創建一次,單實例對象
- action:訪問時候創建,每次訪問action的時候,都會創建action對象,創建多次,多實例對象
獲取值棧對象
常用方式:使用ActionContext類裏面的方法得到值棧對象
//獲取ActionContext類的對象
ActionContext context = ActionContext。getContext();
//調用方法得到值棧對象
ValueStack stack1 = context.getValueStack();
值棧內部結構
值棧分爲兩部分,第一部分是root(list集合),第二部分是context(map集合)
第一部分:(list集合)
第二部分:(map集合)
struts2裏面標籤 s:debug,使用這個標籤可以查看值棧結構和存儲值
(1)訪問action,執行action的方法有返回值,配置返回值到jsp頁面中,在jsp頁面中使用這個標籤
點擊超鏈接看到結構
(2)在action沒有做任何操作,棧頂元素是 action引用
- action對象裏面有值棧對象
- 值棧對象裏面有action引用
向值棧放數據
第一種 獲取值棧對象,調用值棧對象裏面的 set 方法
第二種 獲取值棧對象,調用值棧對象裏面的 push方法
第三種 在action定義變量,生成變量的get方法
向值棧放對象
1 實現步驟
第一步 定義對象變量
第二步 生成變量的get方法
第三步 在執行的方法裏面向對象中設置值
向值棧放list集合
第一步 定義list集合變量
第二步 生成變量的get方法
第三步 在執行的方法裏面向list集合設置值
從值棧獲取數據
1 使用struts2的標籤+ognl表達式獲取值棧數據
<s:property value=”ognl表達式”/>
獲取字符串
1 向值棧放字符串
2 在jsp使用struts2標籤+ognl表達式獲取
獲取對象
1 向值棧放對象
2 在頁面中獲取值
獲取List集合
第一種方式:
第二種方式:
第三種方式:
其他操作
1 使用set方法向值棧放數據,獲取
2 使用push方法向值棧放數據,獲取
(1)使用push方法設置值,沒有名稱,只有設置的值
(2)向值棧放數據,把向值棧放數據存到數組裏面,數組名稱 top,根據數組獲取值