Struts2 后台数据传输到页面(域对象传值,值栈(狭义值栈和广义值栈))
域对象传值:
域对象: 范围对象,Action类中获取域对象的方式有IOC方式和非IOC方式,详细细看:http://blog.csdn.net/benxiaohai888/article/details/78374307
application---ServletContext
session---HttpSession
request---HttpServletRequest
response--HttpServletResponse
简单的示例:
Action类(LoginAction.java)
package cn.sz.action;
import java.util.Date;
import javax.servlet.ServletContext;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import org.apache.struts2.ServletActionContext;
import cn.sz.vo.User;
public class UserAction {
// 域对象传值方法(非IOC方式)
public String insert() {
//非IOC方式获取域对象
ServletContext application = ServletActionContext.getServletContext();
HttpServletRequest request = ServletActionContext.getRequest();
HttpSession session = ServletActionContext.getRequest().getSession();
HttpServletResponse response = ServletActionContext.getResponse();
//可以取值
String id = (String) application.getAttribute("id");
String name = (String) request.getAttribute("name");
String sessionvalue = (String) session.getAttribute("session");
System.out.println(id + "," + name + "," + sessionvalue);
//可以设置值
application.setAttribute("key", "application");
session.setAttribute("key", "session");
request.setAttribute("key", "request");
return "insert";
}
}
显示页面(index.jsp):
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title></title>
</head>
<body>
<h1>登录成功后的index界面</h1>
<p>EL表达式获取值</P>
${applicationScope.key }
${requestScope.key }
${sessionScope.key }
</body>
</html>
值栈传值:
1.什么是值栈?
是存放value值的内存空间,具备先进后出的特点(FILO LIFO).
2. 在struts中有两类值栈,狭义值栈和广义值栈
广义值栈ActionContext,线程安全,值栈中可以设置在当前请求下的key-value
狭义的值栈ValueStack(接口),OGNLValueStack(实现),狭义值栈实现OGNLValueStack对象,线程安全,存储action中的
设置了set方法的属性和值,通常用于与OGNL表达式和struts标签结合使用,狭义的值栈属于广义值栈的一部分.
通常意义上,所说的值栈是指广义值栈
3.后台获得值栈
getContext()---获取广义值栈
get("request")---获取狭义值栈
getValueStack()--获取狭义值栈
getParameters()---获取url之后的key-value对
put()----设置值
自定义拦截器也可以获取值栈:
public String intercept(ActionInvocation invocation) throws Exception {
// 这个操作也可以获取广义值栈
ActionContext ac = invocation.getInvocationContext();
// 如果返回值是null,那么表示此拦截器没有通过;如果返回值不是null,表示可以通过拦截器
String invoke = invocation.invoke();
return invoke;
}
示例代码:
Action类:
public class LoginAction implements Action{
@Override
public String execute() throws Exception {
// 演示用于广义值栈和狭义值栈将后台的数据传输到页面
// 获取广义值栈
ActionContext ac = ActionContext.getContext();
//直接将值放在值栈中,页面可以使用OGNL表达式中的 <s:property value="#attr.attr1" /> 获取内容
ac.put("attr1", "attr");
// 通过广义值栈获取Session域
Map<String, Object> session = ac.getSession();
// 这里演示将一个集合数据推送到值栈
ArrayList<User> list = new ArrayList<>();
User u1 = new User(1, "张三");
User u2 = new User(2, "李四");
User u3 = new User(3, "王五");
list.add(u1);
list.add(u2);
list.add(u3);
session.put("users", list);
// 演示将时间推送到值栈中
session.put("currentdate", new Date());
// 可以用广义值栈来获取狭义值栈
ValueStack vs = ac.getValueStack();
// 保存要推送到值栈的内容
vs.push("string");
vs.set("str", "我是狭义值栈要推送到页面的内容");
return "success";
}
}
显示页面index.jsp:
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!-- 引入struts标签库 -->
<%@taglib uri="/struts-tags" prefix="s"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title></title>
</head>
<body>
<h1>登录成功后的index界面</h1>
<!-- struts调试-->
<s:debug></s:debug>
EL表达式:${sessionScope.currentdate }
<br>
<!-- 用于OGNL表达式获取从后台传输过来的数据 -->
<s:property value="str" />
<br>
<!-- #表示ActionContext.getContext().
#session表示ActionContext.getContext().getSession() -->
<s:property value="#session.currentdate" />
<br>
<!--遍历后台传输过来的list集合 -->
<s:iterator value="#session.users" var="user">
<s:if test="#user.id==1">
<p style="color: red;">
<s:property value="#user.id" />
<s:property value="#user.name" />
</p>
</s:if>
<s:elseif test="#user.id==2">
<p style="color: blue;">
<s:property value="#user.id" />
<s:property value="#user.name" />
</p>
</s:elseif>
<s:else>
<p style="color: yellow;">
<s:property value="#user.id" />
<s:property value="#user.name" />
</p>
</s:else>
</s:iterator>
<br>
<s:property value="#attr.attr1" />
<br>
<s:property value="#session.users.{$#this.id==1}.{id}" />
<br>
<br>
</body>
</html>