1、OGNL的全称是
Object Graph Navigation Language(对象图导航语言),它是一种强大的表达式语言
2、它具有下面几大优势:
①:支持对象方法调用,如xxx.doSomeSpecial();
②:支持类静态的方法调用和值访问,表达式的格式为@[类全名(包括包路径)] @[方法名|值名],例如:
@java.lang.String@format('foo %s','bar')或
@tutorial.MyConstant@APP_NAME;
③:支持赋值操作和表达式串联,如price=100,discount=0.8,calculatePrice().这个表达会返回80.
④:访问OGNL上下文 (OGNL context) 和 ActionContext;
⑤:操作集合对象。
3、用法:主要有三种用途:
3-1: 访问OGNL上下文和Action上下文,#相当于:ActionContext.getContext();
下列有几个ActionContext中有用的属性:
名称 | 作用 | 例子 |
---|---|---|
parameters | 包含当前HTTP请求从参数的Map | #parameters.id[0] 作用相当于.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属性,直到找到为止 |
3-2:
用于过滤和投影(projecting)集合,如books.{?#this.price<100};
3-3:
构造Map,如#{‘foo1’:‘bar1’, ‘foo2’:‘bar2’}。
4、gnlContext(ongl上下文)其实就是Map :
4-1: OgnlContext=根对象(1)+非根对象(N)
非根对象要通过"#key"访问,根对象可以省略"#key"
注1:context:英文原意上下文,环境/容器
5、ValueStack:
5-1 值栈:
先进后出的数据结构,弹夹 push/pop
5-2 为什么要使用ValueStack作为根对象:
放到值栈中的对象都可视为根对象
6、ActionContext:
6-1:
ActionContext ac = ActionContext.getContext();//保证同一请求中只创建一个上下文
6.2 向ValueStack压栈
push(XxxAction)//helloAction
push(ModelDirver.getModel())//model不为null user
6.3 Map<String,String[]> map = request.getParamterMap(); 压action代码详解
//参数名==OGNL表达式
另外附上一张结构图:
7、 struts2中传递数据
可以使用作用域,但更多的是利用ValueStack或ActionContext
8、% 的用途(OGNL):
8-1:“%”符号的用途是在标志的属性为字符串类型时,计算OGNL表达式的值。例如在Ognl.jsp中加入以下代码:
<hr />
<h3>%的用途</h3>
<p><s:url value="#foobar['foo1']" /></p>
<p><s:url value="%{#foobar['foo1']}" /></p>
9、$的用途(OGNL):
9-1:用于在国际化资源文件中,引用OGNL表达式,
9-2:在Struts 2配置文件中,引用OGNL表达式,如 :
<action name="AddPhoto" class="addPhoto">
<interceptor-ref name="fileUploadStack" />
<result type="redirect">ListPhotos.action?albumId=${albumId}</result>
</action>