上一篇文章我們已經(jīng)了解了如何在struts2的值棧中存數(shù)據(jù)柜思,那么這篇文章我們就一起來(lái)了解一下如何在jsp頁(yè)面中獲取值棧中的數(shù)據(jù)。
1 獲取使用set方法存入值棧中的值
在上一篇文章中我們已經(jīng)了解到膳沽,使用set方法向值棧中存值廊散,使用的是map方式,那么就有key和value为黎,取值時(shí)我們只需根據(jù)key來(lái)取就可以了帆谍。
代碼演示如下:
首先我們使用set方法向值棧中存入一個(gè)值,關(guān)鍵代碼:
//1 獲取值棧對(duì)象
ActionContext context = ActionContext.getContext();
ValueStack stack = context.getValueStack();
//2 調(diào)用值棧對(duì)象中的set方法
stack.set("demo", "DemoData");
return "success";
然后我們?cè)趈sp頁(yè)面中使用struts標(biāo)簽獲取值棧中的這條數(shù)據(jù)轴咱,關(guān)鍵代碼:
<!--導(dǎo)入struts標(biāo)簽庫(kù)-->
<%@ taglib uri="/struts-tags" prefix="s"%>
<!-- 獲取set方法設(shè)置的值 根據(jù)名稱(chēng)獲取值-->
<s:property value="demo"/>
2 獲取使用push方式存入值棧中的值
由上一篇文章可知汛蝙,push方式存值是沒(méi)有map結(jié)構(gòu)的,那么沒(méi)有key朴肺,我們?nèi)绾稳≈的亟呀#渴聦?shí)上struts2中將push方法存入值棧中的值都放在一個(gè)名為top的集合中,那么我們只需利用這個(gè)集合便可獲取到其中的值
代碼示例:
首先我們還是先用push方法將數(shù)據(jù)放入到值棧中去戈稿,關(guān)鍵代碼:
//1 獲取值棧對(duì)象
ActionContext context = ActionContext.getContext();
ValueStack stack = context.getValueStack();
//2 調(diào)用值棧對(duì)象中的push方法
stack.push("abcd");
return "success";
然后在jsp頁(yè)面中獲取值棧中的值西土,關(guān)鍵代碼:
<!--導(dǎo)入struts標(biāo)簽庫(kù)-->
<%@ taglib uri="/struts-tags" prefix="s"%>
<!-- 獲取push方法設(shè)置的值 -->
<s:property value="[0].top"/>
這里需要特別注意jsp頁(yè)面中使用ognl表達(dá)式獲取list集合中元素的寫(xiě)法,不是 top[0] 而是 [0].top 鞍盗,和我們?cè)趈ava代碼中取list集合元素的寫(xiě)法是有區(qū)別的需了。
3 獲取使用變量的get方法存入值棧中的值
這是往值棧中存值最常用的方法,這里我們將其分為取字符串般甲,取對(duì)象和取list集合三種方式分別演示肋乍。
1 獲取get方式存入值棧中的字符串
首先我們先使用變量方法存入一個(gè)字符串到值棧中,關(guān)鍵代碼:
private String username;
public String getUsername(){
return username;
}
public String execute() throws Exception {
username = "demo";
retrun "success";
}
然后我們?cè)趈sp頁(yè)面中獲取這個(gè)字符串的值敷存,關(guān)鍵代碼:
<!--導(dǎo)入struts標(biāo)簽庫(kù)-->
<%@ taglib uri="/struts-tags" prefix="s"%>
<!--使用s標(biāo)簽獲取username的值-->
<s:property value="username" />
2 獲取get方式存入值棧中的對(duì)象
首先將對(duì)象存入到值棧中去墓造,關(guān)鍵代碼:
private User user = new User();
public User getUser(){
return user;
}
public String execute() throws Exception {
user.setUsername("demo");
user.setPassword(123456);
user.setAddress("beijing");
return "success";
}
然后在jsp頁(yè)面中獲取這個(gè)對(duì)象,關(guān)鍵代碼:
<!--導(dǎo)入struts標(biāo)簽庫(kù)-->
<%@ taglib uri="/struts-tags" prefix="s"%>
<!--使用struts2標(biāo)簽獲取對(duì)象的數(shù)據(jù)-->
<s:property value="user.username"/>
<s:property value="user.password"/>
<s:property value="user.address"/>
3 獲取get方式存入值棧中的list集合
首先將list集合存入值棧锚烦,關(guān)鍵代碼:
private List<User> list = new ArrayList<User>();
public List<User> getList() {
return list;
}
public String execute() throws Exception {
User user1 = new User();
user1.setUsername("小奧");
user1.setPassword("123");
user1.setAddress("美國(guó)");
User user2 = new User();
user2.setUsername("小王");
user2.setPassword("250");
user2.setAddress("越南");
list.add(user1);
list.add(user2);
return "success";
}
然后在jsp頁(yè)面中獲取list中的數(shù)據(jù)觅闽,在jsp中獲取值棧中的list有三種方式,下面我們分別演示涮俄,關(guān)鍵代碼:
<!--導(dǎo)入struts標(biāo)簽庫(kù)-->
<%@ taglib uri="/struts-tags" prefix="s"%>
<! 獲取值棧list集合數(shù)據(jù) -->
獲取list的值第一種方式:
<br/>
<s:property value="list[0].username"/>
<s:property value="list[0].password"/>
<s:property value="list[0].address"/>
<br/>
<s:property value="list[1].username"/>
<s:property value="list[1].password"/>
<s:property value="list[1].address"/>
獲取list的值第二種方式:
<br/>
<!-- 使用struts2標(biāo)簽 類(lèi)似jstl的foreach標(biāo)簽
s:iterator:遍歷值棧的list集合
-->
<s:iterator value="list">
<!-- 遍歷list得到list里面每個(gè)user對(duì)象 -->
<s:property value="username"/>
<s:property value="password"/>
<s:property value="address"/>
<br/>
</s:iterator>
獲取list的值第三種方式:
<br/>
<s:iterator value="list" var="user">
<!--
遍歷值棧list集合蛉拙,得到每個(gè)user對(duì)象
機(jī)制: 把每次遍歷出來(lái)的user對(duì)象放到 context里面
獲取context里面數(shù)據(jù)特點(diǎn):寫(xiě)ognl表達(dá)式,需要
使用特殊符號(hào) #
-->
<s:property value="#user.username"/>
<s:property value="#user.password"/>
<s:property value="#user.address"/>
<br/>
</s:iterator>
這里第一和第二種方法都比較好理解禽拔,第三種方法需要注意的地方在:在s:iterator 標(biāo)簽時(shí)如果使用了var屬性刘离,那么struts2會(huì)在值棧的context部分新開(kāi)辟一個(gè)臨時(shí)空間,并將遍歷出來(lái)的list集合中的元素放到這個(gè)臨時(shí)空間中睹栖,那么這時(shí)候再使用ognl表達(dá)式獲取數(shù)據(jù)要使用#號(hào)硫惕,否則無(wú)法取出數(shù)據(jù)。
這樣可以避免浪費(fèi)root部分的空間野来,加快檢索的速度恼除,因?yàn)槲覀兺ǔ2僮鲾?shù)據(jù)都是操作root部分。
總結(jié):
以上就是在jsp頁(yè)面中取出值棧中值的幾種辦法,其中以第三中方法最常用豁辉,每種方法最好都要掌握令野,靈活運(yùn)用即可。