J2EE课程设计《技术应用指导》——第1章 Java集合和泛型技术及应用(第3部分)
- 格式:pdf
- 大小:270.56 KB
- 文档页数:11
《JAVA课程设计(J2EE)》教学大纲课程编号:53.033060课程名称:JAVA课程设计(J2EE)英文名称:Java Programming设计周数: 3学分:3开设学期:第6学期适用专业:计算机科学与技术先修课程:《面向对象程序设计(Java)》、《Java高级程序设计(J2EE)》一、目的和意义通过本课程设计实践,达到以下目的:(1)培养学生严谨务实的工作态度,并在老师的指导下,提高分析问题和解决问题的能力,促进理论联系实际学风养成。
(2)巩固和加深对面向对象程序设计的基本概念、基本理论和实现技术的理解。
(3)掌握Java开发的主要环境与工具,掌握面向对象的常用控件的使用方法。
(4)初步掌握面向对象系统分析与设计的基本方法和步骤,并能针对简单的实际应用问题进行初步地分析和设计。
(5)掌握Java编程语言,并针对具体应用问题进行编程实现。
(6)通过撰写课程设计论文,锻炼学生科技论文写作能力。
二、选题要求(1)选题应切近生活,以便需求分析;题目不应太大,但系统的功能相对独立完整。
(2)以具体问题的功能模块实现为主,兼顾其它相关的辅助模块。
(3)在合理选题的基础上,进行面向对象的需求分析、系统设计、画出相应的需求分析图、系统设计模型图等。
(4)能正确使用开发工具进行编码实现,完成相关的功能模块,并进行测试和完善。
(5)课程设计题目常以周边生活中的课题为主,也可选做科研、教改或实验室管理等实际应用题目,学生可自选题目,也可选择教师提供的题目。
(6)以个人独立完成课程设计为主,根据题目确实需要分组做的报教师审批,原则上每组人数不能超过3人,并一定要分工明确。
详见各设计《指导书》(电子版)。
最低要求:对于能力一般的学生,可选作、仿作教材上的综合实例,并实现之。
要求独立完成。
包括:1)4.8 类似航班管理系统的题目:要求功能扩充完整。
2)7.13 扩充该综合实例,实现命令行客户端程序“学生成绩管理系统”等。
1. 集合框架2. 集合操作——线性表1. 集合框架1.1. Collectionjava提供了一种可以存数一组数据的数据结构,其提供了丰富的方法,在实际开发中往往比数组使用的广泛。
这种数据结构成为集合:Collection。
Collection是一个接口,其定义了集合的相关功能方法。
1.1.1. addAll与containsAll方法集合也提供了批处理操作:addAll方法用于将给定集合中的所有元素添加到当前集合中,其方法定义为:例如:containsAll方法用于判断当前集合是否包含给定集合中的所有元素,若包含则返回true。
其方法定义为:01. b o o l e a n a d d A l l (C o l l e c t i o n c )01.C o l l e c t i o n <S t r i n g > c 1 = n e w A r r a y L i s t <S t r i n g >();02.c 1.ad d ("j a v a ");03.c 1.ad d ("c p p "); 04.c 1.ad d ("p h p ");05.c 1.ad d ("c #"); 06.c 1.ad d ("o b je c t i v e -c "); 07.S y s t e m .o u t .p r i n t l n (c 1); // [j a v a , c p p , p h p , c #, o b j e c t i v e -c ] 08.C o l l e c t i o n <S t r i n g > c 2 = n e w H a s h S e t <S t r i n g >(); 09.c 2.ad d A l l (c 1);10. S y s te m .o u t .p r i n t l n (c 2); // [c p p , p h p , c #, j a v a , o b j e c t i v e -c ]01. b o o l e a n c o n t a i n s A l l (C o l l e c t i o n c )Top例如:01.C o l l e c t i o n<S t r i n g>c1=n e w A r r a y L i s t<S t r i n g>();02.c1.a d d("j a v a");03.c1.a d d("c p p");04.c1.a d d("p h p");05.c1.a d d("c#");06.c1.a d d("o b j e c t i v e-c");07.S y s t e m.o u t.p r i n t l n(c1);//[j a v a,c p p,p h p,c#,o b j e c t i v e-c]08.C o l l e c t i o n<S t r i n g>c2=n e w A r r a y L i s t<S t r i n g>();09.c2.a d d("j a v a");10.c2.a d d("c p p");11.S y s t e m.o u t.p r i n t l n(c1.c o n t a i n s A l l(c2));//t r u e1.2. Iterator 迭代器Collection提供了一个遍历集合的通用方式,迭代器(Iterator)。
第2 章Java反射和代理技术及应用(第2/2部分)1.1Java反射技术在项目开发中的应用示例Spring AOP使用了两种代理机制:基于JDK的动态代理和基于CGLib的动态代理。
当然,在Spring AOP中之所以需要应用两种代理机制,主要是因为JDK中的动态代理只提供基于接口的代理实现,不支持对具体类(没有接口实现的功能类)的代理——此时,读者需要应用CGLib的动态代理的字节码的类库技术。
而在这两种动态代理技术的具体实现中都应用了Java中的反射技术。
1.1.1利用Java反射技术实现可配置化的工厂类1、工厂设计模式及在应用中所存在的主要缺点(1)GOF工厂设计模式及代码实现的示例在GOF的设计模式的分类划分中,把与实现对象的实例化相关的各种模式称之为“创建型模式”——其中的工厂模式为创建型模式中的一种形式,应用工厂模式的主要目的是希望达到将创建对象实例的职责与使用该对象实例的职责相互分离的设计目标。
下面的【例2-10】、【例2-11】和【例2-12】为一个工厂模式的完整示例的实现代码。
其中的Product抽象类代表工厂模式中的产品接口,在其中定义有产品功能类需要具体完成的功能方法makeFunction;分别在该Product抽象类的基础上,派生出两个不同的具体产品类SomeOneProduct和AnotherOneProduct;在工厂类ProductFactory中根据请求者的需要分别实例化出SomeOneProduct和AnotherOneProduct类的对象实例。
【例2-10】工厂模式中的抽象产品接口的代码示例public abstract class Product{public abstract void makeFunction();}【例2-11】工厂模式中的具体产品类的代码示例public class SomeOneProduct extends Product{public void makeFunction(){}}public class AnotherOneProduct extends Product{public void makeFunction(){}}【例2-12】工厂模式中的工厂类的代码示例public class ProductFactory{public static final int SomeOne_Product =1;public static final int AnotherOne_Product =2;public static Product creatorProduct(int productKind){if (productKind == SomeOne_Product){return new SomeOneProduct();}else if (productKind == AnotherOne_Product){return new AnotherOneProduct();}}}(2)工厂设计模式及在应用中所存在的主要缺点●除非重新编译,否则无法对某个产品的实现类进行替换因为在工厂模式中是将具体的产品类的类名直接写在工厂类的代码中,请见上面【例2-12】中的黑体所标识的代码——如果需要将SomeOneProduct类改变为其他的类名称,读者则必须要修改工厂类ProductFactory中的有关的程序代码。
j2ee课程设计指导一、课程目标知识目标:1. 理解J2EE的基本概念、体系结构和开发流程;2. 掌握J2EE的核心技术,包括Servlet、JSP、JavaBean和EJB;3. 学会使用主流的J2EE开发工具和框架,如Eclipse、Struts、Hibernate和Spring;4. 了解J2EE在大型企业级应用开发中的应用场景和优势。
技能目标:1. 能够独立搭建J2EE开发环境;2. 掌握基本的Servlet编程,实现客户端与服务器端的交互;3. 掌握JSP页面开发,实现动态网页的生成;4. 学会运用JavaBean和EJB进行业务逻辑处理;5. 熟练使用主流开发框架,提高开发效率。
情感态度价值观目标:1. 培养学生对J2EE技术的兴趣和热情,激发学习动力;2. 培养学生良好的编程习惯,注重代码规范和团队协作;3. 增强学生的企业级应用开发意识,为将来从事相关工作打下基础。
课程性质分析:本课程为高年级计算机专业课程,旨在使学生掌握J2EE技术,提高大型企业级应用开发能力。
学生特点分析:学生已具备一定的Java基础,但对企业级应用开发尚缺乏了解,需要通过本课程的学习,逐步掌握J2EE技术。
教学要求:1. 结合实际案例,使学生充分了解J2EE技术的应用场景;2. 采用项目驱动教学法,让学生在实践中掌握J2EE技术的各项技能;3. 注重理论与实践相结合,提高学生的实际动手能力。
二、教学内容1. J2EE概述- 了解J2EE的历史背景、体系结构和开发模式;- 掌握J2EE的核心组件及其作用。
2. 开发环境搭建- 学习如何安装和配置JDK、Tomcat、Eclipse等开发工具;- 熟悉Eclipse集成开发环境,掌握基本操作。
3. Servlet编程- 掌握Servlet的生命周期、请求和响应处理;- 学会使用Servlet实现会话管理、文件上传下载等功能。
4. JSP技术- 学习JSP的基本语法、内置对象和标签库;- 掌握JSP与JavaBean、Servlet的交互方法。
第11章JasperReports和iReport报表工具(第3/3部分)1.1利用iReport工具创建报表iReport报表可视化设计器工具软件是与JasperReport 报表引擎相配合使用的一个工具软件,因为JasperReport报表引擎本身只提供有丰富的系统类库、但并未提供有操作简洁方便的可视化报表设计工具,而iReport软件则能够弥补它的不足。
在报表设计和开发实现中,将它们相互配合使用将会进一步提高开发的效率。
1.1.1使用iReport工具中的Report Wizard向导创建报表1. 创建SQL查询语句以获得数据库表结构信息读者可以选中iReport工具中的【档案】菜单中的【报表精灵】子菜单,将弹出下图11.30所示的对话框。
在该对话框中的【SQL query】输入框中输入查询功能的SQL语句:本示例为select * from bbs,请见下图11.30中的示例操作结果的截图。
图11.30 创建SQL查询语句以获得数据库表结构信息2、选择在报表模板中所需要的目标字段读者在上图11.30所示的对话框中点击其中的【Next】下一步按钮后,将出现下图11.31所示的对话框。
读者可以根据在报表中所需要显示的数据要求,选择在报表模板文件中所需要的各个目标字段——请见下图11.31所示的对话框中的各个字段,将左边框中的各个字段名添加到右边框中。
图11.31选择在报表模板中所需要的目标字段3、选择报表的布局模板和显示风格读者在上图11.31所示的对话框中点击【Next】下一步按钮后,将出现下图11.32所示的对话框。
在该对话框中根据报表模板的风格要求选择iReport工具中所提供的报表布局模板——本示例选择classicC.xml类型的报表模板,请见下图11.32所示的最终选择的结果截图。
图11.32 选择报表的布局模板读者在上图11.32所示的对话框中点击【Next】下一步按钮后,将出现下图11.33所示的配置成功的对话框。
第11章JasperReports和iReport报表工具(第2/3部分)1.1与JasperReports引擎配套的iReport报表工具1.1.111.2.1 设置iReport设计器工具的工作环境1、下载iReport设计器工具的系统文件iReport 报表模板文件设计器工具软件同样也是/开源社区上的一个免费软件,其主要的作用是以可视化的方式设计生成JasperReport 所需要的报表模板文件(尽管报表模板文件的后缀为*.jrxml,但实际上它却是XML格式的文件)。
开发人员之所以要应用iReport 设计器工具,主要是因为JasperReport 报表引擎本身并未提供有良好的可视化报表设计工具,而iReport 设计器工具软件正好弥补了JasperReport 报表引擎在这个方面的不足。
读者可以在/的网站上下载iReport设计器工具的系统文件,但读者要注意下载的iReport工具程序一定要与配套的JasperReport报表引擎的系统库版本相匹配。
具体操作的过程请见下图11.11所示的局部截图。
图11.11 下载iReport设计器工具的系统文件的页面内容截图所下载的iReport-2.0.5-windows-installer.exe程序文件为Window平台下的直接安装版程序,而iReport-2.0.5.zip文件为压缩版。
建议读者下载压缩版的程序文件,这样可以不需要在机器中安装就可以直接执行。
2、启动iReport报表模板文件设计器工具读者按照图11.11所示的页面截图下载iReport设计器工具的系统文件后,解开所下载的iReport-2.0.5.zip压缩文件,将能够看到下图11.12所示的与iReport报表模板文件设计器工具软件相关的各个目录和文件。
其中的iReport.exe文件为它的启动程序文件,为了使得读者在应用iReport设计器工具软件时更简单和方便,应该要按照下文的介绍设置iReport设计器工具软件的工作环境。
1.1跟我学Java泛型技术及应用实例——Java泛型相关的应用技术1.1.1Java泛型相关的应用技术1、什么是泛型----泛型的本质是参数化类型(1)什么是泛型泛型是Java SE 1.5的新特性,泛型的本质是参数化类型,也就是说所操作的数据类型被指定为一个参数。
(2)在什么场合下需要应用泛型如果一个类有一个或者多个类型的变量,那么这个类就是泛型类,这些类型变量是类的类型参数。
2、Java泛型的种类Java的泛型主要有泛型类、泛型接口和泛型方法等,在Java语言中,将参数类型可以用在程序类、接口和方法的定义中,分别称为泛型类、泛型接口、泛型方法。
3、泛型类的代码示例package com.bluedream.generics;import java.util.Collection;public class SomeGenericsDemo<E> {Collection<E> oneCollection;public void doSomeThing(E oneElement) {oneCollection.add(oneElement);/*** 其它程序代码,在此省略...*/}}4、为什么要应用泛型(1)泛型就好比Word中的模板在Word的模板中,提供了基本的文档编辑内容,在定义Word模板时,对具体编辑哪种类型的文档是未知的。
在Java中,泛型则提供了类、接口和方法、变量等的模板,泛型也可以看作是占位符,与定义Word模板时类似,定义泛型时的具体类型是未知的。
(2)Java语言引入泛型的好处是安全和简单在Java SE 1.5之前,没有泛型的情况的下,通过对Object类型的对象引用来实现参数的“任意化”,“任意化”带来的缺点是需要在使用者的代码中要做显式的强制类型转换,而这种转换是要求开发者对实际参数类型是可以预知的情况下进行的。
如下为程序代码示例:package com.bluedream.generics;import com.bluedream.swing.JToolBarTest;public class SomeDigitClass{public void doSomeThing(Object oneParameterObject) {if(oneParameterObject instanceof Integer){Integer targetParameterObject=(Integer)oneParameterObject;}else if(oneParameterObject instanceof Float){Float targetParameterObject=(Float)oneParameterObject;}else{Double targetParameterObject=(Double)oneParameterObject;}}public static void main(String []args){SomeDigitClass oneDigitClass=new SomeDigitClass();oneDigitClass.doSomeThing("字符串类型的参数");}}在上面的代码示例中,实际传递的参数的数据类型为字符串,但Java编译器并不认为参数的数据类型是非法,在如下示图中并没有给出编译错误。
第1章Java集合和泛型技术及应用(第3/4部分)1.1Java泛型技术及应用应用泛型编程技术能够产生出高度灵活性和通用性的功能实现代码,并使得开发人员能够专注于数据类型的抽象化方面而产生出应用广泛的功能实现算法。
读者在项目开发编程实现中如果能够充分地应用面向对象中的多态、Java语言中的反射、以及Java语言中的泛型编程技术(也就是模板技术),便能够获得极高层次上的代码可重用性和灵活性的功能实现程序——泛型编程使得开发人员能够专注于类型抽象化和通用的功能实现。
1.1.1为什么要应用泛型技术1、什么是泛型——泛型的本质是参数化类型(1)泛型的本质是参数化类型泛型是从Java SE 1.5版开始增加的一个新的特性,泛型的本质其实是参数化类型——也就是说所操作的数据类型可以被指定为一个参数。
(2)Java语言中泛型的种类Java语言中的泛型可以用在对类、接口和方法的定义中,而分别称为泛型类、泛型接口、泛型方法。
(3)Java语言中泛型类、泛型接口和泛型方法的代码示例下面的【例1-18】中的代码示例为一个泛型类的代码示例,其中的参数<E>代表某种数据类型的替代符,因此SomeGenericsDemo<G>为一个泛型类定义、而public void doSomeThing(G oneElement)为一个泛型方法定义、Collection<G> oneCollection;为一个利用泛型类的对象声明定义。
【例1-18】Java语言中泛型类、泛型接口和泛型方法的代码示例public class SomeGenericsDemo<G> {Collection<G> oneCollection;public void doSomeThing(G oneElement) {oneCollection.add(oneElement);// ... 其它的功能实现代码,在此省略}}2、为什么要应用泛型技术泛型就好比Office Word文字处理软件中为用户提供的模板技术,在Word的某个模板文件中,提供了对某中特定应用的文档基本的文档编辑内容,在定义Word模板文件时,对具体编辑哪种类型的应用文档是未知的、但达到一种通用的格式定义的效果。
在Java语言中的泛型技术则为开发人员提供了对类、接口和方法、变量等定义的模板,而在泛型定义中的<G>等符号(当然,也可以为其他符号)也可以看作是占位符,与定义Word模板格式文件时类似,定义泛型时的具体类型在程序设计时是未知的。
(1)Java语言引入泛型的优点是安全和简单在Java SE 1.5版之前的JDK系统类库中,由于没有提供对泛型的技术支持,一般是通过对Object类型的对象引用来实现参数的“任意化”——参数的“任意化”所带来的缺点是需要在程序代码中要做显式的数据类型的强制类型转换,而这种类型转换是要求开发者对实际参数类型是可以预知的情况下进行的、否则将会出现运行时的异常错误。
下面的【例1-19】为采用Object类型的对象引用来实现参数的“任意化”的代码实现示例,在方法doSomeThing体内必须对可能的各种数据类型进行判断、并根据参数的不同类型分别完成不同的功能处理——请注意其中黑体所标识的代码。
【例1-19】采用Object类型的对象引用实现参数的“任意化”的代码实现示例public class SomeDigitClass{public void doSomeThing(Object oneParameterObject) {if(oneParameterObject instanceof Integer){Integer targetParameterObject=(Integer)oneParameterObject;}else if(oneParameterObject instanceof Float){Float targetParameterObject=(Float)oneParameterObject;}}}而对于采用参数的强制类型转换编程实现中所可能产生出的运行时的错误,Java编译器并不能及时地检测出可能存在的错误,而只有程序代码在运行时才抛出异常错误,这将会存在一个很严重的程序代码的安全隐患。
(2)应用泛型编程实现功能代码的一个主要优点应用泛型的好处是能够在源代码被编译时就能够进行类型安全方面的检查和识别,并且所有参数的强制类型转换工作都是自动和隐式的——由运行系统自动地完成。
因此不仅可以提高代码的可重用率,而且也能够提高程序代码的质量。
(3)应用泛型编程实现功能代码的另一个优点应用泛型技术不仅能够减少编码量、也能够提高程序代码的通用性——由于泛型技术其实是一种程序模板技术,因此能够大大地简化程序代码的结构,并能够产生出通用的功能实现代码,相应地也就能够提高项目中的代码实现的开发效率。
1.1.2泛型技术在应用中的规则及基本的语法定义1、Java泛型技术在应用中的规则和限制为了能够让编译系统能够正确地识别参数的最终数据类型,读者在应用Java泛型技术时也应该要遵守一定的规则和按照特定的要求编程。
具体的要求如下:1)泛型定义中的类型参数只能适用于“类”的类型(包括开发人员的自定义类)、不能应用于简单的数据类型;2)泛型的参数类型可以使用extends语句,例如<G extends superclass>。
习惯上成为“有界类型”来加以限定其应用的范围;3)泛型的参数类型也还可以是通配符类型的定义形式,例如Class<?> classType =Class.forName(ng.Integer);4)但泛型类不可以继承Exception类,即泛型类不可以作为异常抛出的定义;5)不可以定义泛型数组、也不可以用泛型定义构造具体的对象实例(即object = newG();这样的对象创建的语句是错误的),并且在static方法中也不可以使用泛型、泛型变量也不可以用static关键字来修饰——请见下面的代码片段示例:public static T getSingleInstance() {// 不通过}public static T singleInstance; // 不通过2、泛型的基本语法定义(1)泛型的基本语法定义方式是通过在某个类名后面的<>括号中指定下面【例1-20】中的示例代码说明了如何进行泛型定义,其中用G代替在实际中将会使用到的类名(当然也可以使用其它别的符号名称,习惯上在这里使用大写的G,表示GenericType的含义)。
然后就可以采用该G符号进行参数的定义。
通过在类名后面使用一对尖括号<>、并且在其中放一个称为类型参数的“G”来定义泛型,该符号“G”其实是“类型占位符”或者称为“类型参数”。
(2)泛型的基本语法定义的代码示例【例1-20】泛型的基本语法定义的代码示例public class TestGenerics<G> {Collection<G> oneCollection;public void doSomeThing(G oneElement) {oneCollection.add(oneElement);// ... 其它的功能实现代码,在此省略}}3、Java语言中的泛型与C++语言中的模板在应用方面的不同点(1)Java语言中的泛型很相似于C++语言中的模板、但和类模板还是有一定区别的Java语言中的泛型技术无论是语法定义还是应用的环境等方面都类似于C++语言中的模板技术,但是它们的这种相似性仅限于表面层次。
Java 语言中的泛型是由Java编译器本身实现的、并由编译器执行参数的数据类型检查和类型推断工作,然后最终再生成普通的非泛型定义的类字节码的程序代码。
这种实现技术在Java的泛型技术中称为擦除(Erasure)——编译器使用泛型的数据类型信息来保证数据类型在应用方面的安全性,然后在生成最终的目标字节码之前再将它们清除掉;因此,在最终的*.class类文件中是不存在与泛型定义有关的各种描述内容——因为Java中的“泛型技术”目前还只是一种“编译期的技术”,也就是只能在编译期有效。
(2)在Java虚拟机中是没有泛型数据类型的(所有对象定义都属于Java中的标准类型)开发人员无论在程序代码的何处定义了一个泛型类型,相应的原始数据类型都会被自动地提供和最终使用——原始数据类型的类型名字就替代了类型参数定义中的泛型定义的占位符名字。
类型变量被擦除时如果存在限定的类型,则用其第一个限定的类型名替换;如果不存在限定的数据类型变量则用通用的Object基类的数据类型替换。
用其第一个限定类型SomeOneBaseClass替换的代码片段示例:public class First GenericTypeDemo <G extends SomeOneBaseClass>无限定的数据类型定义时用Object类型替换的代码片段示例:public class Some GenericTypeDemo<G> {private G someOneAttribute;public G getSomeOneAttribute() {return this.someOneAttribute;}public void setSomeOneAttribute(G someOneAttribute) {this. someOneAttribute= someOneAttribute;}}1.2Java泛型类、接口、方法及在项目中的应用1.2.1Java泛型类及应用示例1、Java泛型类及具体的应用示例(1)Java泛型类——可以把泛型类看成是类的模板由于泛型类声明也是一种类的定义声明,因此仍然需要为它提供具体的数据类型后才能构成最终的具体数据类型——因为Java语言是一种强类型的语言,在定义类、接口或者方法时, 必须指定它们的具体数据类型。
但由于泛型是一种模板类型的定义,因此在声明泛型类、接口或者方法和变量时是不需要指定它们的具体类型, 而是用一个类型参数的占位符号来代替。
但在具体应用这个类、接口或者方法、变量时必须要为这个泛型类型参数最终指定一个具体的数据类型、并最终被实际的数据类型所代替。
在下面【例1-21】所示的Java泛型类的应用示例中类名后面带有<GenericType>,表明了这个GenericTypeDemo类是一个泛型类, 其中的GenericType被称为泛型的类型参数。
因此,在使用这个GenericTypeDemo泛型类时,泛型的类型参数GenericType是需要被替换为某种实际类的数据类型名。