初识ActionContext

  • 动作类是多例的,每次动作访问,动作类都会实例化。所以是线程安全的。
  • 在每次动作执行前,核心控制器StrutsPrepareAndExecuteFilter都会创建一个ActionContext和ValueStack对象。且每次动作访问都会创建。
  • 这两个对象存储了整个动作访问期间用到的数据。
  • 并且把数据绑定到了线程局部变量(ThreadLocal)上了。所以是线程安全的。

contextMap

在这里插入图片描述
使用 struts内置标签 <s:debug> 查看contextMap数据

利用ActionContext存数据

import com.opensymphony.xwork2.Action;
import com.opensymphony.xwork2.ActionContext;
import com.opensymphony.xwork2.ActionSupport;
import org.apache.struts2.ServletActionContext;
import javax.servlet.ServletContext;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpSession;
import java.util.Map;

/**
 * @program: struts2_06
 * @description
 * @author: LIANG
 * @create: 2021-02-02 13:20
 **/
public class Actiondata extends ActionSupport {
    @Override
    public String execute() throws Exception {
        //获取ActionContext对象 直接存储key value对象
        ActionContext contextMap = ActionContext.getContext();
        contextMap.put("username","contextMapLIANG");
        
        //获取session对象 催出数据
        Map<String, Object> session = contextMap.getSession();
        session.put("username","session01LIANG");
        //通过request对象获取session 存储数据
        HttpSession session1 = ServletActionContext.getRequest().getSession();
        session1.setAttribute("username","seeeion02LIANG");
        
        //获取request对象 存储数据
        HttpServletRequest request = ServletActionContext.getRequest();
        request.setAttribute("username","requestLIANG");
        
        //获取application对象存储数据
        Map<String, Object> application = contextMap.getApplication();
        application.put("username","application01LIANG");
        //通过ServletActionContext获取Application对象 存储数据
        ServletContext servletContext = ServletActionContext.getServletContext();
        servletContext.setAttribute("username","application02LIANG");
        return SUCCESS;
    }
}

在这里插入图片描述

获取ValueStack对象的方法&存数据

 //1 使用ActionContext对象获取
ValueStack valueStack = ActionContext.getContext().getValueStack();
valueStack.push(new Student("LIANG","123456"));

//获取数据 方法一用ActionContext对象获取Request 获取值栈
Map<String,Object> requestMap = (Map<String,Object>)ActionContext.getContext().get("request");
ValueStack valueStack1 = (ValueStack)requestMap.get("struts.valueStack");

//第三种获取值栈的方法 使用ServletActionContext获取request 获取值栈
ServletActionContext.getRequest().getAttribute("struts.valueStack");

获取数据

取contextMap中的数据 需使用#
<%@ taglib prefix="s" uri="/struts-tags" %>
<%--
    @program: struts2_06
    @description
    @author: LIANG
    @create: 2021-02-02 16:14
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
    <head>
        <title>data01</title>
    </head>
    <body>
       <s:debug></s:debug>
<%--        取contextMap中的数据 使用#号--%>
        <s:property value="#username"></s:property><br>
        <s:property value="#session.username"></s:property><br>
        <s:property value="#application.username"></s:property><br>
    </body>
</html>

获取valueStack中数据 直接写类中的属性名

<%--        取contextMap里面ValueStack中对象的属性: 直接写对象中的属性名--%>
<s:property value="username"></s:property><br>

当取valueStack数据时如果对象属性重名(如下图) 通过OGNL表达式查找
在这里插入图片描述

<s:property value="[0].password"></s:property><br>
<s:property value="[1].password"></s:property><br>

注:当标签<s:properties>不给value属性时 默认取ValueStack取栈顶元素

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值