收藏 分享(赏)

第4章 对象图形导航语言.pptx

上传人:kpmy5893 文档编号:7272853 上传时间:2019-05-12 格式:PPTX 页数:64 大小:615.37KB
下载 相关 举报
第4章 对象图形导航语言.pptx_第1页
第1页 / 共64页
第4章 对象图形导航语言.pptx_第2页
第2页 / 共64页
第4章 对象图形导航语言.pptx_第3页
第3页 / 共64页
第4章 对象图形导航语言.pptx_第4页
第4页 / 共64页
第4章 对象图形导航语言.pptx_第5页
第5页 / 共64页
点击查看更多>>
资源描述

1、第四章,对象图形导航语言(OGNL),本章目标:,OGNL表达式。 什么是OGNL表达式。 OGNL表达式,其实是一串特殊的字符串,通过这一串字符串可以快速的操作Java代码,甚至是不允许操作Java代码的地方,如JSP页面。 ValueStack中的Context和root 。 Struts2是如何通过ValueStack来操作OGNL的。 Struts2经常使用的几个标签包: 如果只在Java代码中做测试,则只导入ognl.jar即可。,数据传输背后机制:ValueStack(值栈),要了解ValueStack,必须先理解OGNL(Object Graphic Navigation Lan

2、guage)。 OGNL是Struts2中使用的一种表达式语言 它可以用于JSP的标签中,以便能够方便的访问各种对象的属性; 它用于界面将参数传递到Action(并进行类型转换)中; 它还可以用于struts2的配置文件中!所以,非常有必要理解OGNL的基本机制。 Root对象 OGNL称为对象图导航语言。所谓对象图,即以任意一个对象为root根,通过OGNL表达式可以访问与这个对象关联的其它对象。,OGNL的目的:,OGNL目的,是为了获取某个对象的值或设置某个对象的值或调用某个对象的方法! OGNL表达式语言的真正目的,是为了在那些不能写JAVA代码的地方执行JAVA代码,或者是为了更方便

3、地执行JAVA代码。,Ognl.getValue()方法的第一个参数,就是一条OGNL表达式,第二个参数是指定在表达式中需要用到的root对象!,OGNL,OGNL必须拥有一个根root和一个OGNL表达式。可选拥有一个Map类型的Context。,OGNL,OGNL 表达式,Context 可选,new Object() 根必须,OGNL表达式支持以下操作符:#、(单引号)等。,#符的作用:,访问根对象的属性或是方法不需要使用#,但如果非使用#来访问根对象的信息则必须使用#root,即与root关键字共同使用。 如果是调用非根对象的方法或属性必须要使用#符。,Context对象,在OGNL的

4、表达式中,有可能需要访问到多个毫不相干的对象,这时候,我们需要给OGNL传递一个Map类型的对象,把表达式中需要用到的对象放到Map中即可!这个Map对象,称为context。 要在表达式中访问到context中的对象,需要使用“#对象名称”的语法规则。 所谓context其实就是一个Map类型的对象。主要是因为在OGNL中,不支持多个root对象,那么 如果需要在表达式中访问更多毫不相干的对象时,只能通过一个Map来把这些对象统一传递给OGNL。,只有Context没有根对象的示例:,第一个参数为OGNL表达式。 第二个参数为Map类型的Context对象。 第三个参数为根对象,此根对象为一

5、个空的对象。但必须要传。,同时给OGNL传递Context和root对象:,注意是如何获取第三个对象中的值的:,OGNL可以进行赋值操作:,仅供了解: 第一个参数为ONGL表达式。 第二个参数为root对象。 第三个参数为设置的值。,下图 第一个参数为:OGNL表达式, 第二个参数为根对象,第三个参数为值。,下图 第一个参数为:OGNL表达式, 第二个参数为Context对象, 第三个参数为root对象。 第四个参数为值。,利用OGNL表达式调用对象的方法:,以下代码通过两种方式调用,第一种方式调用的是非根对象的方法,第二种调用的是根对象的方法。,符的作用:,在OGNL中,符用来调用静态属性或

6、是方法。当然必须是公共的。 使用符默认调用的是Math中的静态方法,所以在第一种方法对Math类省略了。 第二种是书写完整的代码。,利用OGNL创建List和Map集合:,以下创建List,第一个参数为OGNL表达式,第二个参数为root.,以下创建Map,第一个参数为OGNL表达式,第二个参数为root.,注意#符的使用。,小结:,通过上面的实现我们清楚的知道了两个问题: 1:OGNL就是用来操作属性和方法的。 2:OGNL操作的对像可以有两个 一个是根root对象,它只能有一个。 一个是Map的Context对象,它可以有多个。通过key,value来保存信息。那么Struts2的又是如何

7、使用OGNL的呢?,理解ValueStack的基本机制!对各种现象作出解释,ValueStack实际上就是对OGNL的封装,OGNL主要的功能就是赋值与取值,Struts2正是通过ValueStack来进行赋值与取值的! ValueStack是一个接口,而OgnlValueStack是strtus2中的缺省实现。 ValueStack中的数据,分两个部分存放:root和context(这与OGNL中的概念一致)。,在ValueStack中有两个方法: 见OgnlValueStack的源代码 getContext() 返回非根对象,即一个Map. getRoot() 返回root根对象。而它是一

8、个List。所以,ValueStack可以有多个根对象。 ValueStack中的root对象是CompoundRoot,CompoundRoot继承了ArraryList,提供了额外的方法:push()和pop()方法,用来对root对象中所包含的数据进行存取!我们称为压栈和弹栈。,CompoundRoot的源代码:,正如右图所示: CompoundRoot 变成了一个栈结构! 压栈操作,将导致对象被 放到CompoundRoot的 第0个元素上(第0个 元素是栈顶), 其它对象被依次往后移动; 出栈操作,将导致 CompoundRoot的第0个元 素被移除(即栈顶元素被 弹出),其它对象被

9、依 次往前移动!,Struts2的数据标签,是通过直接操作ValueStack对象获取数据的:,在Struts2中,一个请求在最终到达Action的方法之前,Action对象本身会被压入ValueStack(实际上就是放到ValueStack的CompoundRoot中),所以Action对象是CompoundRoot中的一个元素。 在Struts2中,操作ValueStack的就是struts2的自定义标签,即/struts-tags.,为了能说明问题,先让我们认识它的两个基本数据标签: s:property从ValueStack中获取属性输出。 s:iterator遍历集合,每次遍历都将数

10、据压栈和弹栈,即操作CompoundRoot.,图中的第二步即是将Action 压入栈顶。,以下演示请求一个Action时,Action对象位于ValueStack的栈顶: 第一步、1:,在Struts2中,一个请求在最终到达Action的方法之前,Action对象本身会被压入ValueStack(实际上就是放到ValueStack的CompoundRoot中),所以Action对象是CompoundRoot中的一个元素。看下面的代码:,第一步、2:,页面获取数据: JSP页面将能正确将它们的值取出。,意思是调用root对象的getName()方法。 Struts2将自动搜索CompoundR

11、oot中有哪些元素(从第0个元素开始搜索),检测这些元素是否有getName()方法,如果第0个元素没有,将继续搜索第1、2、3个元素是否有getName()方法。 如果在栈中没有找到getName方法,则再去ActionContext,即request的map中去查找,如果没有则输出空字符串。,注意,此时即使用户通过ActionContext.getContext().getSession().put(“name”,”someName”)也不会输出。因这它并不位于root中,而是位于Context中,对于位于Context中的信息则必须要使用#session.name的方式获取。,以下代码手

12、工将自己封装的对象压入栈顶: 第二步:修改第一步的Action代码如下,本身Action拥有一个name属性,然后又通过直接操作ValueStack将User类压入栈顶,所以,同样使用第一步2所示的代码,将返回“李四”,而 age值则为空。Age返回空的原因为是User这个对象中也有一个age属性。但如果age不是User的属性,则会再找第12直到N个元素,真到找不到为止。如果找到就输出它的值。,示例2:遍历,Action代码如下:具有相同属性的对象 被放到不同的域中,页面遍历:,第8行显示的名称为:张三,这很显然,因为是从root中获取。 第10行依次显示Jack0N,并不断的将信息压入栈顶

13、,然后再删除。 第13行,如果不使用#root1,则会与11行相同。 第16行,显示张三。因为,遍历完成以后,栈又回复到以前的状态。,示例3:当访问实现了ModelDriven接口的Action时,在访问Action时,Struts2会做两个事 先将Action压入栈中。 再将Model,如User对像压入栈中。 此时它位于栈顶。,页面获取示例3的值:,小结:,通过以上分析,我们知道了: Struts2是通过标签直接与ValueStack打交道的。 在ValueStack中,保存着一个根对象Root,其实它就是一个List. 同时保存着一个Map,即Context非根对象。 如果一个Actio

14、n实现了ModelDriven接口,此时会先将Action压入栈中,再将Model压入栈中。按后进先出的原则,Model对象则位于栈顶。,struts2中的OGNL上下文 |- application | |- session | context map-|-OgnlValueStack(root) user, action, OgnlUtil, . | |- request | |-parameters| |- attr,30,Struts2的OGNL操作符再说明:,OGNL要结合struts标签来使用。由于比较灵活,也容易把人给弄晕,尤其是“%”、“#”、“$”这三个符号的使用。由于$广泛

15、应用于EL中,这里重点写%和#符号的用法。,%-用于说明内部是OGNL可执行的表达式,类似于eval. #-用于从某个范围中取出数据。 $-在struts的配置文件或资源文件中使用。 -用于调用某个类的静态方法。 要打开此功能,请在struts.xml中添加以下配置:以上所有必须要配合struts2的标签共同使用。,符操作静态成员和方法,必须是public的:,“#”符号有三种用途:1访问属性对像:,(1)、访问非根对象(struts中值栈为根对象)如OGNL上下文和Action上下文,#相当于ActionContext.getContext(): 如:,是直接从ActionContext中取

16、数据。 以下是获取其他数据: parameters 包含当前HTTP请求参数的Map #parameters.id0作用相当于request.getParameter(“id“) request 包含当前HttpServletRequest的属性(attribute)的Map #request.userName相当于request.getAttribute(“userName“) session 包含当前HttpSession的属性(attribute)的Map #session.userName相当于session.getAttribute(“userName“) application 包

17、含当前应用的ServletContext的属性(attribute)的Map #application.userName相当于application.getAttribute(“userName“) attr 用于按request session application顺序访问其属性(attribute),#attr.userName相当于按顺序在以上三个范围(scope)内读取userName属性,直到找到为止。,#”符号有三种用途:2操作集合:,构造Map,如: #foo1:bar1, foo2:bar2 #foo1:bar1, foo2:bar2这种方式常用在给radio或select、

18、checkbox等标签赋值上。如果要在页面中取一个map的值可以这样写: ,%的作用:,“%”符号的用途是在标签的属性值被理解为字符串类型时,告诉执行环境%里的是OGNL表达式。 很有点类似javascript里面的eval()功能。 以下将从map中获取一个key值。 ,“$”的其他用途,在Struts 2配置文件中,引用OGNL表达式则应该使用$. listUser.action?msg=$msg,目标,4.1 OGNL 4.2 Struts2标签分类 4.3 控制标签 (if, elseif, else, iterator, append, merge, generator, subse

19、t, sort) 4.4 数据标签 (bean, param, date, debug, include, set, url, push),38,38,OGNL,OGNL Object-Graph Navigation Language的缩写,它是一种功能强大的表达式语言(Expression Language,简称为EL),通过它简单一致的表达式语法,可以存取对象的任意属性,调用对象的方法,遍历整个对象的结构图,实现字段类型转化等功能。Struts2默认的表达式语言是OGNL,39,39,OGNL的符号-#,# 访问OGNL上下文和Action上下文,#相当于ActionContext.ge

20、tContext() . 示例见第5页 构造Map 示例见第6页 用于过滤和投影(projecting)集合 ?所有匹配选择逻辑的元素 只提取符合选择逻辑的第一个元素 $只提取符合选择逻辑的最后一个元素 示例见第7页,40, - ,41,List list = new ArrayList(); list.add(new Student(1, “张三“, new Date(); list.add(new Student(2, “李四“, new Date(); list.add(new Student(3, “王八“, new Date(); pageContext.setAttribute(“

21、list“, list);,返回张三,王八返回张三返回王八,42,43,OGNL的主要功能,支持对象方法调用 调用保存在pageContext中的Student对象的doSomeThing() N语法 从ValueStack的第N个位置开始取值 top关键字 取出最顶端的对象 示例:从ValueStack中的第0个位置开始取出最顶部的对象,返回为”阿拉伯联合酋长国”,44,Struts标签分类,45,导入taglib,46,控制标签,if elseif else iterator append merge generator subset sort,47,条件标签 ifelseifelse,主

22、要属性: test : 测试条件 示例恭喜,您中了一等奖!恭喜,您中了二等奖!欢迎惠顾!,48,迭代标签 iterator,用于循环数组,集合和Map 属性 value:数组,集合或Map var:当前元素 status:当前元素的状态 index,count,even,odd,first,last 示例,49,遍历List遍历Map,50,集合合并标签 append和merge,将多个集合合并成一个集合 属性 var 新集合的名称 示例merge用法和append相同,结果的组织不一样.,51,字符串分割标签 generator,将一个字符串按照指定分隔符分割成一个字符串数组 属性 sepa

23、rator: 分隔符 val(value): 字符串 count:字符串數組中元素個數 示例,52,集合子集标签 subset,从集合中取出一个子集,注意:子集被放在值栈的顶部,subset标签执行完后子集自动移除 属性 source: 集合 start: 起始索引 count: 子集中元素个数 示例,53,排序标签 sort,根据定义的排序规则,对集合中的元素进行排序,排序后生成的新的集合放在值栈顶部,标签结束后自动删除. 属性: comparator: 实现Comparator的类 source: 集合 示例:,54,数据标签,set push bean date debug includ

24、e url param property,55,设置变量标签 set,用于设置一个新变量,并将新变量放入指定的作用域中 属性 Var: 新变量的引用 Value:值 示例注:如果不指定,默认放在Stack Context中,56,栈顶置值标签 push,将某个值置于值栈的顶部,标签结束后,将从值栈中移除. 属性 value: 即值 示例,57,javabean创建标签 bean,用于创建javabean的实例,如果设置了var值,则存于Stack Context,否则,标签结束后自动移除. 属性 name: javabean类名(带包) var:名称 示例1 张三好 2009-9-9,58,日

25、期格式化标签 date,格式化日期并输出 属性 name:日期 format:格式化字符串 示例,59,调试标签 debug,用于当前环境下Value Stack和stack context中保存的数据,60,资源包含标签 include,用于将一个html,jsp或servlet包含到当前页面中,使用param传递参数 属性 value:包含页面名称 示例 ,61,URL生成标签 url,生成URL地址,可以通过param标签传递请求参数,如果参数为中文,自动编码 属性 value:url值 action:action名称,自动加上.action 示例中华人民共和国“链接,62,数据标出标签 property,用于输出值栈,Stack Context中的数据 属性 value:要输出的值 如果输出值栈中的值,不用# 如果输出Stack Context中的值,要用# 如果省略value,表示取出值栈的栈顶对象输出,63,总结,OGNL是标签的基础,要理解OGNL的基本使用,在struts2中,OGNL必须和标签紧密配合 控制标签包含一组条件判断标签和一组集合遍历和操作标签 数据标签包含一组数据访问相关的标签,64,

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

当前位置:首页 > 网络科技 > C/C++资料

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


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

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

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