ActionContext和ValueStack存取数据

一、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>
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值