《基于新信息技术的Java-EE应用开发实训》课件第七章.pptx
- 【下载声明】
1. 本站全部试题类文档,若标题没写含答案,则无答案;标题注明含答案的文档,主观题也可能无答案。请谨慎下单,一旦售出,不予退换。
2. 本站全部PPT文档均不含视频和音频,PPT中出现的音频或视频标识(或文字)仅表示流程,实际无音频或视频文件。请谨慎下单,一旦售出,不予退换。
3. 本页资料《《基于新信息技术的Java-EE应用开发实训》课件第七章.pptx》由用户(momomo)主动上传,其收益全归该用户。163文库仅提供信息存储空间,仅对该用户上传内容的表现方式做保护处理,对上传内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知163文库(点击联系客服),我们立即给予删除!
4. 请根据预览情况,自愿下载本文。本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
5. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007及以上版本和PDF阅读器,压缩文件请下载最新的WinRAR软件解压。
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 基于新信息技术的Java-EE应用开发实训 基于 信息技术 Java EE 应用 开发 课件 第七
- 资源描述:
-
1、第7章 Struts 2标签库7.1 Struts 2标签库简介7.2 OGNL7.3 通用标签7.4 用户界面标签第7章 Struts 2标签库7.1 Struts 2标签库简介第7章 Struts 2标签库Struts 2标签库是框架的一部分,是为了解决页面显示数据、封装简单页面逻辑而产生的类似HTML标记的组件。通过标签库,可以将复杂的Java脚本代码封装在组件中,开发者只需要使用简单的代码就可以实现复杂的Java脚本功能。实现了Java脚本的复用,提高了开发者的工作效率。要使用Struts 2标签,只需要在JSP页面添加如下定义:Struts 2框架的标签库可以分为以下两类:(1)通用
2、标签:主要用于数据访问,逻辑控制。非用户界面标签又包含以下两个小类:流程控制标签:主要包含用于实现分支、循环等流程控制的标签。数据访问标签:主要包含用于输出值栈(ValueStack)中的值、完成国际化等功能的标签。(2)用户界面标签(UI标签):主要用来生成HTML元素的标签。用户界面标签又包含以下两个小类:表单标签:主要用于生成HTML页面的FORM元素,以及普通表单元素的标签。非表单标签:主要用于生成页面上的tree和Tab页等。第7章 Struts 2标签库7.2 OGNL第7章 Struts 2标签库7.2.1 OGNL简介Struts 2标签库支持并默认使用OGNL表达式,从而不再
3、依赖任何表现层技术。所以学习标签库之前,必须学习OGNL。OGNL全称为Object-Graph Navigation Language,它是一个功能强大的表达式语言,用来获取和设置Java对象的属性,旨在提供一个更抽象的层次来对Java对象进行解析。OGNL表达式的基本单位是“导航链”,一般导航链由如下几个部分组成:(1)属性名称(Property names):例如对象user的属性username,可以通过user.username引用;(2)方法调用(Method Calls):例如hashCode()返回当前对象的哈希码;(3)数组元素(Array Indices):例如listen
4、ers0返回当前对象的listeners集合中的第一个成员。所有OGNL表达式都是基于当前对象的上下文来完成求值运算的,其中链的前面部分的结果将作为后面求值的上下文。第7章 Struts 2标签库7.2.2 OGNL三要素 访问OGNL的官方网站 http:/www.ognl.org查看相关API可以发现,OGNL的操作一般需要3个参数。其实OGNL的所有操作都是围绕这3个参数进行的,这3个参数被称为OGNL的三要素。1.表达式(Expression)表达式(Expression)是整个OGNL的核心,所有的OGNL操作都是针对表达式的解析后进行的。表达式会规定此次OGNL操作到底要做什么。因
5、此,表达式其实是一个带有语法含义的字符串,这个字符串将规定操作的类型和操作的内容。OGNL支持大量的表达式语法,不仅支持“链式”描述对象访问路径,还支持在表达式中进行简单的计算,甚至还能够支持复杂的Lambda表达式等。我们可以在接下来的章节中看到不同的OGNL表达式。第7章 Struts 2标签库2.Root对象(Root Object)OGNL的Root对象可以理解为OGNL的操作对象。当OGNL表达式规定了“做什么”以后,还需要指定对谁做。OGNL的Root对象实际上是一个Java对象,是所有OGNL操作的实际载体。这就意味着,如果我们有一个OGNL表达式,那么实际上我们需要针对Root
6、对象去进行OGNL表达式的计算并返回结果。3.上下文环境(Context)有了表达式和Root对象,就可以使用OGNL的基本功能了。事实上,在OGNL的内部,所有操作都会在一个特定的数据环境中运行,这个数据环境就是OGNL的上下文环境(Context)。说得再明白一些,就是这个上下文环境(Context)将规定OGNL的操作在哪里做。OGNL的上下文环境是一个Map结构,称为OgnlContext。之前提到的Root对象(Root Object),事实上也会被添加到上下文环境中去,并且将被作为一个特殊的变量进行处理。Struts 2对OGNL上下文的概念又做了进一步扩充,在Struts 2中,
7、OGNL在内存中如图7-1所示。第7章 Struts 2标签库Struts 2框架把OGNL Context设置为ActionContext。并且ValueStack作为OGNL的根对象的扩展。除valuestack之外,Struts 2框架还把代表application、session、request这些对象的Map对象也放到ActionContext中去了。第7章 Struts 2标签库7.2.3 ValueStack 对象ValueStack是Struts 2用以对OGNL计算进行扩展的特殊的数据结构,实际上是针对OGNL三要素中Root对象所进行的扩展。简单来讲ValueStack的扩
8、展方式可以分为两个主要步骤:其一,ValueStack从数据结构的角度被定义为一组对象的集合;其二,ValueStack规定在自身这个集合中的所有对象,在进行OGNL计算时,都被视为Root对象。ValueStack是一个被设计成“栈”的数据结构,并且还是具备表达式引擎计算能力的“栈”的数据结构。OGNL和ValueStack的数据结构的有机结合,共同构成了Struts 2中表达式引擎的使用基础。两者结合的意义在于:ValueStack成为了Struts 2框架进行OGNL操作的一个窗口。换句话来讲,扮演着数据流转催化剂角色的表达式引擎有了一个代理操作的接口,这个接口可以向外界有效的屏蔽所有底
9、层的实现细节,帮助我们将对OGNL原生态API的操作,转换为对特定数据结构(ValueStack)自身的操作。ValueStack是Struts 2框架的核心元素之一,是Struts 2框架进行OGNL计算的实际场所,是Struts 2框架进行数据访问的基础。第7章 Struts 2标签库通常提交一个请求,请求中都会带有相关参数数据。在Struts 2中如果对请求对象中的数据进行表达式语言的计算,先将该数据对象置于ValueStack中,通过对ValueStack进行操作即可。在后面讲解“OGNL在Struts 2框架中的作用”的章节中,会通过一个请求流程的例子,告诉大家OGNL的作用。同时从
10、该示例中,也可以看出ValueStack对象是一直存放着待处理的数据,在整个操作流程中。所以ValueStack是OGNL的计算场所,以及数据访问的基础。7.2.4 使用OGNL访问数据本节通过示例代码来讲述OGNL的使用(主要是OGNL表达式语言的相关知识)。新建的Java工程需要添加ognl.jar类库文件(本书使用ognl-2.6.11.jar文件)。创建一个简单的表示学生的Java Bean文件Student.java。class Student private String name;public String getName()第7章 Struts 2标签库 return name
11、;public void setName(String name)this.name=name;上面的Student类里面有一个name属性和相关的get和set方法。下面介绍使用OGNL获取Student的数据。public static void main(String args)/*创建一个Student对象*/Student student=new Student();student.setName(张三);try 第7章 Struts 2标签库 /*从Student对象中获取name属性的值*/Object value=Ognl.getValue(name,student);Syst
12、em.out.println(value);catch(OgnlException e)e.printStackTrace();上面代码中先实例化一个Student类并给name属性赋值,然后使用代码Ognl.getValue(name,student)获取name属性的数据,并打印出来。上面代码中getValue()方法的语法如下:public static Object getValue(String expression,Object root)throws OgnlException第7章 Struts 2标签库7.2.5 使用OGNL设置数据OGNL还支持赋值操作,以下是赋值操作的代
13、码:public static void main(String args)/*OGNL提供的一个上下文类,它实现了Map接口*/OgnlContext context=new OgnlContext();Student student=new Student();try /给root对象的属性赋值,相当于调用student.setName()Ognl.setValue(name,student,zhangsan);System.out.println(students name is:+student.getName();context.put(student,student);/给cont
14、ext中的对象属性赋值,相当于调用student.setName()第7章 Struts 2标签库7.2.5 使用OGNL设置数据OGNL还支持赋值操作,以下是赋值操作的代码:public static void main(String args)/*OGNL提供的一个上下文类,它实现了Map接口*/OgnlContext context=new OgnlContext();Student student=new Student();try /给root对象的属性赋值,相当于调用student.setName()Ognl.setValue(name,student,zhangsan);Syst
15、em.out.println(students name is:+student.getName();context.put(student,student);/给context中的对象属性赋值,相当于调用student.setName()第7章 Struts 2标签库 Ognl.setValue(#student.name,context,new Object(),lisi);System.out.println(students name is:+student.getName();/给context中的对象属性赋值,相当于调用student.setName()/在表达式中使用=赋值操作符
16、来赋值 Ognl.getValue(#student.name=wangwu,context,new Object();System.out.println(students name is:+student.getName();catch(OgnlException e)e.printStackTrace();第7章 Struts 2标签库运行结果如下:students name is:zhangsanstudents name is:lisistudents name is:wangwu上例中使用了三种方式对Student对象的name属性进行了赋值。其中最后的代码#student.nam
17、e=wangwu,使用“=”操作符赋值。OGNL表达式中能使用的操作符基本和Java里的操作符一样,除了能使用+、-、*、/、+、-、=等操作符以外,还可以使用mod、in、not in等操作。第7章 Struts 2标签库7.2.6 上下文环境以及方法调用之前讲过所有的OGNL表达式都是基于当前对象的上下文来获得相关数据的。下面看一段代码,学习OGNL在上下文中的运用。OGNL将Student对象作为根对象,根据表达式获取根对象中对应的name属性的数据。public static void main(String args)/*OGNL提供的一个上下文类,它实现了Map接口*/OgnlCo
18、ntext context=new OgnlContext();/实例化Student对象,并赋值 Student student1=new Student();student1.setName(zhangsan);Student student2=new Student();student2.setName(lisi);第7章 Struts 2标签库 /将实例化的Student对象放入context里面 context.put(student1,student1);context.put(student2,student2);/设置context的根对象 context.setRoot(st
19、udent1);try /*调用 成员方法*/获取上下文中根对象的name属性数据的长度 Object value=Ognl.getValue(name.length(),context,context.getRoot();System.out.println(student1 name length is:+value);/获取上下文中Student 2的name属性数据并将其转换成大写字母 Object upperCase=Ognl.getValue(#student2.name.toUpperCase(),context,context.getRoot();System.out.prin
20、tln(student2 name upperCase is:+upperCase);第7章 Struts 2标签库 /获取上下文中根对象的name属性数据中下标为5的字符 Object invokeWithArgs=Ognl.getValue(name.charAt(5),context,context.getRoot();System.out.println(student1 name.charAt(5)is:+invokeWithArgs);/获取上下文中Student对象的name属性数据并拼接起来显示 Object namesValue=(String)Ognl.getValue(#
21、student1.name+,+#student2.name,context,context.getRoot();System.out.println(namesValue);/*调用静态方法*/Object min=Ognl.getValue(java.lang.Mathmin(4,10),context,context.getRoot();System.out.println(min(4,10)is:+min);/*调用静态变量*/第7章 Struts 2标签库 Object e=Ognl.getValue(java.lang.MathE,context,context.getRoot()
22、;System.out.println(E is:+e);catch(OgnlException e)e.printStackTrace();代码运行结果如下:student1 name length is:8student2 name upperCase is:LISIstudent1 name.charAt(5)is:szhangsan,lisimin(4,10)is:4第7章 Struts 2标签库E is:2.718281828459045上面的示例代码演示了OGNL如何从上下文中获取对象以及对象的相关方法属性,还有如何使用静态方法。使用类静态的方法调用和值访问的表达式格式如下:类全名
23、(包括包路径)方法名|值名此外,若使用“#”符号则表示从context中取值,否则表示从根对象中取值。所以代码Ognl.getValue(name.length(),context,context.getRoot()是从根对象中取值,而代码Ognl.getValue(#student2.name.toUpperCase(),context,context.getRoot()则是从context上下文中取值。Action的实例总是放到valuestack中。而valuestack是根对象,所以对Action中的属性的访问就可以省略#标记。但是,要访问ActionContext中其他对象的属性,就
24、必须要带上#标记,以便让OGNL知道,不是从根对象,而是从其他对象中寻找。第7章 Struts 2标签库7.2.7 使用OGNL操作集合集合操作是每种语言中不可缺少的,本节学习如何使用OGNL操作集合。首先在Student.java中添加一个Map属性,以及相关的set和get方法。private Map scores=new HashMap();public Map getScores()return scores;public void setScores(Map scores)this.scores=scores;其次新建一个表示教室的类文件Classroom.java,类里面有list
25、相关的属性。第7章 Struts 2标签库class Classroom private List students=new ArrayList();public List getStudents()return students;public void setStudents(List students)this.students=students;此处学习操作集合的方法,示例代码如下:第7章 Struts 2标签库public static void main(String args)/*OGNL提供的一个上下文类*/OgnlContext context=new OgnlContext(
展开阅读全文