struts2中的Ognl

作者:青岛澄润国际贸易有限公司 来源:www.usabcc.com 发布时间:2017-09-03 12:50:54
struts2中的Ognl

OGNL表达式是(Object-Graph Navigation Language)是对象图形化导航语言。OGNL是一个开源的项目,struts2中默认使用OGNL表达式语言来显示数据。与serlvet中的el表达式的作用是一样的。OGNL表达式有下面以下特点:

支持对象方法调用,例如:objName.methodName();支持类静态的方法调用和值访问,表达式的格式为 @[类全名(包括包路经)]@[方法名 | 值名]例如:@java.lang.String@format('foo%s','bar')@tutorial.MyConstant@APP_NAME; 支持赋值操作和表达式串联,例如: price=100, discount=0.8, calculatePrice(),这个表达式会返回80; 访问OGNL上下文(OGNL context)和ActionContext 操作集合对象 类图

\


ValueStack ValueStack是一个接口,在struts2中使用OGNL表达式实际上是使用实现了ValueStack接口的类OgnlValueStack,这个类是OgnlValueStack的基础。ValueStack贯穿整个action的生命周期。每一个action实例都拥有一个ValueStack对象。其中保存了当前action对象和其他相关对象。 Struts2把ValueStack对象保存中名为struts.valueStack的request域中。 ValueStack内存图

\


ValueStack的组织结构

\



从图上可以看出OgnlValueStack和我们有关的内容有两部分:即OgnlContext和CompoundRoot。所以把这两部分搞清楚很重要。


总图

\


vcD4KPHA+y7XD96O6PC9wPgo8cD48L3A+CgrJz828ysdvZ25szerV+7XEyv2+3b3hubnNvKOsv8nS1Mflzvq1w7+0s/bK/b7dtcTX6bPJoaNDb250ZXh01tC1xF9yb290us1WYWx1ZVN0YWNr1tC1xHJvb3QottTP89W7KcDvtcTK/b7dveG5ubrNJiMyMDU0MDvKx9K70fm1xKGj1eK+zdLizrbXxc7Sw8fWu9Do0qqy2df3T2dubENvbnRleHS+zb/J0tTN6rPJttTK/b7dtcS05rrNyKG1xLLZ1/eho1ZhbHVlU3RhY2vE2rK/09DBvbj2wt+8rbXE1+mzybK/t9ajugoKIE9iamVjdFN0YWNrCgpTdHJ1dHO74bDRtq/X97rNz+C52LXEttTP89G5yOu1vU9iamVjdFN0YWNr1tChowpDb250ZXh0TWFwCgpTdHJ1dHO74bDR0rvQqdOzyeS52M+10bnI67W9Q29udGV4dE1hcNbQCgoKPHA+PC9wPgpPR05MIENvbnRleHQ8YnI+Cgo8aW1nIHNyYz0="http://www.2cto.com/uploadfile/Collfiles/20140409/20140409090111183.jpg" alt="\">
上图为OGNL Context的结构图当struts2接受一个请求时,会迅速创建ActionContext,ValueStack,action。然后把action压入到值栈中。所以action的实例变量可以被ognl访问。所以利用ognl表达式可以访问action。 ActionContext

\


从上面的代码中可以看出来,struts2中的ActionContext的作用是提供了对ognl数

据的操作。并且可以通过ActionContext获取到经过struts2封装了的session等参数。

ServletActionContext

\


可以通过ServletActionContext得到servlet中的一些类,比如HttpServletRequest,ServletContext等可以通过ServletActionContext返回ActionContext Ognl表达式

1.#号用法
访问OGNL上下文和action上下文,#相当于ActionContext.getContext();如果访问的是map中的值而不是对象栈中的值,由于map中的数据不是根对象,所以在访问时需要添加#前缀。

名称

作用

例子

parameters

包含当前HTTP请求的Map

#parameters.id[0]=request.getParameter(“id”)

request

包含当前HttpServletRequest属性的Map

#request.username=request.getAttribute(“username”);

session

包含当前HttpSession属性的Map

#session.username=session.getAttribute(“username”);

application

包含当前ServletContext属性的Map

#application.username=application.getAttribute(“username”);

attr

用于按照request>session>application顺序访问其属性

#attr.username相当于按照顺序在以上三个范围内读取username的属性,直到找到为止。


注:也可以写为#request[‘username’] #sesssion[‘username’] #application[‘username’]

主要步骤:

在action中

\


在页面中


2.用法2

OGNL会设定一个对象(root对象),在struts2中根对象就是CompoundRoot,或者为OgnlValueStack中的root,通常被叫做ValueStack(值栈或者对象栈),如果要访问根对象的属性,则可以省略去#,直接访问对象的属性即可。

在action中


在页面中

3.用法3(深入理解对象栈)

有三个类:Person.java,Student.java,OgnlAction.java

Person类 Student类 OgnlAction类 把Person类和Student类创建出对象,然后放入到对象栈中,代码为:

\


从以前学过的OGNLContext结构可以看出,对象栈中的分布如图所示:

\

但是大家注意一个现象:在student对象中有comment属性,在person对象中

也有comment属性,在OgnlAction中还有comment属性,如果页面输出

Comment属性应该选择哪种呢?

结论:

对于对象栈中存放的属性,struts2会从最顶部开始寻找,如果找到则赋值, 如果找不到,则会依次往下寻找,直到找到为止。所以应该输出的是student

对象的comment的值。

4.用法4(构造map)

还可以利用ognl表达式构造Map,如#{‘foo1’:’bar1’,’foo2’:’bar2’};这种用法经常用

在给radio,checkbox等标签赋值上。

1、 在页面上可以这样输出:


2、 也可以这样使用:



5.用法5(%)

“%”符号的用途是在标签的属性值给理解为字符串类型时,执行环境%{}中添加的是OGNL表达式。

{}中用OGNL表达式



6.用法6($)

$主要有两个用途:

用于在国际化资源文件中引用OGNL表达式

在struts2的配置文件中引用OGNL表达式

在action中:


在配置文件中:


企业建站2800元起,携手武汉肥猫科技,做一个有见地的颜值派!更多优惠请戳:孝感SEO http://xiaogan.raoyu.net

  • 上一篇:PHP二维数组去重的方法(保留各个键值的同时去除重复
  • 下一篇:最后一页
  •