struts2 ognl

值栈是静态注入生成的,值栈有对象栈和map栈。




从图可以看出,map栈分为两部分,图中map栈左边部分跟对象栈的内存结构一样。可以根据ActionContext.getContext().getValueStack().getRoot()访问对象栈,还可以通过ActionContext.getContext().getValueStack().getContext()访问。

值栈的生命周期:值栈的生命周期就是一次请求

值栈的数据结构:对象栈和map栈

对象栈和map栈的区别:对象栈是一个list,map栈是一个map

怎么样把数据放到map栈中:这个方法ActionContext.getContext().put("departmentList", departmentList);可以把departmentList放到map栈中。这个方法ServletActionContext.getRequest().setAttribute("departmentList", departmentList);把departmentList放到request中,在页面中通过#request.departmentList返回,这里要迭代list集合.



怎么样把数据放到对象栈中:例如ActionContext.getContext().getValueStack().push(departmentList);ActionContext.getContext().getValueStack().getRoot().add(0,departmentList);这两个方法可以把departmentList放到对象栈栈顶;ActionContext.getContext().getValueStack().getRoot().add(departmentList);这个方法可以把departmentList放到对象栈栈底;ActionContext.getContext().getValueStack().peek();这个方法获取对象栈的栈顶元素;ActionContext.getContext().getValueStack().pop();这个方法移除对象栈的栈顶元素,也可以通过ActionContext.getContext().getValueStack().getRoot().remove(0);移除对象栈的栈顶元素


对象栈中的数据有什么特殊之处:

*****对象栈的说明:1.处于对象栈中的对象,它的属性是可以直接访问的。2.如果在对象栈中有相同名称的属性,那么从栈顶开始查找,直到找到为止。3.一般情况下回显的数据应该放在对象栈中,这样效率比较高。4.用Ognl表达式访问对象栈,直接属性名称就可以了,不用加#。

*****map栈的说明:1.request,session,application都在map栈中。2.可以把一个对象放到map中。3.Ognl表达式访问map栈中的内容:如果一个对象在map中,那么就是#request.对象的key值.属性; 如果一个对象直接放入到map中,那么就是#对象的key值.属性。注意:把一个对象放到map栈中,你是不能直接访问这个对象的属性的。

把一个map放到对象栈的栈顶:ActionContext.getContext().getValueStack().set(key,o);

以上转载于:https://www.jianshu.com/p/320e1d31576f

最后再来谈一下关于 ActionContext.getContext().getValueStack().setValue(key,o)方法。 此方法有一个巨坑:

a. 当对象栈的顶部是一个Action时,那么该方法就会去查找匹配Action是否有key的set***方法。如果没有则在debug模式下就会抛出异常。

	      ValueStack vs= (ValueStack)request.getAttribute("struts.valueStack");
	     /* vs.set("vsSet", "haha");
	      vs.set("userMap", user);
	      vs.set("vsSet1", "haha1");*/
	      /*vs.set("vsSet1", "haha1");*/
	      vs.setValue("vsSetValue", "<haha>");
	      

异常信息:
Error setting expression 'vsSetValue' with value '<haha>'
异常堆栈:

Error setting expression 'vsSetValue' with value '<haha>' - [unknown location]at com.opensymphony.xwork2.ognl.OgnlValueStack.handleRuntimeException(OgnlValueStack.java:202)at com.opensymphony.xwork2.ognl.OgnlValueStack.setValue(OgnlValueStack.java:179)

b.当对象栈的顶部不是一个Action时而是一个Map时该值植入到map,而非action,即使action中有该sett**方法。典型用法:

	      ValueStack vs= (ValueStack)request.getAttribute("struts.valueStack");
	     /* vs.set("vsSet", "haha");
	      vs.set("userMap", user);
	      vs.set("vsSet1", "haha1");*/
	      vs.set("vsSet1", "haha1");
	      vs.setValue("vsSetValue", "<haha>");

此时对象栈的顶部不是action,而是一个Map对象,key键为vsSetValue的键值对将会放入栈顶的Map中,action中将不会获得赋值。

ActionContext.getContext().getValueStack().push(o);

ValueStack vs= (ValueStack)request.getAttribute("struts.valueStack");
vs.push("vsSetValue");
vs.push("vsSetValue2");

1)push() 方法设置值,没有名称,只有设置的值

2)push() 方法会把向值栈中放的数据存到 top 数组中。最后一个放入的在最顶部,以此类推。

3)JSP页面用struts标签取值写法

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

 ActionContext.getContext().put(key, value);

ActionContext.getContext().put()就是把属性放到了action的上下文中。ActionContext本身就是一个MAP,你放入的是一个键值对。页面中取值:

${requestScope.greeting} 或者 <%=request.getAttribute("greeting")%> 

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值