《表达式语言OGNL》PPT课件.ppt
《《表达式语言OGNL》PPT课件.ppt》由会员分享,可在线阅读,更多相关《《表达式语言OGNL》PPT课件.ppt(38页珍藏版)》请在装配图网上搜索。
表达式语言OGNL,课程结构,第四章:表达式语言OGNL,目标:本章旨在向学员介绍:1)OGNL表达式的基本语法2)理解值栈3)会访问值栈以及上下文中的内容,时间:3学时教学方法:授课+练习,第四章:表达式语言OGNL,本章内容4.1OGNL简介4.2OGNL基础4.3OGNL基本语法,4.1.1表达式语言,EL(ExpressionLanguage)的作用避免(MyType)request.getAttribute()和myBean.getMyProperty()之类的语句,使页面更简洁;支持运算符(如+-*/),比普通的标志具有更高的自由度和更强的功能;简单明了地表达代码逻辑,使用代码更可读与便于维护。,4.1.2Struts2支持的表达式语言,Struts2支持以下几种表达式语言OGNL(Object-GraphNavigationLanguage),可以方便地操作对象属性的开源表达式语言;JSTL(JSPStandardTagLibrary),JSP2.0集成的标准的表达式语言;Groovy,基于Java平台的动态语言,它具有时下比较流行的动态语言(如Python、Ruby和Smarttalk等)的一些起特性;Velocity,严格来说不是表达式语言,它是一种基于Java的模板匹配引擎,具说其性能要比JSP好。Struts2默认的表达式语言是OGNL是一种表达式语言,通过简单一致的表达式语法,可以存取对象的任意属性。,4.1.3OGNL的优势,支持对象方法调用,如xxx.doSomeSpecial()支持类静态的方法调用和值访问支持赋值操作和表达式串联,如price=100,discount=0.8,calculatePrice(),这个表达式会返回80访问OGNL上下文(OGNLcontext)和ActionContext操作集合对象,4.1.4OGNL,OGNL是Object-GraphNavigationLanguage的缩写,它是一种功能强大的表达式语言(ExpressionLanguage,简称为EL),通过它简单一致的表达式语法,可以存取对象的任意属性,调用对象的方法,遍历整个对象的结构图,实现字段类型转化等功能。它使用相同的表达式去存取对象的属性。现在的Struts2.x中使用OGNL取代原来的EL来做界面数据绑定,所谓界面数据绑定,也就是把界面元素和对象层某个类的某个属性绑定在一起,修改和显示自动同步。和struts1.x的formbean相比,这样做的好处非常明显:在Struts2.x中不需要为每个页面专门写formbean,可以直接利用对象层的对象。如果我们把表达式看做是一个带有语义的字符串,那么OGNL无疑成为了这个语义字符串与Java对象之间沟通的桥梁。,4.1.5使用OGNL的原因,OGNL称为对象图导航语言。所谓对象图,即以任意一个对象为根,通过OGNL可以访问与这个对象关联的其它对象。示例:,publicclassUserprivateStringusername;privateGroupgroup;publicStringgetUsername()returnusername;publicvoidsetUsername(Stringusername)this.username=username;publicGroupgetGroup()returngroup;publicvoidsetGroup(Groupgroup)this.group=group;,4.1.5使用OGNL的原因,publicclassGroupprivateStringname;privateOrganizationorg;publicStringgetName()returnname;publicvoidsetName(Stringname)this.name=name;publicOrganizationgetOrg()returnorg;publicvoidsetOrg(Organizationorg)this.org=org;,publicclassOrganizationprivateStringorgId;publicStringgetOrgId()returnorgId;publicvoidsetOrgId(StringorgId)this.orgId=orgId;,4.1.5使用OGNL的原因,上面三个类,描述了通过一个User对象,可以导航到Group对象,进而导航到Organization对象,以User对象为根,一个对象图如下所示:在真实的环境下,这个对象图可能会极其复杂,但是通过基本的getters方法,都应该能够访问到某个对象的其它关联对象。,User(root)-username-group-name-org-orgId,4.1.5使用OGNL的原因,下述代码将创建一个User对象,及其相关的一系列对象:如果通过JAVA代码来进行导航(依赖于getters方法),导航到Organization的orgId属性,如下所示:user.getGroup().getOrg().getOrgId();导航的目的,是为了获取某个对象的值或设置某个对象的值或调用某个对象的方法!OGNL表达式语言的真正目的,是为了在那些不能写JAVA代码的地方执行JAVA代码,或者是为了更方便地执行JAVA代码如果使用OGNL表达式来进行导航,导航到Organization的orgId属性,如下所示:user.group.org.orgid可见OGNL表达式最大的优点就是:“简单”和“直观”。,Useruser=newUser();Groupg=newGroup();Organizationo=newOrganization();o.setOrgId(ORGID);g.setOrg(o);user.setGroup(g);,第四章:表达式语言OGNL,本章内容4.1OGNL简介4.2OGNL基础4.3OGNL基本语法,4.2.1OGNL上下文,Struts2对OGNL作了进一步增强。OGNL表达式的计算都是围绕OGNL上下文来进行的,OGNL上下文实际上就是一个Map对象,由ognl.OgnlContext类(实现了java.util.Map接口)来表示。Struts2把OGNLContext设置为ActionContext,即在Struts2中OGNL上下文(Context)的实现为ActionContext。Struts2把ValueStack作为OGNL的根对象。,4.2.1OGNL上下文,Struts2中的OGNLContext实现者为ActionContext,它结构示意图如下:当Struts2接受一个请求时,会迅速创建ActionContext,ValueStack,action。然后把action存放进ValueStack,所以action的实例变量可以被OGNL访问。,4.2.2值栈,在struts2中将OGNL上下文设置为struts2中的ActionContext,并将值栈作为OGNL的根对象。值栈类似于正常的栈,符合后进先出的栈的特点,你可以在值栈中放入、删除和查询对象,值栈是Struts2的核心。OGNL设定的根对象(root对象),在Struts2中就是ValueStack(值栈)。如果要访问根对象(即ValueStack)中对象的属性,则可以省略#命名空间,直接访问该对象的属性即可。,4.2.2值栈,在struts2中,根对象ValueStack的实现类为OgnlValueStack,该对象不是我们想像的只存放单个值,而是存放一组对象。在OgnlValueStack类里有一个List类型的root变量,就是使用他存放一组对象|-request|-applicationcontext-|-OgnlValueStackroot变量action,OgnlUtil,.|-session|-attr|-parameters在root变量中处于第一位的对象叫栈顶对象。通常我们在OGNL表达式里直接写上属性的名称即可访问root变量里对象的属性,搜索顺序是从栈顶对象开始寻找,如果栈顶对象不存在该属性,就会从第二个对象寻找,如果没有找到就从第三个对象寻找,依次往下访问,直到找到为止。注意:Struts2中,OGNL表达式需要配合Struts标签才可以使用。如:,4.2.3OGNL的访问,由于ValueStack(值栈)是Struts2中OGNL的根对象,如果用户需要访问值栈中的对象,在JSP页面可以直接通过下面的EL表达式访问ValueStack(值栈)中对象的属性:$foo/获得值栈中某个对象的foo属性如果访问其他Context中的对象,由于他们不是根对象,所以在访问时,需要添加#前缀。application对象:用于访问ServletContext,例如#application.userName或者#applicationuserName,相当于调用ServletContext的getAttribute(username)。session对象:用来访问HttpSession,例如#session.userName或者#sessionuserName,相当于调用session.getAttribute(userName)。request对象:用来访问HttpServletRequest属性(attribute)的Map,例如#request.userName或者#requestuserName,相当于调用request.getAttribute(userName)。parameters对象:用于访问HTTP的请求参数,例如#parameters.userName或者#parametersuserName,相当于调用request.getParameter(username)。attr对象:按page-request-session-application顺序访问其属性。,第四章:表达式语言OGNL,本章内容4.1OGNL简介4.2OGNL基础4.3OGNL基本语法,4.3OGNL基本语法,基本的OGNL语法是十分简单的,当然OGNL支持丰富的表达式,一般情况下,不用担心OGNL的复杂性。例如有一个man对象,该对象有一个name属性,那么使用OGNL来获得该name属性可以使用如下表达式:man.nameOGNL表达式的基础单元称为导航链,简称为链。一个最简单的链由如下部分组成。属性名称方法调用数组元素说明:OGNL表达式基于OGNL上下文中的当前对象,一个“链”将使用上一个“链”的处理结果,开发者可以任意扩展该链的长度,OGNL没有限制。,4.3.1常量的声明,字符串常量(stringliteral)以单引号或双引号括起来的字符串,例如:HelloWorld和”HelloWorld”.在JAVA中,不能用单引号来界定字符串常量,而在OGNL中是可以的。不过特别要注意的是:如果是单个字符的字符串常量,则必须使用双引号来界定,例如:“S”。OGNL的字符串也支持转义序列,例如:要在JSP页面中输出”Yousaid,”HelloWorld”.”,那么可以使用标签,如下:注意:不要忽略了用于界定整个常量字符串的单引号。如果没有写单引号,那么整个字符串将不会被看成是字符串常量,而是被当作根对象的属性名,从而导致错误。字符常量(Characterliteral)以单引号括起来的字符。例如,H。注意,不能使用双引号,否则将被看成是字符串常量。数值常量(Numericliteral)除了Java中的int,long,float,double外,OGNL还让你用“B”或“b”后缀指定BigDecimal常量,用“H”或”h”后缀指定BigInteger常量,例如,123(int常量),123l(long常量),123.35f(float常量),123b(BigDecimal常量),123h(BigInteger常量)。布尔常量(Booleanliteral)true和falsenull常量(nullliteral).,4.3.2OGNL操作符,OGNL支持所有的Java操作符(+、-、*、/、+、-、=、!=、=等)与Java类似,并提供了一些特有的操作符。与Java相同的操作符不再介绍,下面看一下OGNL特有的操作符。逗号(,)或序列操作符OGNL的逗号操作符是从C语言中借鉴而来的。逗号被用于分隔两个或多个独立的表达式,整个表达式是最后一个表达式的值。如:team2.person.name,team1.teamname第一个表达式team2.person.name和第二个表达式team1.teamname,整个表达式的值是第二个表达式的值。花括号()操作符花括号()操作符用于创建列表。使用花括号将元素括起来,元素之间使用逗号分隔,例如:“zhangsan”,“lishi”,“wangwu”1此表达式创建了带有三个元素的列表,并且访问其中第二个元素。in和notin操作符in和notin用于判断一个值是否属于一个集合中。如:teamnameinteam1,team2,4.3.3OGNL表达式,访问属性访问方法访问静态属性和方法访问构造方法访问数组访问集合投影、选择(?$)Lambda:,4.3.3访问属性,访问属性:访问对象属性(get和set):访问对象属性(get和set):,4.3.4访问方法,访问类对象的方法:访问action的方法:,4.3.5访问静态属性和方法,OGNL支持调用类中的静态方法和静态字段,可以使用如下语法格式:其中class必顺给出完整的类名。例如:java.lang.StringvalueOf(5)。如果省略class,那么默认使用类是java.lang.Math,classmethod(args)/调用静态方法classfield/访问静态字段(public权限),访问静态方法:访问静态属性:访问Math静态方法:,4.3.6访问构造方法,访问构造方法:,4.3.7访问集合和数组,OGNL的集合操作如果需要一个集合元素的时候(例如List对象或者Map对象),可以使用OGNL中同集合相关的表达式。可以使用如下代码直接生成一个List对象:该OGNL表达式中,直接生成了一个List对象,该List对象中包含3个元素:e1、e2和e3。如果需要更多的元素,可以按照这样的格式定义多个元素,多个元素之间使用逗号隔开。如下代码可以直接生成一个Map对象:Map类型的集合对象,使用key-value格式定义,每个key-value元素使用冒号标识,多个元素之间使用逗号隔开。对于集合类型,OGNL表达式可以使用in和notin两个元素符号。其中,in表达式用来判断某个元素是否在指定的集合对象中;notin判断某个元素是否不在指定的集合对象中,如代码所示。,e1,e2,e3,e1,e2,e3,#key1:value1,key2:value2,4.3.7访问集合和数组,访问List:访问List中某个元素:访问List中元素某个属性的集合:访问List中元素某个属性的集合中的特定值:|访问Set:访问Set中某个元素:访问Map:访问Map中某个元素:|访问Map中所有的key:访问Map中所有的value:访问容器的大小:,4.3.7访问集合和数组,集合的伪属性OGNL能够引用集合的一些特殊的属性,这些属性并不是JavaBeans模式,例如size(),length()等等.当表达式引用这些属性时,OGNL会调用相应的方法,这就是伪属性.,4.3.8投影(Projection),OGNL提供了一种简单的方式在一个集合中对每一个元素调用相同的方法,或者抽取相同的属性,并将结果保存为一个新的集合,称之为投影。假如employees是一个包含了employee对象的列表,那么:在投影期间,使用#this变量来引用迭代中的当前元素。OGNL提供了一种简单的方式来使用表达式从集合中选择某些元素,并将结果保存到新的集合中,称为选择。,#employees.name/返回所有雇员的名字的列表,objects.#thisinstanceofString?#this:#this.toString(),#employees.?#this.salary3000将返回薪水大于3000的所有雇员的列表。#employees.#this.salary3000将返回第一个薪水大于3000的雇员的列表。#employees.$#this.salary3000将返回最后一个薪水大于3000的雇员的列表。,4.3.8投影(Projection),4.3.9OGNL表达式符号,struts2OGNL中的#、%和$符号用法说明#符号的用途一般有三种访问非根对象属性,例如示例中的#session.msg表达式,#相当于ActionContext.getContext()用于过滤和投影(projecting)集合,如persons.?#this.age30用来构造Map,例如:#0:男,1:女%符号%符号的用途是在标志的属性为字符串类型时,计算OGNL表达式的值。如下面的代码所示:$符号主要在配置文件(包括国际化文件)中,如在Struts.xml的结果类型上。/test.jsp?id=$userid,不使用:使用:,4.3.10N语法,所谓N语法,指从位置N开始取值。即使用N.xxx(N是从0开始的整数)这样的语法来指定从哪一个位置开始向下查找对象的属性。表达式1.name访问的就是employee对象的name属性。,4.3.10N语法,在使用N.xxx语法时,要注意位置序号的含义,它并不是表示“获取栈中索引为N的对象”,而是截取从位置N开始的部分栈。假设栈中有三个对象:Object0,Object1和Object2都有name属性,如下图所示:表达式name访问的是Object0的name属性,在,而1.name访问的则是Object2的name属性,因为1是一个包含了Object1和Object2的部分栈,而且只有Object2有name属性。,4.3.11top关键字,top用于获取栈顶的对象.对于上张PPT所示的栈,表达式top获取的就是Object0这个对象本身,结合N.xxx语法,我们就可以获取栈中任意位置的对象。例如:0.top获取Object0(等同于top),1.top获取Object12.top获取Object2,2.top.name访问Object2中的name属性,本章小结,掌握OGNL表达式的基本语法理解值栈和OGNL上下文,谢谢,- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 表达式语言OGNL 表达式 语言 OGNL PPT 课件
装配图网所有资源均是用户自行上传分享,仅供网友学习交流,未经上传用户书面授权,请勿作他用。
关于本文