1. 程式人生 > >struts2框架之OGNL(參考第三天學習筆記)

struts2框架之OGNL(參考第三天學習筆記)

元素 eterm 進行 oot 結構 保存 pass 一個表 this

ognl

1. 什麽是ognl
對象圖導航語言
Struts內置的表達式語言,它比EL要強大很多。

------------------

2. 單獨學習ognl
* EL它操作的數據來自於:四大域:pagecontext、request、session、application
* ognl操作的數據來自於:ognl上下文對象,以及root對象

OgnlContext它是一個Map,你不用對它有過多了解!

OGNL表達式以“#”開頭!
OGNL表達式幾乎與EL相同!

---------------------


OGNL的JavaBean操作

#emp.address.city,表示操作上下文中鍵為emp的javaBean,獲取javabean的address屬性的city屬性。

---------------------

ognl的根對象
以"#"開頭操作的是上下文中的對象:例如:#aaa.bbb,操作的是上下文中aaa這個對象
不以"#"開頭操作的是根對象,例如:aaa.bbb,操作的是根對象的aaa屬性的bbb屬性。

==========================

ognl常量
1. 字符串常量:使用單引或雙引括起來的字符序列,但如果是一個字符,那麽必須使用雙引。‘abc‘、‘‘、"a"、‘bb‘
2. 字符常理:使用單引號括起來的單個字符
3. 布爾常量:與java相同,即只有true和false
4. null常量:與java相同
5. 數值常量:1.0、100

----------------------

ognl運算符

1. ognl運算符與java中的運算符相似,大多數相同。 +、-、.....
2. java中不存在的運算符:
* 逗號運算符:多個表達式使用逗號分隔,形成大的表達式,就是逗號表達式。
* 例如:1+2,2+3,4/2。從左到右依次運算所有表達式,整個表達式的值為最後一個表達式的值。
* 大括號表達式:用來創建ArrayList對象的!{1,2,3,4}
3. in和not in:判斷當前值是否在集合中存在。
* in和not都在OGNL中為關鍵字!!!

4. 創建對象
* new java.utild.Date(),創建對象語法

-----------------------

ognl調用方法

1. 對象.方法(參數),例如:"‘hello‘.substring(1)",結果為ello

-----------------------

ognl操作靜態的東西

1. 靜態方法:"@java.lang.Math@min(10, 20)"

-----------------------

投影和選擇

1. 向上下文中存放一個List
cxt.put("empList" empList);
2. 獲取List中所有Emp對象的name屬性值。(投影)
可以理解為:select name from emp;,即單列查詢
#empList.{name} --> 它就是投影語法!

選擇
 #empList.{條件},可以理解為:select * from emp where 條件。

三種語法:

1. #empList.{? 條件}:它表示獲取所有滿足條件的對象
2. #empList.{$ 條件}:它表示獲取最後一個滿足條件的對象
3. #empList.{^ 條件}:它表示獲取第一個滿足條件的對象

技術分享圖片

Struts中的OGNL

1. Struts中的上下文對象和根對象
ActionContext ac = ActionContext.getContext();
Map cxt = ac.getContextMap();//獲取上下文對象!
甚至你都可以認為ActionContext就是Ognl上下文對象!

通常我們不會獲取它,而是通過ActionContext對象來間接操作上下文對象。

根對象
ActionContext ac = ActionContext.getContext();
ValueStack vs = ac.getValueStack();//獲取值棧,它就是根對象!

它有push()用來壓棧,還有pop()用來出棧

2. ActionContext中的5個Map
parameters:request.getParameterMap(),內容都是參數
request:所有request.getAttribute(),對應的是request域,例如:#request.user.usernmae,相當於request.getAttribute("user").getUsername()
session:session域
application:application域
attr:四大域, #attr.name,依次在四大域中查找,與EL的${name}

3. ValueStack
它是根對象,它也是一個集合。
ValueStack中一般都存放著當前Action對象!

========================================

在Struts中使用Ognl最多的地方是jsp頁面,即在struts標簽中!

1. <s:property value="ognl表達式"/>,它的作用是輸出!

-------------

(默認在Struts中靜態操作是被禁用的!這需要使用一個常量來打開!)

========================================

[N]語法

<s:property value="[1].name"/>

其中[1]表示一個子棧,從ValueStack的下標為1的元素開始,到棧底!
其中[1].name,在子棧中查找name,那麽第一個元素變成了下標1的元素,而不在是下標0。

========================================

top語法

<s:proeprty value="top"/> top表示棧頂對象

以下沒有區別,都是打印棧頂元素!
proeprty標簽的value屬性默認值為top
<s:proeprty/>
<s:proeprty value="top"/>
<s:proeprty value="[0].top"/>

========================================

開戶靜態訪問功能

Struts中默認是不能訪問靜態方法和靜態屬性的,這需要通過配置一個常量來開戶。
<constant name="struts.ognl.allowStaticMethodAccess" value="true" />

========================================

EL訪問ValueStack
pageContext, request(valuestack), session, application

1. 訪問request域,其實就是調用request.getAttribute()方法來獲取!
2. Struts對request進行了裝飾!Struts對request的增強就是getAttribute()
3. getAttribute()訪問會先去找request域,如果找不到去ValueStack

在EL訪問request域時,調用的是getAttribute()方法,而這個方法先去request域找,沒找到就去ValueStack去找,如果找到了,
那麽request.getAttribute()就返回有值了

========================================

#、%、$

# --> 當訪問上下文中的數據時,以#開頭!
$ --> 在配置文件中使用ognl表達式,需要使用${...}
% --> 有些struts標簽不支付ognl,那麽若想讓它支付需要使用%{...}
例如:<s:property value="name"/> property標簽的value屬性支持ognl表達式,但你也可以使用%{...},用了也白用!
<s:property value="%{name}"/>,同上!

例如:<s:hidden value="name"/> hidden標簽的value屬性不支持ognl表達式,那麽如果想使用ognl必須使用%{...}
<s:hidden value="%{name}"/>

<s:xxx value="%{name}"/> --> 肯定是ognl
<s:yyy value="%{‘name‘}"/> --> 肯定是字符串name

========================================

Action向頁面傳遞數據

1. String數據
this.addFieldError()
this.addActionError()
this.addActionMessage()

<s:fielderror/>
<s:actionerror/>
<s:actioinmessage/>

2. 復雜數據
ActionContext.getContext().getValueStack().push(userList);
頁面使用循環標簽來遍歷

ActionContext.getContext().getValueStack().push(user);
頁面可以使用<s:property/> 來取!

<s:property value="username"/>
<s:property value="password"/>

--------------------------------

class MyAction {
private User user;

public String execute() {
this.user = service.findByUid("u_001");//把從數據庫中查詢到的對象保存到Action的屬性中
}
}

頁面:
<s:prooperty value="user.username"/>
<s:prooperty value="user.password"/>

--------------------------------

<s:debug/>它會在頁面中生成一個超鏈接,你點擊它就可以看到上下文和值棧的內部結構!


struts2框架之OGNL(參考第三天學習筆記)