收藏 分享(赏)

OGNL及其表达式.ppt

上传人:精品资料 文档编号:10473701 上传时间:2019-11-21 格式:PPT 页数:41 大小:824KB
下载 相关 举报
OGNL及其表达式.ppt_第1页
第1页 / 共41页
OGNL及其表达式.ppt_第2页
第2页 / 共41页
OGNL及其表达式.ppt_第3页
第3页 / 共41页
OGNL及其表达式.ppt_第4页
第4页 / 共41页
OGNL及其表达式.ppt_第5页
第5页 / 共41页
点击查看更多>>
资源描述

1、OGNL及其表达式,目标,2,初步理解使用OGNL的优势, 简单的OGNL表达式 初步掌握索引访问 掌握对集合进行操作 OGNL的值栈特性; lambda表达式,一OGNL简介,3,1OGNL概念 1)对象图导航语言,获取和设置属性的Java对象。示例:在JSP页面中使用表达式语言获取user对象的username,EL表达式: $user.username,4,2)表达式 OGNL就是表达式!表达式总是有一个结果,也就是说表达式总是会求值出一个结果,这个结果可能是一个字符串(如名称、组织机构代码证号等),或者是一个布尔值(如是否是VIP客户等) 3)上下文(context) 上下文就是运行环

2、境,表达式求值的环境!而上下文的实质是一组带名称的对象集合,即名称-对象的集合。示例: Java代码name /获取姓名 环境?,表达式指要取谁的姓名呢?即获取在那个范围/环境的姓名 对于不同的环境/上下文,相同的表达式会有不同的结果!,5,4)OGNL表达式语言结构Struts 2中的OGNL Context实现者为ActionContext,说明: 1)当Struts2接受一个请求时,会迅速创建ActionContext,再创建ValueStack,action ,然后把action存放进ValueStack,所以action的实例变量可被OGNL访问。 2)访问上下文(Context)中

3、的对象需要使用#符号标注命名空间,如#application、#session。,6,5)根对象 OGNL会设定一个根对象(root对象),在Struts2中根对象就是ValueStack(值栈) 。如果要访问根对象(即ValueStack)中对象的属性,则可以省略#命名空间,直接访问该对象的属性即可; 根对象ValueStack的实现类为OgnlValueStack,该对象不只存放单个值,而是存一组对象。在OgnlValueStack类里有一个List类型的root变量,就是使用他存放一组对象; OgnlValueStack类包含两个重要的属性,一个root和一个context。其中root

4、本质上是一个ArrayList,而context是一个Map(更确切的说是一个OgnlContext对象)。 Struts2将OgnlValueStack的root变量赋值给了context中的root变量,在OgnlValueStack的root对象中,保存着调用Action的实例。,7,在root变量中处于第一位的对象叫栈顶对象。通常我们在OGNL表达式里直接写上属性的名称即可访问root变量里对象的属性,搜索顺序是从栈顶对象开始寻找,如果栈顶对象不存在该属性,就会从第二个对象寻找,如果没有找到就从第三个对象寻找,依次往下访问,直到找到为止。示例: 系统创建了Action实例后,该Acti

5、on实例已经被保存到ValueStack中,故无须书写#即可访问Action属性。示例:name OgnlValueStack与ActionContext的关系在Struts2中,OgnlValueStack是ActionContext的基础,在ActionContext中,有一个Map类型的属性context,而这个context就是OgnlValueStack的context对象,ActionContext中的getSession()、getApplication()等方法,底层都是通过context.get()来实现的。,6)ActionContext 、ValueStack 、Stac

6、k Context 关系,8,ActionContext 一次Action调用都会创建一个ActionContext 调用:ActionContext context= ActionContext.getContext() ValueStack 由OGNL框架实现 ,可以把它简单的看作一个栈(List) 。 Stack ContextStack Context(map):stack上下文,它包含一系列对象,包括request/session/attr/application map等。,作用: ActionContext是Action上下文,可以得到request, session ,appl

7、ication ValueStack是值栈 存放表单中的值 ,可以是一组值 Stack Context 栈上下文 也是用来存值的,9,2优势 1)支持对象方法调用,如xxx.doSomeSpecial(); 2)支持类静态的方法调用和值访问格式:类全名(包括包路径)方法名 | 值名示例:java.lang.Stringformat(foo %s, bar) 或者tutorial.MyConstantAPP_NAME; 3)支持赋值操作和表达式串联示例:price=100, discount=0.8, calculatePrice(),这个表达式会返回80;,10,4)访问OGNL上下文(OGN

8、L context)和ActionContext; 5)操作集合(Map、list)对象6)用来简化数据的访问操作,取代Java代码,提供更清晰的视图层实现示例:获取User对象的username属性JSP语句:User user=(User)request.getAttribute(“user“);String username=user.getUsername();OGNL语句:$user.username,二简单的OGNL表达式,11,1作用表达式的计算在当前对象的上下文中,一个链简单地使用链中先前链接的结果用作下一步计算的当前对象 2导航链的组成 1)属性名 2)方法调用 3)数组索引

9、,示例:导航链表达式 name.toCharArray()0.numericValue.toString() ? 计算: A. 获取根对象的name; B. 在String结果上调用toCharArray()方法 C. 从char数组结果中提取第一个字符? D. 从提取的字符对象上得到numericValue属性该字符被表示为Character对象,其中有getNumericValue()方法 E. 在Integer对象结果上调用toString()方法最终结果是通过toString()调用返回的字符串,12,3常量 1 )学符串常量以单引号或双引号码括起的字符串,单个字符的字符串常量需用双引

10、号。例如:说明:不能少单引号,否则会当成根对象的属性名2)数值常量用单引号括起来的字符3)数值常量、布尔常量、null常量,13,1)逗号“,”操作符 作用:用于分隔两个以上独立的表达式,整个表达式的值是最后一个子表达式的值例如:name, #manager.name2)花括号操作符作用:用于创建列表,其中元素之间使用逗号分隔。例如:三个元素的列表“李“,“张“,“王“3)in和not in操作符作用:用于判断一个值是否在集合中,例如:判断一个对象是否存在List集合中?muhahahaboo,#、%和$: “#”的用途,14,4) # 操作符作用:访问OGNL上下文和Action上下文A.

11、#相当于ActionContext.getContext(),ActionContext的属性: parameters:包含当前HTTP请求参数的Map,#parameters.id0作用相当于request.getParameter(“id“) request:包含当前HttpServletRequest的属性(attribute)的Map,#request.userName相当于request.getAttribute(“userName“) session:包含当前HttpSession的属性(attribute)的Map, #session.userName相当于session.get

12、Attribute(“userName“) application:包含当前应用的ServletContext的属性的Map,#application.userName相当于application.getAttribute(“userName“) attr:用于按page-request-session-application顺序访问其属性。#attr.userName相当于按顺序在以上三个范围(scope)内读取userName属性,直到找到为止 。 B. 用于过滤和投影(projecting)集合,如books.?#this.price100; C. 构造Map,如#foo1:bar1,

13、foo2:bar2。,15,5)“$” 操作符 用于在国际化资源文件中,引用OGNL表达式 示例: 在Struts 2框架的配置文件中引用OGNL表达式10100BAction-test校验:数字必须为$min为$max之间!,16,Struts 2配置文件中,引用OGNL表达式示例:/register.jsp?name=$name,17,6)“%”符号作用:在标志的属性为字符串类型时,计算OGNL表达式值。示例:在Ognl.jsp中加入以下代码:%的用途,18,5访问JavaBean的属性表达式例如:有两个JavaBean类,并有一个employee对象作为OGNL上下文的根对象?Publi

14、c class AddressPrivate String country;Private String city; Private String street;Public class EmployeePrivate String name;Private Adress address;,示例: 1)表达式:name java代码:employee.getName() 2)表达式:address.country java代码:employee.getAddress().getCountry(),19,6调用静态方法和静态字段格式:classmethod() /调用静态方法classfield

15、 /调用静态字段说明:class须给出完整的类名,若省略,默认值java.lang.Math 例如:max(5,3,8) /调用java.lang.Math的max方法,20,7调用构造方法作用:OGNL支持对构造方法的调用,从而创建一个新的对象 例如:new java.util.ArrayList() /须用完整的限定类名,三索引访问,21,1数组和列表索引例如:数组:array0,list0 /在到第1元素表达式:wang,zhang,li1 /得到结果是第2元素,即list.get(1),22,2JavaBean的索引属性格式:public PropertyType getPropert

16、yName()public void setPropertyName(PropertyType values)public PropertyType getPropertyName(int index)public void setPropertyName(int index,propertyType value)作用:获取和设置数组时使用的属性说明:需提供两对setter/getter方法,一组用于数组,一组用于数组中的元素的索引,但非元素的值,仅指向该元素。,例如:在某JavaBean中,有一个索引属性interestPublic String interest;public String

17、 getInterest() return interest;public void setInterest(String interest) this.interest=interest;public String getInterest(int i) return interesti;public void setInterest(int i,string newInterest)interesti=newInterest; 表达式:interest(2) /作用:调用getInterest(2)方法 表达式:interest(2, “Hello”) /作用:设值时调用setInteres

18、t(2, “Hello“),四对集合进行操作,23,1创建列表List 语法: e1,e2,e3 示例:结果:生成了一HTML Select对象,可选的内容为: name1,name2,name3,默认值为:name2。,示例:创建带有3个元素的List对象:name1, name2,name3 相当Java代码:List list =new ArrayList(3);list.add(“name1“);list.add(“name2“);list.add(“name3“);return list; 使用索引:list0,name1,name2,name31,24,2创建数组例如:new in

19、t1,2,3New int5 /数组中的元素初始化为0索引:new int1,2,31注意:数组特殊的属性length,OGNL中可访问:array.length,25,3创建Map对象集合 语法:#key1:value1, key2:value2, .示例:结果:代码生成了一个HTML Select对象,有两个元素,foo名字表示的内容为:foovalue,bar名字表示的内容为:barvalue。,示例:创建带有2个元素的Map对象:#foo:foovalue, bar:barvalue相当Java代码:Map map=new HashMap(2);map.put(“foo“,“foova

20、lue“)map.put(“bar“,“barvalue“)return map; 索引:map0,map.first,map“foo“#“foo“:“oovalue“, “bar“:“barvalue“ foo 或.third指定类型: #java.util.LinkedHashMap“foo“:“oovalue“, “bar“:“barvalue“ LinkedHashMap作用:以确保插入元素的顺序能够被保存,26,4创建set集合对象book1的价格是: 注意:Set由于是无序的,所以不能使用下标获取数据即不能使用#books0,27,采用OGNL表达式创建List/Map集合对象,北

21、京传智播客教育 ,如果需要一个集合元素的时候(例如List对象或者Map对象),可以使用OGNL中同集合相关的表达式。 使用如下代码直接生成一个List对象:生成一个Map对象:=Set标签用于将某个值放入指定范围。 scope:指定变量被放置的范围,该属性可以接受application、session、request、 page或action。如果没有设置该属性,则默认放置在OGNL Context中。 value:赋给变量的值.如果没有设置该属性,则将ValueStack栈顶的值赋给变量。,28,5集合的伪属性 集合的常用方法并不符合JavaBean对其属性的访问,29,五投影、选择和la

22、mbda表达式,30,1投影(projection)作用:在一个集合中对每一个元素调用相同的方法或抽取相同的属性,形成新的集合例如:假设employess是一个包含了employee对象的列表其表达式:#employess.name,31,2选择(selection)/过滤作用:用表达式从集合中选择某些元素,并将结果保存到新的集合中。例如:若employess是一个包含了employee对象的列表,其表达式:#employess.?#this.salary3000 /返回大于3000的雇员列表#employess.?#this.salary30000 /返回大于3000的雇员中第1个特殊符号:

23、? 所有满足选择逻辑的对象 - 第一个满足选择逻辑的对象$ - 最后一个满足选择逻辑的对象,32,3Lambda表达式作用:OGNL支持Lambda表达式语法,使用这些语法可以建立简单的lambda函数例如:Fibonacciif n=0 return 0;elseif n=1 return 1;else return fib(n-2)+fib(n-1);fib(0) = 0fib(1) = 1fib(11) = 89,OGNL的Lambda表达式:Lambda表达式必须放在方括号内部,#this表示表达式的参数。 例如:定义了一个Lambda表达式,#fib(11) 调用了表达式,输出为:8

24、9,其代码:,六OGNL的值栈特性,33,值栈(ValueStack) OGNL上下文中的根对象可以直接访问,而引用上下文中的其他对象则需要使用“#”来标记 值栈中的任何对象都可以直接访问,而不需要使用 “#”,示例:值栈中有对象:student和employee,两个对象都有name属性,student有学号属性numberemployee有薪水属性salaryemployee先入栈,student后入栈。 引用:表达式name访问的就是student 的name属性(因student对象位于栈顶)。表达式salary访问的就是employee的salary属性。,结论:访问值栈中的对象属性

25、或方法,无须指明对象,也不用“#”,就好像值栈中的对象都是OGNL上下文中的根对象一样。 查找顺序:查找栈内的所有对象(从栈顶到栈底),直接找到一个具有你所查找的属性的对象,34,.N语法提问:访问employee的name属性,应该如何写表达式呢?格式:N.xxx (N是从0开始的整数) 作用:使用N.xxx这样的语法来指定从哪一个位置开始向下查找对象的属性,表达式1.name访问的就是employee对象的name属性。 注意:在使用N.xxx语法时,要注意位置序号的含义,它并不是表示“获取栈中索引为N的对象”,而是截取从位置N开始的部分栈,35,示例: 栈中有三个对象:Object0,O

26、bject1和Object2都有name属性 表达式name访问的是Object0的name属性 1.name访问的是Object2的name属性,因为1是一个包含Object1和Object2的部分栈,而且只有Object2有name属性。,36,.top关键字top用于获取栈顶的对象,结合N.xxx语法,就可获取栈中任意位置的对象。 例如:0.top获取Object0(等同于top),1.top获取Object12.top获取Object2,2.top.name访问Object2中的name属性,37,.访问静态成员除了使用标准的OGNL表达式访问静态字段和静态方法外,Struts2还允许

27、你不指定完整的类名,而是通过“vs”前缀来调用保存在栈中的静态字段和静态方法。vsFOO_PROPERTYvssomeMethod()vs1someMethod(),说明: vs表示ValueStack,如果只有vs,那么将使用栈顶对象的类; 若在vs后面跟上一个数字,那么将使用栈中指定位置处的对象类。,38,. 值栈中的Action实例Struts2框架总是把Action实例放在栈顶。因为Action在值栈中,而值栈又是OGNL中的根,所以引用Action的属性可以省略“#”标记,这也是为什么我们在结果页面中可以直接访问Action的属性的原因。,.Struts2中的命名对象,39,总结,4

28、0,通过本次的讲解分析,让大家步理解使用OGNL的优势, 简单的OGNL表达式,初步掌握索引访问,对集合进行操作,OGNL的值栈特性,着重掌握对集合进行操作,投影、选择和lambda表达式。 作业 课后进行进一步较深入的复习OGNL的相关知识?,41,采用OGNL表达式创建List/Map集合对象,北京传智播客教育 ,如果需要一个集合元素的时候(例如List对象或者Map对象),可以使用OGNL中同集合相关的表达式。 使用如下代码直接生成一个List对象:生成一个Map对象:=Set标签用于将某个值放入指定范围。 scope:指定变量被放置的范围,该属性可以接受application、session、request、 page或action。如果没有设置该属性,则默认放置在OGNL Context中。 value:赋给变量的值.如果没有设置该属性,则将ValueStack栈顶的值赋给变量。,

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 企业管理 > 管理学资料

本站链接:文库   一言   我酷   合作


客服QQ:2549714901微博号:道客多多官方知乎号:道客多多

经营许可证编号: 粤ICP备2021046453号世界地图

道客多多©版权所有2020-2025营业执照举报