本文主要是介绍Struts2的值栈深入理解,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
对Struts2这个框架用了很久,最近开发遇到一个关于值栈的问题,所以决定深入研究一下,
我们要知道OGNL只是显示数据的表达式语言
ValueStack值栈:存储数据的
研究源码:得到如下的理解
往对象栈(CompoundRoot extends ArrayList)中放数据
//把departmentList放入到了对象栈的栈顶
//ActionContext.getContext().getValueStack().push(departmentList);
//把departmentList放入到了对象栈的栈顶
//ActionContext.getContext().getValueStack().getRoot().add(0, departmentList);
//把departmentList放入到了对象栈的栈底
//ActionContext.getContext().getValueStack().getRoot().add(departmentList);
//获取对象栈的栈顶的元素
//ActionContext.getContext().getValueStack().peek();
//移除对象栈的栈顶的元素
//ActionContext.getContext().getValueStack().pop();
//移除对象栈的栈顶的元素
//ActionContext.getContext().getValueStack().getRoot().remove(0);
//把一个map放入到对象栈的栈顶
//ActionContext.getContext().getValueStack().set(key, o);
* 对象栈的说明
* * 处于对象栈的对象中的属性是可以直接访问的
* * 如果在对象栈中有一样名称的属性,从栈顶开始查找,直到找到为止
* * 一般情况下,回显的数据应该放在对象栈中,这样效果比较高
* * 用ognl表达式访问对象栈,直接属性名称就可以了,不用加#
向map栈存放数据的方法
说明
* * reuqest,session,application都在map栈中
* * 可以把一个对象放入到map中
* * ognl表达式访问map栈中的内容
* 如果一个对象在request中
* #request.对象的key值.属性
* 如果一个对象直接放入到map中
* #对象的key值.属性
* 把一个对象放入到map栈中,是不能直接访问该对象的属性
//#request.deparmentList
//ServletActionContext.getRequest().setAttribute("departmentList", departmentList);
list中含有list
// List<List<Department>> lists = new ArrayList<List<Department>>();
// Department department1 = new Department();
// department1.setDname("department1_name");
// Department department2 = new Department();
// department2.setDname("department2_name");
// List<Department> departmentList1 = new ArrayList<Department>();
// departmentList1.add(department1);
// List<Department> departmentList2 = new ArrayList<Department>();
// departmentList2.add(department2);
// lists.add(departmentList1);
// lists.add(departmentList2);
// list中含有map
// List<Map<String, Department>> lists2 = new ArrayList<Map<String,Department>>();
// Map<String, Department> map1 = new HashMap<String, Department>();
// map1.put("d1", department1);
// Map<String, Department> map2 = new HashMap<String, Department>();
// map2.put("d2", department2);
// lists2.add(map1);
// lists2.add(map2);
// map中含有list
// Map<String, List<Department>> maps = new HashMap<String, List<Department>>();
// maps.put("list1", departmentList1);
// maps.put("list2", departmentList2);
// ActionContext.getContext().put("maps", maps);
总结: * ValueStack是ognl存放数据的对象
* 得到ValueStack有三种方案
ActionContext.getContext().getValueStack()
ServletActionContext.getValueStack(request);
request.getAttribute("struts.valueStack");
* ValueStack作用域为request
* 当action创建的时候,ValueStack就创建了,当action被销毁时,ValueStack就销毁了
* ValueStack可以利用对象栈和map栈存放数据
* 向对象栈中存放数据
ActionContext.getContext().getValueStack().push 栈顶 对象
ActionContext.getContext().getValueStack().add() 栈底 对象
ActionContext.getContext().getValueStack().add(index,object);
按照指定的位置存放在对象栈中
ActionContext.getContext().getValueStack().set() 栈顶 Map
* 向map栈中
request,session,application setAttibute() map-->_values--->requst,session,application
ActionContext.getContext().put(key,value) 直接存放在map栈中
如何利用ognl表达式取ValueStack中的数据
* <s:property/>去栈顶的元素
* <s:iterator/> 取栈顶的元素
* s:iterator标签的value属性的值无论来自对象栈还是map栈,都可以不加#,s:select标签也适合
* 在s:iterator标签迭代的时候,把当前正在迭代的元素放入到栈顶
属性驱动:
* 在action中,有属性,属性的名称和页面上form表单中的name的值对应
* 属性必须有set和get方法
* 原理 在提交一个请求以后,action中的属性在栈顶。ParametersInterceptor拦截器 会把页面上的form表单的值获取,然后调出ValueStack,给栈顶的属性赋值。
模型驱动 * StudentAction implements ModelDriver<Student> * 在action中需要有一个私有的对象 private Student model = new Student(); * 原理 * 先经过ModelDriverInterceptor,作用是把model放入到栈顶 * 再经过ParametersInterrceptor,把栈顶的属性赋值 这两个拦截器不能颠倒执行
<!--
iterator说明
* 当前正在迭代的元素在栈顶
* 如果value属性不写,则默认迭代栈顶的元素
* value值如果为top,则也是迭代栈顶的元素
-->
<!--
list中含有list
-->
<!--
<s:iterator>
<s:iterator>
<s:property value="dname"/>
</s:iterator>
</s:iterator>
-->
<!--
list中含有map
-->
<!--
<s:iterator value="#list">
<s:iterator value="top">
<s:property value="key"/>
<s:property value="value.dname"/>
</s:iterator>
</s:iterator>
-->
<!--
map中含有list
-->
<!--
<s:iterator value="#maps">
<s:property value="key"/>
<!--
该迭代就是一个list
-->
<!--
<s:iterator value="value">
<s:property value="dname"/>
</s:iterator>
</s:iterator>
-->
这篇关于Struts2的值栈深入理解的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!