上一篇文章我們已經(jīng)了解了如何在struts2的值棧中存數(shù)據(jù),那么這篇文章我們就一起來了解一下如何在jsp頁面中獲取值棧中的數(shù)據(jù)。
1 獲取使用set方法存入值棧中的值
在上一篇文章中我們已經(jīng)了解到,使用set方法向值棧中存值,使用的是map方式,那么就有key和value,取值時我們只需根據(jù)key來取就可以了。
代碼演示如下:
首先我們使用set方法向值棧中存入一個值,關鍵代碼:
//1 獲取值棧對象
ActionContext context = ActionContext.getContext();
ValueStack stack = context.getValueStack();
//2 調(diào)用值棧對象中的set方法
stack.set("demo", "DemoData");
return "success";
然后我們在jsp頁面中使用struts標簽獲取值棧中的這條數(shù)據(jù),關鍵代碼:
<!--導入struts標簽庫-->
<%@ taglib uri="/struts-tags" prefix="s"%>
<!-- 獲取set方法設置的值 根據(jù)名稱獲取值-->
<s:property value="demo"/>
2 獲取使用push方式存入值棧中的值
由上一篇文章可知,push方式存值是沒有map結構的,那么沒有key,我們?nèi)绾稳≈的??事實上struts2中將push方法存入值棧中的值都放在一個名為top的集合中,那么我們只需利用這個集合便可獲取到其中的值
代碼示例:
首先我們還是先用push方法將數(shù)據(jù)放入到值棧中去,關鍵代碼:
//1 獲取值棧對象
ActionContext context = ActionContext.getContext();
ValueStack stack = context.getValueStack();
//2 調(diào)用值棧對象中的push方法
stack.push("abcd");
return "success";
然后在jsp頁面中獲取值棧中的值,關鍵代碼:
<!--導入struts標簽庫-->
<%@ taglib uri="/struts-tags" prefix="s"%>
<!-- 獲取push方法設置的值 -->
<s:property value="[0].top"/>
這里需要特別注意jsp頁面中使用ognl表達式獲取list集合中元素的寫法,不是 top[0] 而是 [0].top ,和我們在java代碼中取list集合元素的寫法是有區(qū)別的。
3 獲取使用變量的get方法存入值棧中的值
這是往值棧中存值最常用的方法,這里我們將其分為取字符串,取對象和取list集合三種方式分別演示。
1 獲取get方式存入值棧中的字符串
首先我們先使用變量方法存入一個字符串到值棧中,關鍵代碼:
private String username;
public String getUsername(){
return username;
}
public String execute() throws Exception {
username = "demo";
retrun "success";
}
然后我們在jsp頁面中獲取這個字符串的值,關鍵代碼:
<!--導入struts標簽庫-->
<%@ taglib uri="/struts-tags" prefix="s"%>
<!--使用s標簽獲取username的值-->
<s:property value="username" />
2 獲取get方式存入值棧中的對象
首先將對象存入到值棧中去,關鍵代碼:
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頁面中獲取這個對象,關鍵代碼:
<!--導入struts標簽庫-->
<%@ taglib uri="/struts-tags" prefix="s"%>
<!--使用struts2標簽獲取對象的數(shù)據(jù)-->
<s:property value="user.username"/>
<s:property value="user.password"/>
<s:property value="user.address"/>
3 獲取get方式存入值棧中的list集合
首先將list集合存入值棧,關鍵代碼:
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("美國");
User user2 = new User();
user2.setUsername("小王");
user2.setPassword("250");
user2.setAddress("越南");
list.add(user1);
list.add(user2);
return "success";
}
然后在jsp頁面中獲取list中的數(shù)據(jù),在jsp中獲取值棧中的list有三種方式,下面我們分別演示,關鍵代碼:
<!--導入struts標簽庫-->
<%@ 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標簽 類似jstl的foreach標簽
s:iterator:遍歷值棧的list集合
-->
<s:iterator value="list">
<!-- 遍歷list得到list里面每個user對象 -->
<s:property value="username"/>
<s:property value="password"/>
<s:property value="address"/>
<br/>
</s:iterator>
獲取list的值第三種方式:
<br/>
<s:iterator value="list" var="user">
<!--
遍歷值棧list集合,得到每個user對象
機制: 把每次遍歷出來的user對象放到 context里面
獲取context里面數(shù)據(jù)特點:寫ognl表達式,需要
使用特殊符號 #
-->
<s:property value="#user.username"/>
<s:property value="#user.password"/>
<s:property value="#user.address"/>
<br/>
</s:iterator>
這里第一和第二種方法都比較好理解,第三種方法需要注意的地方在:在s:iterator 標簽時如果使用了var屬性,那么struts2會在值棧的context部分新開辟一個臨時空間,并將遍歷出來的list集合中的元素放到這個臨時空間中,那么這時候再使用ognl表達式獲取數(shù)據(jù)要使用#號,否則無法取出數(shù)據(jù)。
這樣可以避免浪費root部分的空間,加快檢索的速度,因為我們通常操作數(shù)據(jù)都是操作root部分。
總結:
以上就是在jsp頁面中取出值棧中值的幾種辦法,其中以第三中方法最常用,每種方法最好都要掌握,靈活運用即可。