【Struts2】【Action类】【值栈=Context+Root】

值栈

每一次请求都会创建一个值栈对象,用于封装请求的所有数据.
值栈分为两个部分Context+root

JSP中查看值栈

     <%@taglib prefix="s" uri="/struts-tags"%>
     <s:debug/>

Action类中获取值栈 3个方式(了解)

//通过req获取值栈
HttpServletRequest req= ServletActionContext.getRequest();
ValueStack valueStack1 = (ValueStack)req.getAttribute("struts.valueStack");
ValueStack valueStack2 = (ValueStack)req.getAttribute(ServletActionContext.STRUTS_VALUESTACK_KEY);

//通过ActionContext 
ActionContext ctx = ActionContext.getContext();
ValueStack valueStack3 = ctx.getValueStack();

Context容器

Context是一个容器,这个容器中由 其他容器+键值对 组成.
这里写图片描述

  1. 其他容器:request,session,application,parameters,root
  2. 键值对:action=当前action ;ctx对象.put(key,value)放入的键值对;

1.获取Context容器

ActionContext对象 就是一个map

//通过值栈获取容器
ValueStack valueStack = ctx.getValueStack();
Map<String, Object> ctx= valueStack.getContext();

//获取ActionContext对象,作为容器
ActionContext ctx = ActionContext.getContext();

2.在Action类,往Context存值

req方式存值

//获取req
HttpServletRequest req= ServletActionContext.getRequest(); 

req.getSession().setAttribute("myName", "armo"); //存于Context容器的session容器中
req.setAttribute("myName", "armo");             //存于Context容器的request容器中

ctx方式存值

//获取ActionContext对象 
ActionContext ctx = ActionContext.getContext();
Map<String, Object> session = ctx.getSession();
Map<String, Object> application = ctx.getApplication();

ctx.put("myName", "armo");              //直接存入context容器 "myName" 为key
session.put("myName", "armo");          //存于context容器的session容器中
application.put("myName", "armo");      //存于context容器的application容器中

3.在JSP中,取Context容器中的值

#等价于ActionContext.getContext();

<s:property value="#key"/>

root容器

栈结构的容器,存放一些错误信息,Action对象相关数据

1.获取root对象

//获得值栈对象,再获得root对象
ValueStack valueStack = ctx.getValueStack();
CompoundRoot root = valueStack.getRoot();

2.在Action类,往root放值

  • 方式1
//会存在数组中
root.add(0, "Armo");
root.add("Armo2");
valueStack.set("姓名", "armo3");

这里写图片描述

  • 方式2
    通过getter方法传递,传递的参数必须是全局变量
    会以key-value方式存于root容器
    //全局变量
    private Date date=new Date();
    private String name="armo";
    private Integer age = 111;
    //getter方法
    public Date getDate() {
        return date;
    }
    public String getName() {
        return name;
    }
    public Integer getAge() {
        return age;
    }

这里写图片描述

3.在JSP,向root容器取值

<s:property value="属性名"/>
<s:property value="[0].top"/>

总结

掌握:
- context,root取值的方式
- 使用ActionContext对象,向context放值
- 使用getter方法,向root放值

细节:
<s:property value="属性名"/>等价于${属性名};会先去root找值,找不到再去context容器找.

servletContext: 是req的Application级别的对象;
ServletActionContext: ActionContext的子类,用于获取req;
ActionContext: 是Action类中的重要对象.

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值