java

位置:IT落伍者 >> java >> 浏览文章

对Struts2 OGNL的分析与简介


发布日期:2020年03月25日
 
对Struts2 OGNL的分析与简介

Struts OGNL基础上的增强

值栈(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的分析与简介

               

上一篇:实现一个简单的struts和spring框架

下一篇:Eclipse报告内存不足和PermSize space错误