ValueStack详解:EL和OGNL用法

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/zc474235918/article/details/50002181

       最近在做一个OA的项目,经常出现因为 ${name} 和${#name}的区别导致,界面数据显示不出来。
       所以需要对这两种使用方法进行总结一下。

什么是值栈

值栈概图
       值栈包含两个部分:Stack和Map。在对象栈Stack中存放的是一个个对象,Map中存放的是键值对。

struts2的工作流程

Struts2工作流程
左侧的分别为struts2的各种拦截器。

值栈解析

对于页面请求:xx.action?id=11&name=22&ss=00
       对于请求中的属性,会去从ValueStack中去查找。
       这个是请求,所以url中数据,会查找 Action中的set方法,将内容给赋值。

对与页面的跳转:
       因为页面中有很多数据是从后台获取的。而在JSP开发中,一般是不会出现JAVA代码的,所以要想取得数据,就需要使用表达式。来获取数据。

常用的有EL表达式和OGNL表达式。

操作Map的方法:

ActionContext.getContext().put(k,v);
ActionContext.getContext().get(k);
ActionContext.getContext().getValueStack.put(k,v);
ActionContext.getContext().getValueStack.get(k);

操作Stack的方法:

ActionContext.getContext.getValueStack.push(obj);
ActionContext.getContext.getValueStack.pop(obj);

       不管是数据的访问 还是获取,都涉及到ValueStack的查找顺序:

值栈中的findValue(expr) 的查找顺序

1,从对象栈中查找指定名称的属性,从栈顶开始向下找。
2,如果从对象栈中没有找到属性,则从map中查找对应key的值。找到后就返回。

界面上的常用表达式: EL表达式和OGNL表达式

OGNL表达式

格式:
1,在struts.xml中,OGNL表达式格式为:${name}
2,在JSP中,OGNL表达式的格式为:%{name} 而且只能写在标签的属性中

常见写法:

    user =findValue("user")
    #user =map.get("user")
    #user.name =map.get("user").getName()

值栈中的findValue()的查找顺序

1,先从对象栈中查找指定名称的属性,从栈顶开始向下找。
2,如果没找到,就从map中查找对应key的值。Map.get()  毫无疑问 是从 Map中直接取对应key的值。

       看到这,有人会有疑问了。既然findValue()全都可以找到,为什么还会用 #user 取值。

如果数据在map中,使用 #user 比 使用 user的好处:

       1,省去了先从值栈查找的过程。
       2,如果值栈中恰好有要找的属性,那么找到的数据将不是想要的。造成了数据错误。

猜你喜欢

转载自blog.csdn.net/zc474235918/article/details/50002181