




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、OGNLOGNL及其表达式及其表达式 目标2初步理解使用OGNL的优势, 简单的OGNL表达式初步掌握索引访问掌握对集合进行操作OGNL的值栈特性;lambda表达式 一OGNL简介31 1OGNLOGNL概念概念1 1)对象图导航语言)对象图导航语言,获取和设置属性的Java对象。 示例:示例:在JSP页面中使用表达式语言获取user对象的username EL表达式:表达式: $user.username4 2 2)表达式)表达式 OGNLOGNL就是表达式!表达式总是有一个结果,也就是就是表达式!表达式总是有一个结果,也就是说表达式总是会求值出一个结果,这个结果可能是一说表达式总是会求值
2、出一个结果,这个结果可能是一个字符串(如名称、组织机构代码证号等),或者是个字符串(如名称、组织机构代码证号等),或者是一个布尔值(如是否是一个布尔值(如是否是VIPVIP客户等客户等) 3 3)上下文)上下文(context) 上下文就是运行环境,表达式求值的环境!而上下文的实质是一组带名称的对象集合,即名称名称- -对象的对象的集合集合。 示例:示例: Java代码 name /获取姓名 环境?环境?表达式指要取谁的姓名呢?即获取在那个范围/环境的姓名对于不同的环境/上下文,相同的表达式会有不同的结果! 54)OGNL表达式语言结构表达式语言结构 Struts 2中的OGNL Contex
3、t实现者为ActionContextrequestValueStack(值栈,它是根对象)OGNL Contextparameterssessionapplicationattr说明:说明:1)当Struts2接受一个请求时,会迅速创建ActionContext,再创建ValueStack,action ,然后把action存放进ValueStack,所以action的实例变量可被OGNL访问。2)访问上下文(Context)中的对象需要使用#符号标注命名空间,如#application、#session。65 5)根对象)根对象 OGNL会设定一个根对象(root对象),在Struts2中根
4、对象就是ValueStack(值栈) 。如果要访问根对象(即ValueStack)中对象的属性,则可以省略#命名空间,直接访问该对象的属性即可;根对象ValueStack的实现类为OgnlValueStack,该对象不只存放单个值,而是存一组对象。在OgnlValueStack类里有一个List类型的root变量,就是使用他存放一组对象;OgnlValueStack类包含两个重要的属性,一个root和一个context。其中root本质上是一个ArrayList,而context是一个Map(更确切的说是一个OgnlContext对象)。Struts2将OgnlValueStack的root变
5、量赋值给了context中的root变量,在OgnlValueStack的root对象中,保存着调用Action的实例。 7在root变量中处于第一位的对象叫栈顶对象。通常我们在OGNL表达式里直接写上属性的名称即可访问root变量里对象的属性,搜索顺序是从栈顶对象开始寻找,如果栈顶对象不存在该属性,就会从第二个对象寻找,如果没有找到就从第三个对象寻找,依次往下访问,直到找到为止。 示例:示例: 系统创建了Action实例后,该Action实例已经被保存到ValueStack中,故无须书写#即可访问Action属性。 示例:示例:nameOgnlValueStack与ActionContext
6、的关系 在Struts2中,OgnlValueStack是ActionContext的基础,在ActionContext中,有一个Map类型的属性context,而这个context就是OgnlValueStack的context对象,ActionContext中的getSession()、getApplication()等方法,底层都是通过context.get()来实现的。6)ActionContext 、ValueStack 、Stack Context 关系8ActionContext ActionContext 一次Action调用都会创建一个ActionContext 调用:Act
7、ionContext context= ActionContext.getContext() ValueStack 由OGNL框架实现 ,可以把它简单的看作一个栈(List) 。Stack Context Stack Context(map):stack上下文,它包含一系列对象,包括request/session/attr/application map等。 作用:作用:ActionContext是Action上下文,可以得到request, session ,application ValueStack是值栈 存放表单中的值 ,可以是一组值Stack Context 栈上下文 也是用来存值的
8、 92 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上下文(OGNL context)和ActionContext; 5)操作集合(Map、list)对象 6)用来简
9、化数据的访问操作,取代Java代码,提供更清晰的视图层实现 示例:获取User对象的username属性 JSP语句:User user=(User)request.getAttribute(user); String username=user.getUsername(); OGNL语句:$user.username二简单的OGNL表达式111 1作用作用 表达式的计算在当前对象的上下文中,一个链简单地使用链中先前链接的结果用作下一步计算的当前对象2 2导航链的组成导航链的组成1)属性名2)方法调用3)数组索引示例:示例:导航链表达式 name.toCharArray()0.numericV
10、alue.toString() ?计算:计算:A. 获取根对象的name;B. 在String结果上调用toCharArray()方法C. 从char数组结果中提取第一个字符?D. 从提取的字符对象上得到numericValue属性 该字符被表示为Character对象,其中有getNumericValue()方法E. 在Integer对象结果上调用toString()方法 最终结果是通过toString()调用返回的字符串12 3 3常量常量1 1 )学符串常量)学符串常量 以单引号或双引号码括起的字符串,单个字符的字符串常量需用双引号。 例如:例如: 说明:说明:不能少单引号,否则会当成根
11、对象的属性名 2 2)数值常量)数值常量 用单引号括起来的字符 3 3)数值常量、布尔常量、)数值常量、布尔常量、nullnull常量常量 13 1 1)逗号)逗号“,”操作符操作符 作用:作用:用于分隔两个以上独立的表达式,整个表达式的值是最后一个子表达式的值 例如例如:name, , # 2 2)花括号)花括号操作符操作符 作用:作用:用于创建列表,其中元素之间使用逗号分隔。 例如:例如:三个元素的列表李,张,王 3 3)inin和和not innot in操作符操作符 作用:作用:用于判断一个值是否在集合中例如:判断一个对象是否存在例如:判断一个对象是否存在Lis
12、t集合中集合中? muhahaha boo #、%和$: “#”的用途 144 4) # # 操作符操作符 作用:访问作用:访问OGNLOGNL上下文和上下文和ActionAction上下文上下文 A. #相当于ActionContext.getContext(),ActionContext的属性:parametersparameters:包含当前HTTP请求参数的Map,#parameters.id0作用相当于request.getParameter(id) requestrequest:包含当前HttpServletRequest的属性(attribute)的Map,#request.us
13、erName相当于request.getAttribute(userName) sessionsession:包含当前HttpSession的属性(attribute)的Map, #session.userName相当于session.getAttribute(userName) applicationapplication:包含当前应用的ServletContext的属性的Map,#application.userName相当于application.getAttribute(userName) attrattr:用于按page-request-session-application顺序访问
14、其属性。 #attr.userName相当于按顺序在以上三个范围(scope)内读取userName属性,直到找到为止 。B. 用于过滤和投影(projecting)集合,如books.?#this.price100; C. 构造Map,如#foo1:bar1, foo2:bar2。 155 5)“$” $” 操作符操作符用于在国际化资源文件中,引用用于在国际化资源文件中,引用OGNLOGNL表达式表达式 示例: 在Struts 2框架的配置文件中引用OGNL表达式 10 100 BAction-test校验:数字必须为$min为$max之间! 16Struts 2配置文件中,引用OGNL表达
15、式 示例: /register.jsp?name= /register.jsp?name=$ $namename 17 6 6)“%”%”符号符号 作用作用:在标志的属性为字符串类型时,计算OGNL表达式值。 示例示例:在Ognl.jsp中加入以下代码:%的用途185 5访问访问JavaBeanJavaBean的属性表达式的属性表达式 例如:例如:有两个JavaBean类,并有一个employee对象作为OGNL上下文的根对象? Public class Address Private String country; Private String city; Private String st
16、reet; Public class Employee Private String name; Private Adress address; 示例:示例:1)表达式:)表达式:name java代码:代码:employee.getName()2)表达式:)表达式:address.country java代码:代码:employee.getAddress().getCountry() 196 6调用静态方法和静态字段调用静态方法和静态字段 格式:格式:classmethod() /调用静态方法 classfield /调用静态字段 说明:说明:class须给出完整的类名,若省略,默认值jav
17、a.lang.Math例如:例如:max(5,3,8) /调用java.lang.Math的max方法 207 7调用构造方法调用构造方法 作用:作用:OGNL支持对构造方法的调用,从而创建一个新的对象例如:new java.util.ArrayList() /须用完整的限定类名三索引访问 211 1数组和列表索引数组和列表索引 例如:例如: 数组:array0,list0 /在到第1元素 表达式:wang,zhang,li1 /得到结果是第2元素,即list.get(1)222 2JavaBeanJavaBean的索引属性的索引属性 格式:格式: public PropertyType ge
18、tPropertyName() public void setPropertyName(PropertyType values) public PropertyType getPropertyName(int index) public void setPropertyName(int index,propertyType value) 作用:作用:获取和设置数组时使用的属性 说明:说明: 需提供两对setter/getter方法,一组用于数组,一组用于数组中的元素的索引,但非元素的值,仅指向该元素。例如:在某例如:在某JavaBean中,有一个索引属性中,有一个索引属性interest Pu
19、blic String interest; public String getInterest() return interest; public void setInterest(String interest) erest=interest; public String getInterest(int i) return interesti; public void setInterest(int i,string newInterest) interesti=newInterest; 表达式:表达式:interest(2) /作用:调用作用:调用getInterest(2
20、)方法方法表达式:表达式:interest(2, “Hello”) /作用:设值时调用作用:设值时调用setInterest(2, Hello)四对集合进行操作 231 1创建列表创建列表ListList 语法语法: : 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); lis
21、t.add(name3); return list;使用索引:list0,name1,name2,name31242 2创建数组创建数组 例如:new int1,2,3 New int5 /数组中的元素初始化为0 索引:new int1,2,31 注意:数组特殊的属性length,OGNL中可访问:array.length 253 3创建创建MapMap对象集合对象集合 语法语法:#key1: :value1, , key2: :value2, . 示例: 结果:代码生成了一个HTML Select对象,有两个元素,foo名字表示的内容为:foovalue,bar名字表示的内容为:barval
22、ue。 示例:示例:创建带有2个元素的Map对象: #foo:foovalue, bar:barvalue相当Java代码:Map map=new HashMap(2); map.put(foo,foovalue) map.put(bar,barvalue) return map;索引:map0,map.first,mapfoo #foo:oovalue, bar:barvalue foo 或.third指定类型:#java.util.LinkedHashMapfoo:oovalue, bar:barvalueLinkedHashMap作用:以确保插入元素的顺序能够被保存264 4创建创建se
23、tset集合对象集合对象 book1的价格是: 注意: Set由于是无序的,所以不能使用下标获取数据 即不能使用#books027采用OGNL表达式创建List/Map集合对象北京传智播客教育 如果需要一个集合元素的时候(例如List对象或者Map对象),可以使用OGNL中同集合相关的表达式。使用如下代码直接生成一个List对象: 生成一个Map对象:=Set标签用于将某个值放入指定范围。scope:指定变量被放置的范围,该属性可以接受application、session、request、 page或action。如果没有设置该属性,则默认放置在OGNL Context中。value:赋给变
24、量的值.如果没有设置该属性,则将ValueStack栈顶的值赋给变量。285 5集合的伪属性集合的伪属性 集合的常用方法并不符合JavaBean对其属性的访问集合类型集合类型伪属性伪属性OGNLOGNL表达式表达式JavaJava代码代码ListSetSizeisEmptyList.sizeset.isEmptyList.size()Set.isEmpty()ListIteratorList.iteratorList.iterator()MapKeys,valuesmap.keysmap.valuesmap.keySet()map.values()SetIteratorset.iterator
25、set.iterator()IteratorNext,hasNextiter.nextiter.hasNextiter.next()iter.hasNext()29五投影、选择和lambda表达式 301 1投影投影(projection)(projection) 作用:作用:在一个集合中对每一个元素调用相同的方法 或抽取相同的属性,形成新的集合 例如:例如:假设employess是一个包含了employee对象的列表 其表达式: #312 2选择选择(selection)/(selection)/过滤过滤 作用:作用:用表达式从集合中选择某些元素,并将结果保存到新
26、的集合中。 例如:例如:若employess是一个包含了employee对象的列表,其表达式: #employess.?#this.salary3000 /返回大于3000的雇员列表 #employess.?#this.salary30000 /返回大于3000的雇员中第1个 特殊符号:特殊符号: ? 所有满足选择逻辑的对象 - 第一个满足选择逻辑的对象 $ - 最后一个满足选择逻辑的对象323 3LambdaLambda表达式表达式 作用:OGNL支持Lambda表达式语法,使用这些语法 可以建立简单的lambda函数 例如:例如:FibonacciFibonacci if n=0 retu
27、rn 0; elseif n=1 return 1; else return fib(n-2)+fib(n-1); fib(0) = 0 fib(1) = 1 fib(11) = 89OGNL的的Lambda表达式:表达式: Lambda表达式必须放在方括号内部放在方括号内部,#this表示表达式的参数表示表达式的参数。例如:例如:定义了一个Lambda表达式, #fib(11) 调用了表达式,输出为:89,其代码: 六OGNL的值栈特性33值栈值栈(ValueStack)(ValueStack) OGNL上下文中的根对象可以直接访问,而引用上下文中的其他对象则需要使用“#”来标记 值栈中的任
28、何对象都可以直接访问,而值栈中的任何对象都可以直接访问,而不需要使用不需要使用 “#”#” 示例:示例:值栈中有对象:student和employee,两个对象都有name属性, student有学号属性number employee有薪水属性salary employee先入栈,student后入栈。引用:引用:表达式表达式name 访问的就是student 的name属性(因student对象位于栈顶)。 表达式表达式salary 访问的就是employee的salary属性。结论:结论:访问值栈中的对象属性或方法,无须指明对象,也不用“#”,就好像值栈中的对象都是OGNL上下文中的根对象
29、一样。查找顺序:查找栈内的所有对象(从栈顶到栈底),直接找到一个具有你所查找的属性的对象 34.N.N语法语法 提问:提问:访问访问employeeemployee的的namename属性,应该如何写属性,应该如何写表达式呢?表达式呢? 格式:格式:N.xxx (NN.xxx (N是从是从0 0开始的整数开始的整数) ) 作用:作用:使用N.xxx这样的语法来指定从哪一个位置开始向下查找对象的属性,表达式1.name访问的就是employee对象的name属性。注意:注意:在使用N.xxx语法时,要注意位置序号的含义,它并不是表示“获取栈中索引为N的对象”,而是截取从位置N开始的部分栈 35示
30、例:示例:栈中有三个对象:Object0,Object1和Object2都有name属性表达式name访问的是Object0的name属性1.name访问的是Object2的name属性,因为1是一个包含Object1和Object2的部分栈,而且只有Object2有name属性。36.top.top关键字关键字 top用于获取栈顶的对象,结合N.xxx语法,就可获取栈中任意位置的对象。例如:0.top获取Object0(等同于top), 1.top获取Object1 2.top获取Object2, 2.访问Object2 中的name属性37. .访问静态成员访问静态成员 除了使用标准的OGNL表达式访问静态字段和静态方法外,Struts2还允许你不指定完整的类名,而是通过“vs”前缀来调用保存在栈中的静态字段和静态方法。 vsFOO_PROPERTY vssomeMethod() vs1someMethod()说明:说明:vs表示表示ValueStack,如果只有,如果只有vs,那么将使用栈顶对象的类;,那么将使用栈顶对象的类;若在若在vs后面跟上一个数字,那么将使用栈中指定位置处的对象类。后面跟上一个数字,那么将使用栈中指定位置处的对象类。38. . 值
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- GB/T 2099.31-2025家用和类似用途插头插座第31部分:装有USB电源的插座的特殊要求
- 材料力学与智能材料性能应用拓展研究开发创新应用重点基础知识点
- 消防中控室火灾应急预案(3篇)
- 地铁火灾应急预案研究(3篇)
- 追求卓越与平凡的2024年高考作文试题及答案
- 2025年VB考试严选试题及答案全貌
- 行政管理考试典型案例分析:试题及答案
- 木工厂火灾应急预案(3篇)
- 2025年社会变迁与风险管理策略试题及答案
- 计算机科学发展现状试题及答案
- 中小学学生规范汉字书写比赛硬笔格式
- 预防溺水班级主题班会课件
- 《颈椎X线诊断》课件
- DB37T 1914-2024液氨存储与装卸作业安全技术规范
- 院史馆展示策划书
- 体育馆维修改造投标方案(技术标)
- 混凝土采购组织供应、运输、售后服务方案
- 软件开发外包合同范本
- 幼儿园红色小故事PPT:抗日小英雄王二小的故事
- 新闻宣传“三审三校”审查表
- 2023《建筑施工模板安全技术规范》JGJ162-2023
评论
0/150
提交评论