什么是值栈
值栈就是OGNL表达式存取数据的地方,Struts2是在有请求到达的时候为每个请求创建一个新的值栈,这也就是说值栈和请求是一一对应的,值栈封装了一次请求所需要的所有数据,这种一一对应的关系使值栈能够线程安全地为每个请求提供公共的数据存取服务。
值栈的生命周期
值栈可以作为一个数据的中转站,用于在前台-后台之间传递数据。ValueStack贯穿整个Action的生命周期,每个Action类的对象实例 都拥有一个ValueStack对象,在其中保存当前Action对象和其他相关对象。Struts2框架把ValueStack对象保存在名为”struts.valueStack”的request属性中,也就是说,ValueStack与Action的生命周期保持一致,ValueStack的生命周期是随着request的创建而创建,随着request的销毁而销毁。
在jsp中取Action中的数据
- 取普通属性:
- 在Action中定义以下数据
private String str;
//setter 和 getter 方法
//或者将str修饰符设为public
public String execute()
{
this.str="str";
}
- 在jsp中使用EL表达式获取
${str}
//或者用struts标签库
<s:property value="str"/>
- 部署运行后在jsp页面中显示 str
- 在Action中定义以下数据
- 取对象数据
- 先定义一个User类
public class User {
private int id;
private String name;
public User(int id, String name) {
super();
this.id = id;
this.name = name;
}
//setter and getter
} - 在Action中声明User对象并创建
private User user;
//setter and getter
public String execute()
{
this.user = new User(1,"user1");
return "success";
}
- 在jsp中获取user的属性
<s:property value="user.id" />//${user.id}
<s:property value="user.name"/><br/>//${user.name}
${user.id}${user.name} - 部署运行和在jsp页面显示
1user1
1user1
- 先定义一个User类
- 取List集合中的数据
- Action中定义
private List<User> list;
//setter and getter
public String execute(){
this.list = new ArrayList<User>();
//模拟存入数据
for(int i=0; i<3; i++){
list.add(new User(i,"username"+i));
}
return "success";
} - Jsp页面中获取
<s:iterator var="u" value="list">//value为Action集合List对象的名称
<s:property value="#u.id"/>//${u.id}
<s:property value="#u.name"/><br/>//${u.name}
</s:iterator> - 部署运行后在jsp页面显示
0 username0
1 username1
2 username2
- Action中定义
- 取Map集合中的数据
- 在Action中定义对象
private Map<String, User> map;
//setter and getter
public String execute(){
this.map = new HashMap<String, User>();
for(int i=0; i<3; i++){
map.put("user"+i,new User(i,"username"+i));
}
return "success";
} - 在JSP中取数据
<s:iterator var="u" value="map"><!-- u is a entry -->
//EL取值
<s:property value="#u.key"/>//${u.key}
<s:property value="#u.value.id" />//${u.value.id}
<s:property value="#u.value.name"/><br/>//${u.value.name}
</s:iterator> - 部署运行后显示
user0 0 username0
user2 2 username2
user1 1 username1
- 在Action中定义对象
PS
- 在jsp页面导入struts2标签库
<%@taglib prefix="s" uri="/struts-tags"%>
- EL表达式默认支持在四个作用域取值,分别为page、request、session和application,EL表达式能够访问值栈中数据的原因,就是因为Struts2对request进行了增强,如果在request作用域中没有查找到对应的值,就去值栈中查找,找到后台会将数据取出。在请求范围中找不到时,先作为属性在root中找,找不到会作为key到contextMap中找对应的value