一、ActionContext存数据
package com.san.action;
import java.util.Map;
import javax.servlet.ServletContext;
import javax.servlet.http.HttpSession;
import org.apache.struts2.ServletActionContext;
import com.opensymphony.xwork2.ActionContext;
import com.opensymphony.xwork2.ActionSupport;
public class Action1 extends ActionSupport {
private static final long serialVersionUID = 1L;
/**
* 利用ActionContext存储数据
* @return
*/
public String action1(){
//1、得到ActionContext对象
ActionContext ac=ActionContext.getContext();
//1.1、向ActionContext中存数据(map中存数据)key唯一,不然会覆盖
ac.put("name","张三");
ac.put("name2", "李四");
//2、向session中存数据(第一种方法map)
Map<String,Object> session1=ac.getSession();
session1.put("s1", "session11111");
//2.1第二种方法(原始)
HttpSession session2=ServletActionContext.getRequest().getSession();
session2.setAttribute("s2","session22222");
//3向ServletContext中存数据(第一种方法)
Map<String,Object> application1=ac.getApplication();
application1.put("a1","a1111111");
//3.1向ServletContext中存数据(第二种方法)
ServletContext application2=ServletActionContext.getServletContext();
application2.setAttribute("a2","a222222");
return SUCCESS;
}
}
二、ActionContext取数据
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%@ taglib prefix="s" uri="/struts-tags" %>
<!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>取ActionContext数据</title>
</head>
<body>
<s:debug/>
<s:property value="#name"/><br/>
<s:property value="#name2"/><br/>
<%--获取大Map中的小map中的数据(用点运算符(OGNL表达式)) --%>
<s:property value="#session.s1"/><br/>
<s:property value="#session.s2"/><br/>
<s:property value="#application.a1"/><br/>
<s:property value="#application.a2"/>
</body>
</html>
三、ValueStack存数据
1、获取ValueStack对象的引用方法
(1)第一种方法从request中获取
(2)第二种方法先获取ActionContext对象,再取出requestMap()
(3)第三种方法:使用ActionContext对象方法,直接获取ValueStack对象的引用
2、代码如下
package com.san.action;
import java.util.Map;
import javax.servlet.http.HttpServletRequest;
import org.apache.struts2.ServletActionContext;
import com.opensymphony.xwork2.ActionContext;
import com.opensymphony.xwork2.ActionSupport;
import com.opensymphony.xwork2.util.ValueStack;
import com.san.model.Student;
public class Action2 extends ActionSupport {
private static final long serialVersionUID = 1L;
/**
* 利用ValueStack存数据
* @return
*/
public String action2(){
//获取ValueStack对象的引用
/*1、第一种方法从request中获取
HttpServletRequest request=ServletActionContext.getRequest();
ValueStack vs=(ValueStack)request.getAttribute("struts.valueStack");
System.out.println(vs.hashCode());*/
/*2、第二种方法先获取ActionContext对象,再取出requestMap()
ActionContext context=ActionContext.getContext();
Map<String,Object> requestAttribute=(Map<String, Object>)context.get("request");
ValueStack vs2=(ValueStack)requestAttribute.get("struts.valueStack");
System.out.println(vs2.hashCode());*/
/*3、第三种方法:使用ActionContext对象方法,直接获取ValueStack对象的引用
ValueStack vs3=context.getValueStack();
System.out.println(vs3.hashCode());*/
ActionContext context=ActionContext.getContext();
ValueStack vs=context.getValueStack();
//压栈
vs.push(new Student("张三",18));
vs.push(new Student("李四",24));
/**
* setValue(String expr,Object value);
* String expr:OGNL表达式
* Object value:我们要操作的数据
* 1、如果expr使用了#,数据存入contextMap
* 2、如果没有使用#,数据存入ValueStack
*/
//把数据存入contextMap中。key是name,value是王五
vs.setValue("#name","王五");
//把ValueStack中的第一个age换成90,如果没有age会报错
vs.setValue("age",90);
/**
* set(String key,Object o);
* String key:Map的key
* Object o:Map的value
* 如果栈顶是一个Map元素,直接把key作为Map的key,把Object作为Map的value存入。存入的是栈顶
* 如果栈顶不是一个Map元素,创建一个Map对象,把key作为Map的key,把Object作为map的value,压入栈顶
*/
vs.set("s1",new Student("赵六", 26));
vs.push(new Student("test",99));
vs.set("s2",new Student("aaa",111));
return SUCCESS;
}
}
四、ValueStack取数据
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%@ taglib prefix="s" uri="/struts-tags" %>
<!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>取ValueStack数据</title>
</head>
<body>
<%--
注意:
1、取ValueStack中的对象属性时,不使用#。
它是从栈顶逐个对象查找指定的属性名称。只要找到了,就不再继续查找。
2、取vs.set()时,虽然它是map,但是它在ValueStack中,所以不用#
--%>
<s:debug/>
<s:property value="[0].name"/><br/>
<s:property value="[1].name"/><br/>
<s:property value="[2].name"/><br/>
<s:property value="[3].name"/><br/>
<s:property value="[4].name"/><br/>
<%--什么都不写时,默认取栈顶元素 --%>
</body>
</html>