struts2框架之OGNL(參考第三天學習筆記)
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(參考第三天學習筆記)