Struts2 OGNL总结

来源:互联网 发布:软件开发 tr4阶段 编辑:程序博客网 时间:2024/06/14 06:29

之前对OGNL中的上下文环境有点疑惑,在这里总结一下:

OGNLContext对应ActionContext (一直以为是两个不同的Context)

Struts2框架把OGNL Context设置为ActionContext。并且ValueStack作为OGNL的根对象。除value stack之外,Struts2框架还把代表application、session、request这些对象的Map对象也放到ActionContext中去。(这也就是Struts2建议在Action类中不要直接访问Servlet API的原因,他可以通过ActionContext对象来部分代替这些(Servlet API)功能),这里说的够清楚了。 
ognl的root,对应ActionContext的ValueStack 
ActionContext里除了最关键的ValueStack,常用的还有request,session,application。 
ValueStack里一定有Action本身,而且ValueStack有个特殊的性质,就是会把其中包含对象的字段,看做自己的字段,可以直接访问。比如说,Action里有User,User里有name,那么你想访问name,只需要<s:property value="user.name" />就可以。 
除了ValueStack里的字段可以直接访问以外,其他的需要加上#操作符;

               |--request 
                     | 
                     |--application 
                     | 
       context map---|--OgnlValueStack(root) 
                     | 
                     |--session 
                     | 
                     |--attr 
                     | 
                     |--parameters 

“#”主要有三种用途:

  1. 访问OGNL上下文和Action上下文,#相当于ActionContext.getContext();下表有几个ActionContext中有用的属性: 名称作用例子parameters包含当前HTTP请求参数的Map#parameters.id[0]作用相当于request.getParameter("id")request包含当前HttpServletRequest的属性(attribute)的Map#request.userName相当于request.getAttribute("userName")session包含当前HttpSession的属性(attribute)的Map#session.userName相当于session.getAttribute("userName")application包含当前应用的ServletContext的属性(attribute)的Map#application.userName相当于application.getAttribute("userName")attr用于按request > session > application顺序访问其属性(attribute)#attr.userName相当于按顺序在以上三个范围(scope)内读取userName属性,直到找到为止
  2. 用于过滤和投影(projecting)集合,如books.{?#this.price<100}
  3. 构造Map,如#{'foo1':'bar1', 'foo2':'bar2'}

这里要说明一下:

OGNL容器中非root的访问要用”#“,并且访问的方式是用Map的键值对方式访问(有键找值)。

而root中属性访问则是直接按照对象名和属性名访问,一般root中的存储为

顺序为:object.propertyName返回propertyValue,如果直接输入propertyName则直接从valueStack的栈顶往下寻找第一个匹配propertyName的值,找到就不继续向下寻找。


0 0
原创粉丝点击