值栈
每一次请求都会创建一个值栈对象,用于封装请求的所有数据.
值栈分为两个部分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是一个容器,这个容器中由 其他容器+键值对 组成.
- 其他容器:request,session,application,parameters,root
- 键值对: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类中的重要对象.