Struts OGNL基础上的增强
1值栈(ValueStack)
Struts OGNL上下文设置为Struts中的ActionContext(内部使用的仍然是OgnlContext)并将值栈设为Struts OGNL的根对象
我们知道Struts OGNL上下文中的根对象可以直接访问不需要使用任何特殊的标记而引用上下文中的其他对象则需要使用#来标记由于值栈是上下文中的根对象因此可以直接访问那么对于值栈中的对象该如何访问呢?Struts提供了一个特殊的OGNLPropertyAccessor它可以自动查找栈内的所有对象(从栈顶到栈底)直接找到一个具有你所查找的属性的对象也就是说对于值栈中的任何对象都可以直接访问而不需要使用#
假设值栈中有两个对象student和employee两个对象都有name属性student有学号属性number而employee有薪水属性salaryemployee先入栈student后入栈位于栈顶那么对于表达式name访问的就是student的name属性因为student对象位于栈顶表达式salary访问的就是employee的salary属性正如你所见访问值栈中的对象属性或方法无须指明对象也不用#就好像值栈中的对象都是OGNL上下文中的根对象一样这就是Struts在OGNL基础上做出的改进
[N]语法
如上所述如果想要访问employee的name属性应该如何写表达式呢?我们可以使用[N]xxx(N是从开始的整数)这样的语法来指定从哪一个位置开始向下查找对象的属性表达式[]name访问的就是employee对象的name属性
在使用[N]xxx语法时要注意位置序号的含义它并不是表示获取栈中索引为N的对象而是截取从位置N开始的部分栈
top关键字
top用于获取栈顶的对象结合[N]xxx语法我们就可以获取栈中任意位置的对象
如[]top[]top等
访问静态成员
除了使用标准的OGNL表达式访问静态字段和静态方法外Struts还允许你不指定完整的类名而是通过vs前缀来调用保存在栈中的静态字段和静态方法
@vs@FOO_PROPERTY@vs@someMethod()@vs@someMethod()
vs表示ValueStack如果只有vs那么将使用栈顶对象的类如果在vs后面跟上一个数字那么将使用栈中指定位置处的对象类
标准方法:@类全限定名@静态属性或方法名
< ?xml:namespace prefix = s />< s:property value=@actionSystemInfo@WEB_CONTEXT>< /s:property>
值栈中的Action实例
Struts框架总是把Action实例放在栈顶因为Action在值栈中而值栈又是OGNL中的根所以引用Action的属性可以省略#标记这也是为什么我们在结果页面中可以直接访问Action的属性的原因
Struts中的命名对象
Struts还提供了一些命名对象这些对象没有保存在值栈中而是保存在ActionContext中因此访问这些对象需要使用#标记这些命名对象都是Map类型
parameters
用于访问请求参数如#parameters[id]或#parametersid相当于调用了HttpServletRequest对象的getParameter()方法
注意parameters本质上是一个使用HttpServletRequest对象中的请求参数构造的Map对象一量对象被创建(在调用Action实例之前就已经创建好了)它和HttpServletRequest对象就没有了任何关系
request
用于访问请求属性如#request[user]或#requestuser相当于调用了HttpServletRequest对象的getAttribute()方法
session
用于访问session属性如#session[user]或#sessionuser相当于调用了HttpSession对象的getAttribute()方法
application
用于访问application属性如#application[user]或#applicationuser相当于调用了ServletContext的getAttribute()方法
attr
如果PageContext可用则访问PageContext否则依次搜索requestsession和application对象
以上就是对Struts OGNL的分析与简介