struts2是如何把后台数据返回到前台的呢?围绕着这个问题展开思考。
struts2封装好了一个容器,用来返回数据的,就是ActionContext,下图是一个没有数据返回的action
在jsp页面使用s标签,点击出现下面页面
那么这个包含了什么东西呢,看源码。
//绑定线程的使用空间,即使 Action是多线程的也不会产生线程不安全问题
//值栈
//session和application
不需要我们手动返回把数据添加到值栈中去,struts2会自动的返回,如下:
package cn.jieou.struts.action;
import java.util.ArrayList;
import java.util.List;
import com.opensymphony.xwork2.ActionSupport;
import cn.jieou.struts.pojo.User;
public class NewAction extends ActionSupport{
/**
*
*/
private static final long serialVersionUID = 1L;
private String myValueStack = "MJ_VALUE_STACK";
private List<User> users;
public String getMyValueStack() {
return myValueStack;
}
public void setMyValueStack(String myValueStack) {
this.myValueStack = myValueStack;
}
public List<User> getUsers() {
return users;
}
public void setUsers(List<User> users) {
this.users = users;
}
public String add(){
users = new ArrayList<User>();
User user1 = new User(1, "MJ1", "123");
users.add(user1);
User user2 = new User(2, "MJ2", "123");
users.add(user2);
User user3 = new User(3, "MJ3", "123");
users.add(user3);
User user4 = new User(4, "MJ4", "123");
users.add(user4);
User user5 = new User(5, "MJ5", "123");
users.add(user5);
return "success";
}
}
注意:要给每个属性添加getter和setter方法,不然不可以自动添加进去
我们还可以向request域,session域和application域存值,如:
// 获得ActionContext实例,以便访问Servlet API
ActionContext ctx = ActionContext.getContext();
// 存入application
ctx.getApplication().put("msg", "application信息");
// 保存session
ctx.getSession().put("msg", "seesion信息");
// 保存request信息
HttpServletRequest request = ServletActionContext.getRequest();
request.setAttribute("msg", "request信息");
前台可以用OGNL表达式获取
注意:这几个域都不在值栈里面而是值栈的上下文(Stack Context),所以利用OGNL取值都需要添加#符号
<h3>访问OGNL上下文和Action上下文</h3>
<!-- 使用OGNL访问属性值 -->
<p>request.msg: <s:property value="#request.msg" /></p>
<p>session.msg: <s:property value="#session.msg" /></p>
<p>application.msg: <s:property value="#application.msg" /></p>
这里简单介绍OGNL表达式:
OGNL表达式全称是对象图导航语言(Object-Graph Navigation Language ),是一种强大的表达式语言,它可以在值栈中取得数据。struts2的s标签库就是用OGNL表达式进行操作ActionContext中的数据的。
OGNL的三个符号:
1、#号:用来获取Stack Context里的Map值
<p>request.msg: <s:property value="#request.msg" /></p>
2、$号:在jsp页面中,和EL表达式类似,准确的说应该是struts2对EL表达式进行了增强,取值顺序为page->>request->>ValueStack->>session->>application;在xml文件中也可以使用$符号来获取数据
<p>${username}</p>
3、%号:用来解析标志OGNL表达式,%{}
<s:property value="%{[3].username}"/></p>