1.概述
1.1.是一種功能強(qiáng)大的表達(dá)式, 一般和struts2標(biāo)簽一起使用,用來操作值棧
1.2.不是struts2的一部分,但經(jīng)常一起使用
1.3.使用時(shí)需要導(dǎo)入jar包污桦,struts2有提供
1.4.值棧的概念:
<1> struts2本身提供的一種存儲(chǔ)機(jī)制,類似于域?qū)ο螅梢源嫒≈?br>
<2> 一般在action中把數(shù)據(jù)存放至值棧蚕愤,在前端頁面獲取
<3> 每次訪問action都會(huì)創(chuàng)建action對(duì)象,每個(gè)action對(duì)象中都有且僅有一個(gè)值棧對(duì)象
<4> 值棧對(duì)象有多種獲取方式饺蚊,常用ActionContext類中的方法獲取
<5> 內(nèi)部結(jié)構(gòu):
root部分:list集合結(jié)構(gòu)
context部分:map集合結(jié)構(gòu)
2.基本操作
2.1 前端頁面導(dǎo)入標(biāo)簽庫
<%@ taglib uri="/struts-tags" prefix="s" %>
*入門案例:顯示字符串長度:
<s:property value='"hahahahah".length()'/>
2.2 查看值棧結(jié)構(gòu)和存儲(chǔ)值
<s:debug/>
2.3 從值棧存取數(shù)據(jù)
(1). 存取字符串/對(duì)象
向值棧放入字符串/對(duì)象:
public class OGNL_one extends ActionSupport {
private User user=new User();
public User getUser() {
return user;
}
public String execute(){
user.setUaddr("add");
user.setUname("kin");
return "success";
}
}
前端用struts2+ognl表達(dá)式獲绕加铡:
<s:property value="user.uname"/>
<s:property value="user.uaddr"/>
(2).存取list集合
向值棧放入list:
public class OGNL_one extends ActionSupport {
private List<User> list=new ArrayList<User>();
public List<User> getList() {
return list;
}
public String listSet(){
User user1=new User();
user1.setUname("甲");
user1.setUaddr("城東");
user1.setUtime("noon");
list.add(user1);
User user2=new User();
user2.setUname("乙");
user2.setUaddr("城西");
user2.setUtime("dawn");
list.add(user2);
return "success";
}
}
前端獲取:
<!--
方法一:
枚舉
-->
<s:property value="list[0].uname"/>
<s:property value="list[0].utime"/>
<s:property value="list[0].uaddr"/>
<br/>
<s:property value="list[1].uname"/>
<s:property value="list[1].utime"/>
<s:property value="list[1].uaddr"/>
<!-- ... -->
<br/>
<!--
方法二:
遍歷list得到集合中每個(gè)user對(duì)象
-->
<s:iterator value="list">
<s:property value="uname"/>
<s:property value="utime"/>
<s:property value="uaddr"/>
<br/>
</s:iterator>
<!--
方法三:
遍歷list集合污呼,獲取每一個(gè)user對(duì)象
將遍歷得到的user放到值棧的context中裕坊,以var命名
用ognl表達(dá)式獲取context中數(shù)據(jù),使用特殊符號(hào)"#"
-->
<s:iterator value="list" var="u">
<s:property value="#u.uname"/>
<s:property value="#u.utime"/>
<s:property value="#u.uaddr"/>
<br/>
</s:iterator>
*struts2標(biāo)簽無法識(shí)別ognl表達(dá)式燕酷,直接在struts2表單標(biāo)簽中使用ognl表達(dá)式應(yīng)在前加%注明
例:在struts2標(biāo)簽中用ognl表達(dá)式獲取request域中的值
HttpServletRequest request=ServletActionContext.getRequest();
request.setAttribute("req","reqValue");
key的名稱對(duì)應(yīng)域的名稱request
<s:textfield name="username" value="%{#request.req}"/>
(3).set籍凝、push方法
直接使用值棧對(duì)象里面的方法步驟:
I.獲取值棧對(duì)象
II.調(diào)用set/push方法
//獲取值棧對(duì)象
ActionContext context=ActionContext.getContext();
ValueStack stack=context.getValueStack();
//調(diào)用set方法
stack.set("test","testvalue");
//調(diào)用push方法
stack.push("WOWOWOWOW~");
前端獲戎芟埂:
set方法以名稱-值的鍵值對(duì)方式存入值棧
前端根據(jù)名稱獲取值
<!--獲取set方法設(shè)置值-->
<s:property value="test"/>
push方法設(shè)置值,沒有名稱
值棧放數(shù)據(jù)都存儲(chǔ)在top數(shù)組里饵蒂,根據(jù)數(shù)組獲取值
<!--獲取push方法設(shè)置值-->
<s:property value="[0].top"/>
*top原理為棧声诸,元素先進(jìn)后出
例如先后push數(shù)據(jù)A、B退盯,前端獲取[0].top,[1].top,結(jié)果為B,A