概念
1. 值栈(ValueStack)
在用户提交一个请求后,系统会创建两个对象,Action的实例和值栈对象,值栈由两部分组成:
- CompoundRoot root; //对象栈(根元素),数据结构意义上的栈实现的
transient Map< String,Object > context; //Map栈(上下文),是一个Map结构
引用其他博主的图更容易理解,详细见链接:https://www.cnblogs.com/hlhdidi/p/6185836.html
2. OGNL(Object-Graph Navigation Language)
是一种功能强大的表达式语言,OGNL表达式的计算你需要通过一个Map进行,而该Map有一个名称叫做上下文context,这个context的Map中已经放了若干对象,这些对象分为两类:根对象和非根对象。对于非根对象,需要使用”#”来访问,而对于根对象,则可以直接访问。
常用操作的语句
1. 值栈的获取
①从ActionContext中获取
ActionContext.getContext().getValueStack();
②通过request域
HttpServletRequest request=ServletActionContext.getRequest();
ValueStack vs=(ValueStack)request.getAttribute(ServletActionContext.STRUTS_VALUESTACK_KEY);
2. 值栈的操作
- root对象(根对象)实现了栈的数据结构,可以使用peek(),pop(),push()操作
- context对象(非根对象)实现了Map,可以使用Map的操作
3. 通过< s:debug />来对值栈中数据的存放情况进行了解。
4.通过< s:property value=”[index].name” />来显示值栈中根对象的值
其中index默认从0开始往根对象的下面搜索,找到对应的属性则返回,index可以为0,1,2…,如果默认从根对象的栈顶开始搜索,则可以省略掉[index],直接写成
5.往context中的session中放入数据
ActionContext.getContext().getSession().put(“myStudent”,student);
在jsp页面获取该数据时:< s:property value=”#session.myStudent.name” />
或者 ${sessionScope.myStudent.name}
6.往context中的application中放入数据
ActionContext.getContext().getApplication().put(“myStudent”,student);
在jsp页面获取该数据时:< s:property value=”#application.myStudent.name” />
或者 ${applicationScope.myStudent.name}
7.请求参数:在提交Action请求时所携带的参数,会自动存放到context中的parameters属性中
在jsp页面获取该数据时:< s:property value=”#parameters.username” />
8.创建Action对象后会将Action实例本身也放在context的action属性中
在jsp页面获取该数据时:< s:property value=”#action.username” />
9.遍历List和Map
在jsp页面获取该数据时:
< s:iterator value=”#userList” >
< s:property / >
< /s:iterator >
注意
关于值栈:
①值栈会贯穿Action的整个生命周期,即与请求request的声明周期相同,为保证这一点,就将值栈放在request域当中
②一个Action实例只有一个值栈对象
③一个Action的非根对象都存放在同一个Map中
④当Struts接收到请求后,会创建一个Action对象和ActionContext对象,那么值栈对象也创建了,Struts会将Action放在值栈的栈顶。所以可以通过属性名访问到Action中的属性。