Struts2_day03
1.ognl概述
之前web階段天吓,學習過EL表達式,EL表達式在jsp中獲取域?qū)ο罄锩娴闹?/p>
-
OGNL是一種表達式峦椰,這個表達式功能更加強大龄寞,
(1)在struts2里面操作值棧數(shù)據(jù)
(2)一般把ognl在struts2操作:和struts2標簽一起使用操作值棧
-
OGNL不是struts2的一部分,單獨的項目汤功,經(jīng)常和struts2一起使用
(1)使用ognl時候首先導入jar包物邑,struts2提供jar包
2.ognl入門案例
-
使用ognl+struts2標簽實現(xiàn)計算字符串長度
- 支持對象方法調(diào)用。例如:objName.methodName()
- 在java中調(diào)用字符串.length();
-
使用struts2標簽
(1)使用jstl時候滔金,導入jar包之外色解,在jsp頁面中引入標簽庫
使用struts2標簽時候,也要在jsp中引入標簽庫
<%@ taglib uri="/struts-tags" prefix="s" %>
(2)使用struts2標簽實現(xiàn)操作
<!-- 使用ognl+struts2標簽實現(xiàn)計算字符串長度value屬性值:ognl表達式--> <s:property value="'hahaha'.length()" /> <input type="submit" value="submit" />
3.什么是值棧
之前在web階段餐茵,在servlet里面進行操作科阎,把數(shù)據(jù)放到域?qū)ο罄锩妫陧撁嬷惺褂胑l表達式獲取到忿族,域?qū)ο笤谝欢ǚ秶鷥?nèi)锣笨,存值和取值
-
在struts2里面提供本身一種存儲機制,類似于域?qū)ο蟮琅侵禇4碛ⅲ梢源嬷岛腿≈?/p>
(1)在action里面把數(shù)據(jù)放到值棧里面,在頁面中獲取到值棧數(shù)據(jù)
3.1servlet和action區(qū)別
(1)Servlet:默認在第一次訪問時候創(chuàng)建屹徘,創(chuàng)建一次走趋,單實例對象
(2)Action:訪問時候創(chuàng)建,每次訪問action時候,都會創(chuàng)建action對象簿煌,創(chuàng)建多次氮唯,多實例對象
3.2值棧存儲位置
(1)每次訪問action時候,都會創(chuàng)建action對象
(2)在每個action對象里面都會有一個值棧對象(只有一個)
- 值棧對象里面有action引用
4.怎么獲取值棧對象
- 使用ActionContext類里面的方法獲取值棧對象
5.值棧內(nèi)部結構
5.1root:list集合
(1)一般操作都是root里面數(shù)據(jù)
5.2context:map集合
5.3debug標簽
struts2里面標簽s:debug姨伟,使用這個標簽可以查看值棧結構和存儲值
點擊超鏈接看到結構
(1)訪問action惩琉,執(zhí)行action的方法有返回值,配置返回值到jsp頁面中夺荒,在jsp頁面中使用這個標簽
(2)在action沒有做任何操作瞒渠,棧頂元素是 action引用
6.向值棧放數(shù)據(jù)
6.1向值棧放字符串
第一種 獲取值棧對象,調(diào)用值棧對象里面的 set 方法
// 1.獲取值棧對象技扼,調(diào)用值棧對象里面的 set 方法
ActionContext context = ActionContext.getContext();
ValueStack stack = context.getValueStack();
stack.set("a", "b");
第二種 獲取值棧對象伍玖,調(diào)用值棧對象里面的 push方法
// 1.獲取值棧對象,調(diào)用值棧對象里面的 push 方法
ActionContext context = ActionContext.getContext();
ValueStack stack = context.getValueStack();
stack.push("hello");
return "success";
第三種 在action定義變量剿吻,生成變量的get方法
package com.ghw.action;
import com.opensymphony.xwork2.ActionContext;
import com.opensymphony.xwork2.ActionSupport;
import com.opensymphony.xwork2.util.ValueStack;
public class FormAction extends ActionSupport {
// 1.定義變量
private String name;
// 2.生成變量的get方法
public String getName() {
return name;
}
public String execute() throws Exception {
// 獲取值棧對象
ActionContext context = ActionContext.getContext();
ValueStack stack = context.getValueStack();
// 3.給變量賦值
name = "hello";
return "success";
}
}
6.2向值棧放對象
以下均為6.1的第三種方法
實現(xiàn)步驟:
第一步 定義對象變量
// 第一步 定義對象變量
private User user = new User();
第二步 生成變量的get方法
// 第二步 生成變量的get方法
public User getUser() {
return user;
}
第三步 在執(zhí)行的方法里面向?qū)ο笾性O置值
// 第三步 在執(zhí)行的方法里面向?qū)ο笾性O置值
user.setUsername("hello");
user.setPassword("password");
6.3向值棧放list集合
以下均為6.1的第三種方法
實現(xiàn)步驟:
第一步 定義list集合變量
// 第一步 定義List變量
private List<User> list = new ArrayList<User>();
第二步 生成變量的get方法
// 第二步 生成變量List的get方法
public List<User> getList() {
return list;
}
第三步 在執(zhí)行的方法里面向list集合設置值
// 第三步 在執(zhí)行的方法里面向List設置值
User user1 = new User();
user1.setUsername("hello");
user1.setPassword("world");
User user2 = new User();
user2.setUsername("aa");
user2.setPassword("bb");
list.add(user1);
list.add(user2);
return "success";
7.從值棧獲取數(shù)據(jù)
1 使用struts2的標簽+ognl表達式獲取值棧數(shù)據(jù)
<s:property value="ognl表達式"/>
7.1從值棧獲取字符串
-
向值棧放字符串,采用6.1第三種方法
public class ValueStackAction extends ActionSupport { private String username; public String getUsername() { return username; } public String execute() throws Exception { username = "hello"; return "success"; } }
-
在jsp使用struts2標簽+ognl表達式獲取
<s:property value="username" />
7.2從值棧獲取對象
-
向值棧放對象
public class ValueStackAction extends ActionSupport { private User user = new User(); public User getUser() { return user; } public String execute() throws Exception { user.setUsername("hello"); user.setPassword("world"); return "success"; } }
-
在頁面中獲取值
<s:property value="user.username" /> <s:property value="user.password" />
7.3從值棧獲取list集合
- 向值棧放對象
public class ValueStackAction extends ActionSupport {
private List<User> list = new ArrayList<User>();
public List<User> getList() {
return list;
}
public String execute() throws Exception {
User user = new User();
user.setUsername("hello");
user.setPassword("world");
User user2 = new User();
user2.setUsername("aa");
user2.setPassword("bb");
list.add(user);
list.add(user2);
return "success";
}
}
-
在頁面中獲取值
獲取list集合的三種方法:
方法一:
<!-- 第一種方式實現(xiàn) --> <s:property value="list[0].username" /> <s:property value="list[0].password" /> <s:property value="list[1].username" /> <s:property value="list[2].password" />
方法二:
<!-- 遍歷list得到list里面的每個user對象 --> <s:iterator value="list"> <s:property value="username" /> <s:property value="password" /> </s:iterator>
方法三:
<!-- 遍歷值棧list集合窍箍,得到每個user對象 機制:把每次遍歷出來的user對象放到context里面 獲取context里面的數(shù)據(jù)特點:寫ognl表達式, 使用特殊符號# --> <s:iterator value="list" var="user"> <s:property value="#user.username" /> <s:property value="#user.password" /> </s:iterator>
7.4補充set和push方法
-
set方法獲取值丽旅,直接用椰棘,name的值為set方法中第一個值
<s:iterator value="name">
-
使用push方法向值棧放數(shù)據(jù),獲取
(1)使用push方法設置值榄笙,沒有名稱邪狞,只有設置的值
(2)向值棧放數(shù)據(jù),把向值棧放數(shù)據(jù)存到數(shù)組里面茅撞,數(shù)組名稱 top帆卓,根據(jù)數(shù)組獲取值
<s:iterator value="[0].top">
8.EL表達式獲取值棧數(shù)據(jù)
EL表達式為什么能取到值棧中的數(shù)據(jù)?
一般不推薦使用EL表達式獲取值棧數(shù)據(jù)米丘,效率低
EL表達式獲取域?qū)ο笾?/p>
向域?qū)ο罄锩娣胖凳褂胹etAttribute方法鳞疲,獲取值使用getAttribute方法
底層增強(縱向增強,橫向是aop思想)request對象里面的方法getAttribute方法
(1)首先從request域獲取值蠕蚜,如果獲取到,直接返回
(2)如果從request域獲取不到值悔橄,到值棧中把值獲取出來靶累,把值放到域?qū)ο罄锩?/p>
-
查看源代碼
9.ognl表達式#、%使用
9.1#使用
-
使用#獲取context里面數(shù)據(jù)癣疟,主要是域?qū)ο髷?shù)據(jù)
<!-- 遍歷值棧list集合挣柬,得到每個user對象 機制:把每次遍歷出來的user對象放到context里面 獲取context里面的數(shù)據(jù)特點:寫ognl表達式, 使用特殊符號# --> <s:iterator value="list" var="user"> <s:property value="#user.username" /> <s:property value="#user.password" /> </s:iterator>
-
演示# 操作
(1)向request域放值
HttpServletRequest request = ServletActionContext.getRequest(); request.setAttribute("req", "reqvalue");
(2)在頁面中使用ognl獲取
<s:property value="#request.req"/>`
9.2%使用
-
在struts2標簽中表單標簽
(1)在struts2標簽里面使用ognl表達式睛挚,如果直接在struts2表單標簽里面使用ognl表達式不識別邪蛔,只有%之后才會識別。
<s:textfield name="username" value="%{#request.req}"></s:textfield>