上一篇文章我们已经了解了如何在struts2的值栈中存数据,那么这篇文章我们就一起来了解一下如何在jsp页面中获取值栈中的数据。
1 获取使用set方法存入值栈中的值
在上一篇文章中我们已经了解到,使用set方法向值栈中存值,使用的是map方式,那么就有key和value,取值时我们只需根据key来取就可以了。
代码演示如下:
首先我们使用set方法向值栈中存入一个值,关键代码:
//1 获取值栈对象
ActionContext context = ActionContext.getContext();
ValueStack stack = context.getValueStack();
//2 调用值栈对象中的set方法
stack.set("demo", "DemoData");
return "success";
然后我们在jsp页面中使用struts标签获取值栈中的这条数据,关键代码:
<!--导入struts标签库-->
<%@ taglib uri="/struts-tags" prefix="s"%>
<!-- 获取set方法设置的值 根据名称获取值-->
<s:property value="demo"/>
2 获取使用push方式存入值栈中的值
由上一篇文章可知,push方式存值是没有map结构的,那么没有key,我们如何取值呢?事实上struts2中将push方法存入值栈中的值都放在一个名为top的集合中,那么我们只需利用这个集合便可获取到其中的值
代码示例:
首先我们还是先用push方法将数据放入到值栈中去,关键代码:
//1 获取值栈对象
ActionContext context = ActionContext.getContext();
ValueStack stack = context.getValueStack();
//2 调用值栈对象中的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集合元素的写法是有区别的。
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标签获取对象的数据-->
<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中的数据,在jsp中获取值栈中的list有三种方式,下面我们分别演示,关键代码:
<!--导入struts标签库-->
<%@ taglib uri="/struts-tags" prefix="s"%>
<! 获取值栈list集合数据 -->
获取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里面数据特点:写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表达式获取数据要使用#号,否则无法取出数据。
这样可以避免浪费root部分的空间,加快检索的速度,因为我们通常操作数据都是操作root部分。
总结:
以上就是在jsp页面中取出值栈中值的几种办法,其中以第三中方法最常用,每种方法最好都要掌握,灵活运用即可。
网友评论