我的J2EE成功之路:实战Ajax,JSP,Struts 2,Spring,Hibernate(含光盘1张)(txt+pdf+epub+mobi电子书下载)


发布时间:2020-07-18 04:30:53

点击下载

作者:郭锋 等

出版社:电子工业出版社

格式: AZW3, DOCX, EPUB, MOBI, PDF, TXT

我的J2EE成功之路:实战Ajax,JSP,Struts 2,Spring,Hibernate(含光盘1张)

我的J2EE成功之路:实战Ajax,JSP,Struts 2,Spring,Hibernate(含光盘1张)试读:

前言

在前几年JSP+Servlet是采用Java进行Web开发的常用技术,但后来Struts逐渐流行起来,再后来Spring成了当仁不让的霸主,而Hibernate成了持久层处理技术的代表。其实这几种技术各有千秋,因此,Struts+Spring+Hibernate的组合成了采用Java进行Web开发的主流。

通过本书,读者可以了解Ajax、JSON、JSF、Struts 2、Spring 2、Hibernate 3、JPA、JSP、Servlet、JDBC、JPA等目前最主流、应用最广泛的开发技术,还可以掌握Eclipse、Tomcat、JUnit、Log4j、JFreeChart、Dom4j等辅助工具的使用方法;通过本书的示例,读者还可以掌握面向对象的技术方法。本书通过多种前台技术和后台技术的不同组合,让读者深入地了解这些流行架构的使用方法。

如何学习Java Web开发技术

在学习Java Web开发技术时,首先要了解它的基本原理和相关的技术,目的是真正明白什么是J2EE,从而建立起一种大局观。然后通过对Struts、Spring等流行框架的学习,快速掌握使用它们来开发系统的技术,从而增强学习J2EE的信心。在初步掌握了Struts、Spring等技术后,要再回过头来,学习最基本的JSP、Servlet、JDBC等技术,因为不管是哪个流行框架,最终还是通过JSP、Servlet技术实现的,因此深刻地理解这些技术,对于更好地使用那些流行框架有很大的好处。在领悟了最本质的技术后,就会对Struts、Spring、Hibernate等框架有新的认识,也能够灵活地对这些框架进行组合应用了,本书就是按照这个思路来编排的。

和其他书籍相比,本书有何特点(1)技术全面

本书讲解了Ajax、JSON、JSF、Struts 2、Spring 2、Hibernate 3、JPA、JSP、Servlet、JDBC、JPA等技术,涵盖了目前采用Java进行Web开发的主流技术。除此之外,还讲解了各种Java Web开发的辅助工具,比如JUnit、Log4j、JFreeChart、Dom4j等,读者通过阅读本书即可掌握Java Web开发所需要的相关工具和软件的使用。(2)由浅入深

让读者能很快地进行Java Web开发。每章都是从一个简单的示例入手,让读者快速了解本章内容,然后再详细讲解本章涉及的基本原理和知识点,最后,通过一个详细的示例来巩固读者的学习成果,这样由浅入深符合读者的接受过程。(3)实战性强

本书选用的实例都是非常经典的,具有很强的实战性,比如网上考试等系统,读者在这些实例的基础上稍加修改,就可以直接应用,能够很好地满足实际的业务需求。(4)采用面向对象的思想

本书的每个实例都采用面向对象的思想进行设计开发,首先从需求的提出开始,然后进行需求分析、架构设计、系统设计、数据库设计、编码、测试、部署,最终到程序的演示,使开发人员能够从头到尾了解整个系统的开发过程。

本书包括的内容

本书主要包含5部分的内容。

第一部分首先对J2EE的来源、整体框架和它的核心技术,以及MVC模式的设计思想、规范及它的优缺点进行了讲解,然后对Java Web环境的建立、数据库的搭建进行了介绍;

第二部分主要是对一些基本技术比如:JavaScript、JSP、Servlet、JDBC进行讲解;

第三部分主要是对Ajax、Struts、Spring 2、Hibernate 3、JPA 进行了讲解;

第四部分主要是对Log4j、Dom4j、JUnit和JFreeChart等工具的使用方法进行了介绍;

第五部分笔者精选了大量的案例,在讲解时按照软件开发的过程,采用面向对象的设计思想,通过不同技术的整合来实现这些案例,使读者最终能够达到实战的目的。

书中案例列表

书中采用了大量的案例,每个案例都有针对性地讲解若干技术的组合,这样可以快速提高读者的开发水平。

● 档案管理系统:采用UML+JSP+Spring+Struts 2实现,参考本书第9章。

● 权限管理系统:采用JSP+Spring+EJB 3实现,参考本书第10章。

● 图书管理系统:采用JSP+Spring+Hibernate实现,参考本书第11章。

● 注册管理系统:采用JSP+JavaBean实现,参考本书第16章。

● 新闻发布系统:采用JSP+JavaBean+Servlet实现,参考本书第17章。

● 网上购物系统:采用Ajax+Struts+Hibernate实现,参考本书第18章。

● 用户管理系统:采用Spring+Hibernate实现,参考本书第19章。

● 留言薄管理系统:采用JSF+Struts+Spring实现,参考本书第20章。

● 网上考试系统:采用Struts+Spring+Hibernate+JPA实现,参考本书第21章。

实用超值的DVD光盘

本书附赠DVD光盘1张,内容包括源代码和Java Web开发入门视频。

● 源代码:包括本书第4,9,10,11,16~21章的源代码。

● Java Web开发入门视频:免费提供给读者13个小时的Java Web开发入门视频讲解。

适合阅读本书的读者

本书具有实战性强、技术全面、内容量大、示例丰富的特点,力求以通俗的语言及丰富的实例来指导读者透彻掌握如何将目前流行的Ajax、JSON、JSF、Struts 2、Spring 2、JPA等技术运用在实际的程序设计中;但本书并不对这些技术进行深入的讲解,有需要的读者可以参考其他专业书籍以了解某一技术。本书适用于初、中、高级软件设计人员,尤其是对想学习Java Web开发的各种流行技术,而又不得其法的开发人员阅读,同时也可用作高校相关专业和社会培训班的教材。

本书作者

本书由郭锋主笔编写,其他参与编写的人员还有昊燃、黄叶新、李增辉、刘聪、龙志标、孟劼、米爱中、秦侠、冉剑、任潇、谭励、王大亮、伍云辉、于重重,在此一并表示感谢。

作者

2009年4月

第0章 Java Web开发总览

在阅读本书之前,请各位读者务必先阅读本章的内容。本章主要描述项目开发的流程、如何进行架构设计、如何设计包结构等内容,这些内容是本书编写的基础。通过对本章节的阅读,读者可以了解本书各章节安排的基本指导思想,本书精选案例的设计思路。

1.软件开发的整体流程

目前比较常见的软件开发流程有:瀑布开发、RUP(统一过程)、敏捷开发等,其中RUP的框架图如图0.1所示。图0.1 RUP的框架图

一般来讲,一个项目的开发流程主要包括:项目启动、需求调研、设计开发、测试、部署、项目总结、运行维护,在此过程中还伴随着项目管理、配置管理、质量保证等过程。这些阶段的含义如下:

● 项目启动是指《项目愿景和范围》和《项目执行计划书》评审通过后,即由项目经理告知配置管理人员分别在相应的管理工具中建立该项目和相关目录,并对项目组成员进行相应授权。

● 需求调研是指在获取需求过程中,需求人员需要编写软件需求规格说明书并建立需求跟踪矩阵。

● 设计开发是指开发经理将任务分配给设计开发人员,设计开发人员在工具中将分配的任务状态改为处理中,在设计过程中,设计人员将设计过程中产生的文档存放在工具的相应目录中,编码人员每天将代码上传至代码管理工具,完成某项分配任务的功能后,根据版本号对领域打标签,然后在管理工具中修改分配内容状态为已解决,并将标签名和打标签的位置记录在所分配内容的备注中。

● 测试是指测试人员编写测试用例、测试计划,并对开发人员提交的代码进行测试,全部测试完毕后,提供最终全部测试通过的标签给部署人员。

● 部署是指部署人员根据测试人员提供的标签,将程序部署至培训机,并邮件通知项目经理,项目经理组织相关人员进行培训,培训没有发现问题,则通知部署人员,部署人员修改分配内容为已发布,然后部署人员根据版本发布日期按计划将程序部署至正式机,并通知项目经理。

一个比较实用的软件开发的整体流程图如图0.2所示。图0.2 一个比较实用的软件开发的整体流程图

本书后面的所有精选案例都是按照这样的软件开发流程来实现的。

2.架构设计的核心思想

在介绍架构设计的相关知识前,先澄清两个概念:

● 模式,即pattern。其实就是解决某一类问题的方法论。把解决某类问题的方法总结归纳到理论高度,那就是模式。

● 框架,即 framework。其实就是某种应用的半成品,开发人员可以在此基础上扩充完善,从而开发出软件来。

为什么要用模式?因为模式是一种指导,在一个良好的指导下,有助于开发人员完成任务,做出一个优良的设计方案,达到事半功倍的效果;而且会得到解决问题的最佳办法。

为什么要用框架?因为软件系统发展到今天已经很复杂了,特别是服务器端软件,涉及的知识、内容、问题太多。在某些方面使用别人的成熟框架,就相当于让别人帮自己完成一些基础工作,而开发人员只需要集中精力完成系统的业务逻辑设计即可。而且框架一般是成熟、稳健的,它可以处理系统的很多细节问题,比如,事务处理、安全性、数据流控制等问题。还有,框架一般都经过很多人使用,所以结构很好,扩展性也很好,而且它是不断升级的,开发人员可以直接享受别人升级代码带来的好处。

在软件开发过程中,有一个重要的环节就是软件架构设计,经过这么多年的发展,在Java Web开发方面最为经典的设计思想就是MVC模式,MVC的英文全称是Model-View-Controller,中文的意思是“模式-视图-控制器”。MVC的处理过程:首先用户通过视图层发出请求;接着控制器接收用户的请求,并决定应该调用哪个模型来进行处理;然后模型用业务逻辑来处理用户的请求并返回数据;最后控制器将处理后的数据传递给视图层,并通过视图层展现给用户。MVC模式的功能示意图如图0.3所示。图0.3 MVC模式的功能示意图

MVC设计模式的理念虽然很好,但技术实现起来却很困难,这主要是由HTML的实现所决定的,这种基于请求/响应的实现方式,很难做到如果有变化了能够及时通知。当J2EE的JSP Model 2规范出来以后,才有了实现MVC的设计模式的可能。它用JSP技术实现视图的功能,用Servlet技术实现控制器的功能,用JavaBean技术实现模型的功能。Sun公司共制定了两种JSP的规范,分别是Model 1和Model 2规范。

Model 1的架构图如图0.4所示。图0.4 Model 1的架构图

本书第16章“注册管理系统”就是采用Model 1的架构实现的。

Model 2 表示的是基于MVC模式的框架,通过这种设计模型把应用逻辑、处理过程和显示逻辑分成不同的组件实现。这些组件可以进行交互和重用,从而弥补了Model 1的不足。

Model 2的架构图如图0.5所示。图0.5 Model 2的架构图

本书第17章“新闻发布系统”就是采用笔者自己编写的一个Model 2的架构实现的。MVC本身就是一个非常复杂的系统,所以采用MVC实现Web应用时,最好选择一个现成的MVC框架,在此之上进行开发,从而取得事半功倍的效果。现在有很多可供使用的MVC框架,在进行MVC框架选择时,主要是考虑View层、Controller层、Model层和持久层的技术实现。

在View层,目前有很多实现技术,比如最基本的JSP、Velocity、FreeMarker、SiteMesh、JSF等,其实每种技术都有自己的一个适用范围,Velocity和FreeMarker是模板引擎,SiteMesh用来做页面装饰、布局,最常用的应该是JSP技术了。

在Controller层和Model层,Struts和Spring是最常用的开源框架,其中Struts 2与View层的各种技术结合得比较好,Spring更多的是用在IOC(依赖注入)方面,而且在持久层的整合方面,Spring提供了很好的支持。

在持久层,目前的主流是Hibernate,除此之外还有iBATIS、TopLinkJPA、OpenJPA等,如果想自己更多地编写SQL语句,则可以使用iBATIS;如果想彻底地面向对象的持久层设计,则可以使用Hibernate。

综上所述,目前最流行的框架组合是Struts+Spring+Hibernate。在本书精选的案例中,笔者分别采用了DWR、JSON、JSF、Struts、Spring、Hibernate、TopLinkJPA、OpenJPA等不同的组合来实现一些系统的开发,通过这些组合的学习,希望读者对上述技术有更深入的认识。采用Ajax是为了更好地拥有用户体验,采用JSF是为了更好地分离视图层和模型层,采用JPA是为了更好地设计持久层,但并不是说所有的系统都需要采用这些技术。

比如,对于登录来说,采用Ajax来进行验证能够更方便用户体验;但对于一些正常的应用来说,采用Ajax就显得有些多余了,不但增加了开发的复杂程度,也并没有提高多少用户体验,因此此时完全没有必要采用Ajax技术。

对于JSF来说,它本身就实现了MVC的思想,而Struts也实现了MVC的思想,因此两者其实有部分内容是重合的,也完全没有必要采用JSF和Struts的整合,即要么单独使用JSF,要么单独使用Struts。

3.包结构的设计

J2EE的项目看起来很复杂,让初学者不知所措。下面以一个案例为例,讲解各个开发包的功能。从图0.6可以看出,包结构的设计如下:

● com.系统名.action:用来存放控制器类。

● com.系统名.domain:用来存放实体类。

● com.系统名.service:用来存放业务逻辑接口类。

● com.系统名.service.impl:用来存放业务逻辑实体类。

● com.系统名.dao:用来存放DAO接口类。

● com.系统名.dao.impl:用来存放DAO的实体类。

所有的JSP页面存放在JSP文件夹下,其中以网上考试系统为例来说明包结构,如图0.6所示。图0.6 网上考试系统的包结构

对于类及其变量、方法的命名网上有很多参考资料,这里不再详述,只是简单地介绍一下好的命名规则:

● 使用可以正确地形容 variable/field/class 的完整的英文描述单词。例如 accountDao,mailSender,orderService等。虽然像x1,y1,z1,fn 很容易使用,因为很短,如果把写程序当成像打字一样,这样的命名真的很省事,但却造成代码很难被了解、维护和新增功能。

● 使用应用在领域模型上的术语。如果使用者把客户称做customers,那么就用Customer为class命名,而非Client。

● 使用混和词让名字更容易读懂。把数个有意义的单词连在一起命名,一般都是小写,但 class 与interface 的第一个字母与其他非第一个组合单词的首字母要大写。

● 虽然命名要有意义,但也不要太长,尽量控制在15个字母以下。不过,这是在不会牺牲可读性的最高指导原则下。

● 对标准的首字母缩略字(standard acronyms)首字母大写。例如,SQL这个英文单词定义为变量时命名成sqlDatabase,或者定义为类时命名成SqlDatabase,比sQLDatabase和SQLDatabase更容易被读懂。

第一部分

第1章 Java Web开发思想

随着 IT 技术的发展和企业对信息化需求的日益增加,在软件开发技术方面逐渐分为了两个阵营:Java 和.Net。因为 Java 在安全性、跨平台性以及分层次的架构方面有着不可比拟的优势,所以特别适合于大型企业级应用的开发,JavaEE就是Java平台中专门为企业应用制订的标准框架。本章将从 JavaEE 的发展讲起,在读者了解了JavaEE的运行模式后,再逐个讲解JavaEE的核心技术,然后通过对 MVC 模式的讲解,使读者认识到 MVC 是如何实现JavaEE框架的,最后讲解Java Web开发所需的常用技术。

1.1 JavaEE简介

Java 平台有三个版本,这使得软件开发人员、服务提供商和设备生产商可以针对特定的市场进行软件开发。这三个版本分别是:JavaSE(Java Platform,Standard Edition)、JavaEE(Java Platform,Enterprise Edition)、JavaME(Java Platform,Micro Edition)。

JavaSE以前称为J2SE,适用于桌面系统开发,它包含了支持Java Web服务开发的类,并为 JavaEE提供基础。JavaEE以前称为J2EE,适用于企业级应用开发,它是在JavaSE的基础上构建的,它提供Web服务、组件模型、管理和通信API,可以用来实现企业级的SOA(面向服务体系结构)和Web 2.0应用程序。JavaME以前称为J2ME,适用于小型设备和智能卡开发,基于JavaME规范的应用程序只需编写一次,就可以用于许多设备,而且可以利用每个设备的本机功能。本书主要讲解JavaEE。1.1.1 JavaEE的发展

网络从根本上改变了人类的生活,也改变了对企业软件的需求,每天企业都有成千上万的请求需要处理,这些请求和处理具有如下特点:

● 大部分来自网络。

● 需要支持并发请求。

● 需要提供事务支持。

● 需要在多个系统之间进行交互。

● 需要提供集群功能。

● 需要提供分布式功能。

● 需要安全性支持。

● 需要持久化数据处理功能。

然而传统的Client/Server(客户/服务器)结构已经逐渐不能适应新的要求,正是基于这个背景,Sun公司推出了JavaEE,试图通过构建一个新的架构来满足互联网对性能、安全性、易用性、可用性、可扩充性、分布式的需求。

JavaEE通过提供如下的技术来满足上述需求:

● Servlet/JSP:提供了对网络请求进行处理的功能。

● JTA/JTS:提供了事务服务和分布式事务管理功能。

● JMS/JDBC/WebSerivce/Mail/RMI/EJB:提供了交互支持,不同系统之间可以通过多种方式交互。

● JAAS:Java认证与授权服务,提供了对Java组件的安全保护功能。

● JPA:提供了O/R Mapping(对象/关系映射)。相对于其他O/R Mapping工具来说,JPA提供了最小的特性。

● JavaEE Application Server:提供了集群、负载平衡支持功能。

当然,JavaEE还提供了其他的技术来满足企业应用,这里就不一一举例了。

在1997年,Sun公司发布了Servlet技术和JSP技术;1998年,发布了EJB1.0标准;1999年,Sun正式发布了J2EE的第一个版本;2000年,发布了J2EE1.2;在2001年发布了J2EE 1.3;在2003年发布了J2EE 1.4;在2005年年底又发布了J2EE 1.5,即JavaEE。JavaEE的发展路线图如图1.1所示。图1.1 JavaEE的发展路线图

最初,JavaEE叫做J2EE,随着J2EE 1.5标准的发布,Sun将J2EE正式更名为JavaEE,与此对应,J2SE和J2ME平台也更名为JavaSE和JavaME。之所以改名,目的还是让大家清楚J2EE只是Java企业应用,而企业需要一个跨J2SE/Web/EJB的微容器,以保护业务核心组件,延续它的生命力,而不是依赖于J2SE/J2EE版本。

在2007年年底,Bill Shannon已经向JCP(Java Community Process)提交了JavaEE 6草案。JavaEE 6主要在扩展性、Profiles、裁减和SOA方面有一些新的改善。

JavaEE 6中新的改善主要表现在:把一些技术以插件的形式而不是以扩展的形式增加到JavaEE应用服务器,通过增加可扩展性的点和更多服务接口,其他技术能够以插件的形式添加到平台实现中显得更加有效和整洁,对开发者来说使用起来更加容易。

JavaEE平台应该引入JavaEE Platform Profiles,Profiles将参考JavaEE Platform,由JCP定义,包括JavaEE Platform的一些技术,增加一些JCP技术,而这些技术不是基于JavaEE Platform技术的一部分,将那些不太需要的技术以合理的方式从JavaEE中裁减出去。Java EE 6需要增强对Web Services的支持。

说明:JCP(Java Community Process)是一个开放的国际组织,主要由Java开发者以及被授权者组成,职能是发展和更新Java技术规范、参考实现(RI)、技术兼容包(TCK)。JCP维护的规范包括JavaME、JavaSE、JavaEE、XML、OSS、JAIN等。1.1.2 JavaEE运行模式

JavaEE并非一个产品,而是一系列技术和标准的集合。它为应用Java技术开发服务器端应用提供一个平台独立的、可移植的、多用户的、安全的和基于标准的企业级平台,从而简化企业应用的开发、管理和部署。具体的JavaEE平台产品由各厂商实现并遵循同一个标准。JavaEE平台继承了Java语言的安全性和高可靠性,为企业应用的设计、开发、部署和管理提供了一套完善的解决方案,它包括了从前端Web界面到中间件,再到后端数据库系统的一系列技术和规范。

JavaEE提供了一套标准的API和已组件为基础的企业架构,尤其值得注意的是,JavaEE提出了一个新的容器概念,通过容器来提供标准的系统底层服务,大大降低了企业级开发的复杂度。JavaEE的服务和容器示意图如图1.2所示。图1.2 JavaEE的服务和容器示意图

JavaEE的服务包含Web容器和EJB容器,它所提供的Servlet和JSP技术都可以实现Web容器。Servlet是一个Java类,它可以动态地处理请求并做出响应;JSP是在HTML页面中嵌套Java代码的文本,它编译后的源代码就是Servelt,但它比Servlet提供了更好的展现方式。EJB容器主要用来进行业务逻辑的处理,这种方式能够提供较好的安全性和可靠性,它由运行在业务逻辑层的Enterprise JavaBean处理。一个Enterprise JavaBean从客户端接收数据,然后进行业务逻辑处理,还可以将处理后的数据进行存储,同时它也可以从存储器获取数据,处理后将其发送到客户端。

JavaEE平台使用了一个多层的分布式应用程序模型。它主要分为客户端层、Web层、业务层和EIS(企业信息系统)层,JavaEE的分层结构如图1.3所示。图1.3 JavaEE的分层结构

JavaEE中各层之间的运行模式如图1.4所示。图1.4 JavaEE中各层之间的运行模式

1.2 JavaEE核心技术

JavaEE为了适应大型企业级系统开发的需要,制定和规范了大量的技术,JavaEE核心技术平台如图1.5所示。图1.5 JavaEE核心技术平台

下面对JavaEE所涉及的核心技术进行简要讲解。1.2.1 JSP(Java服务页面)

JSP(Java Server Pages)是由Sun公司组织其他公司一起建立的一种动态网页技术标准。JSP技术的推出是为了对抗ASP,但它又有点类似ASP技术,它可以在传统的网页HTML文件中插入Java程序段和脚本文件以及JSP标记。用JSP开发的Web应用是跨平台的,既能在Linux下运行,也能在其他操作系统上运行。

JSP的运行方式是:当客户端向服务器发出请求时,被请求的JSP首先被Web 应用服务器编译成Servlet 并执行,然后将所产生的结果作为一个HTML文件传给浏览器。如果该JSP文件没有被修改过,当客户端再次向服务器发出请求时,JSP文件将不会再被编译,而是直接执行已编译好的Servlet,从而加快了访问速度。

JSP内置了6种对象,它们分别是:

● Request,该对象封装了用户提交的信息,通过调用该对象相应的方法可以获取用户提交的信息。

● Response,该对象对客户的请求做出动态的响应,向客户端发送数据。

● Session,该对象在第一个JSP页面被装载时自动创建,同时产生一个ID号,JSP引擎同时将这个ID号发送到客户端,存放在Cookie中,当客户再次访问连接该服务器的其他页面时,不再分配给客户新的Session对象,这样Session对象和客户之间就建立了一一对应的关系。直到客户关闭浏览器后,服务器端该客户的Session对象才取消,并且和客户的会话对应关系消失,当客户重新打开浏览器再次连接到该服务器时,服务器为该客户再创建一个新的Session对象。

● Application,该对象当服务器启动时自动创建,当客户在所访问网站的各个页面之间浏览时,共享同一个Application对象,直到服务器关闭。与Session对象不同的是所有客户端共享一个Application对象,而Session对象是一个客户共享一个Session对象。

● Out,该对象是一个输出流,用来向客户端输出各种数据。

● Cookie,该对象是服务器保存在客户端硬盘上的一段文本,它以“关键字=值”的格式来保存内容,并且允许用户自己创建和读取它。1.2.2 Servlet

借助Java的跨平台特性,Servlet被设计成一种独立于平台和协议的服务器端的Java应用程序,可以生成动态的Web页面。Servlet由Web服务器进行加载,该Web服务器必须包含支持Servlet的Java虚拟机。Servlet不是独立的Java应用程序,没有main方法,它不是由用户直接调用,而是由容器调用。

JSP编译后就是Servlet,但它并没有增强Servlet的功能,只是比直接使用Servlet进行编程更加方便。Servlet采用请求响应的工作方式,Servlet技术作为Web服务器功能的增强器,其功能涵盖了从客户端请求响应动态生成文档到保证会话安全,访问后台数据库服务器等。

每个Servlet都有自己的生命周期,都包含init和destroy方法,每个Servlet都需要实现Servlet接口,其主要的逻辑将集中在service方法中。当一个请求映射到一个Servlet时,该容器执行下列步骤:

● 如果一个Servlet的实例并不存在,Web容器将加载Servlet类,创建一个Servlet类的实例,调用init方法初始化Servlet实例。

● 调用service方法,传递一个请求和响应对象。

● 如果该容器要移除这个Servlet,可调用Servlet的destroy方法来结束该Servlet。

Servlet的生命周期包括加载、初始化、处理客户端请求以及服务结束。

1.加载、初始化

在 Servlet 的生命周期中,仅执行一次 init方法,它是在服务器装入 Servlet 时执行的。可以配置服务器,以便在启动服务器或客户机首次访问 Servlet 时装入 Servlet。无论有多少客户机访问 Servlet,都不会重复执行 init方法。

2.处理客户端请求

每一个请求由ServletRequest类型的对象代表,而Servlet使用ServletResponse返回该请求。这些对象被作为service方法的参数传递给Servlet,service方法是 Servlet 的核心。每当一个客户请求一个ServletRequest对象时,该对象的service方法就要被调用。

当一个客户通过HTML 表单发出一个HTTP POST请求时,doPost方法被调用;当一个客户通过HTML 表单发出一个HTTP GET请求或直接请求一个URL时,doGet方法被调用。与GET请求相关的参数添加到URL的后面,并与这个请求一起发送。

在HTTP请求的情况下,容器必须提供代表请求和响应的HttpServletRequest和HttpServletResponse的具体实现。

3.服务结束

destroy方法和init方法一样,仅执行一次,即在服务器停止且卸装Servlet 时执行该方法。当服务器卸装 Servlet 时,将在所有 service方法调用完成后,或在指定的时间间隔过后调用 destroy方法。一个Servlet 在运行service方法时可能会产生其他的线程,因此请确认在调用 destroy方法时,这些线程已终止或完成。一旦destroy方法被调用,容器就不会再向该实例发送任何请求;如果容器需要再使用该Servlet,则必须创建新的实例。1.2.3 EJB(企业JavaBean)

EJB是一个Java服务器端组件开发的规范,定义了一个用来开发面向对象分布式应用组件的标准方法,软件厂商根据它来实现EJB服务器。EJB主要由三种Bean组成:

● 会话Bean,用于实现业务逻辑,它可以是有状态的,也可以是无状态的。每当客户端请求时,容器就会选择一个会话Bean来为客户端服务。

● 实体 Bean,用于实现 O/R(对象/关系)映射,负责将数据库中的表记录映射为内存中的 Entity 对象,事实上,创建一个实体 Bean 对象相当于新建一条记录;修改一个实体 Bean 时,容器会自动将 Entity Bean 的状态和数据库同步;删除一个实体 Bean会同时从数据库中删除对应记录。

● 消息驱动Bean,它基于JMS消息,只能接收客户端发送的JMS消息然后处理。它实际上是一个异步的无状态会话Bean,客户端调用消息驱动Bean后无须等待,立刻返回,消息驱动Bean将异步处理客户端请求。

Java程序员可以将一些EJB组件组合起来,从而方便、快捷地构建起分布式应用程序。EJB规范在简化分布式应用程序开发复杂性方面也做了大量的工作,EJB程序员不必太担心事务处理、多线程、资源管理等方面的问题,可以专注于支持应用所需的商业逻辑,而不用担心周围框架的实现问题。使用EJB可以使整个程序分块明确,并且EJB可以使用其他EJB或JDBC等服务,从而增强了分布式应用程序的可扩展性和性能;另外,EJB的使用增强了整个系统程序的可靠性、可管理性和可移植性。

EJB的调用过程由如下几步组成:初始化上下文InitialContext,再获取远程的或者本地的Home接口,然后进行Home.create(),获取远程EJB对象,最后通过EJB对象调用业务方法。1.2.4 JDBC(Java数据库连接)

JDBC是Java提供的用来执行SQL语句的Java API,可以为多种关系数据库提供统一访问。它由一组用Java语言编写的类和接口组成,是用于Java应用程序连接数据库的标准方法。有了JDBC,向各种关系数据发送SQL语句就是一件很容易的事了。像ODBC一样,JDBC对开发者屏蔽了一些细节问题;另外,JDBC对数据库的访问也具有平台无关性,JDBC使用已有的SQL标准并支持与其他数据库连接标准。

JDBC用来和数据库打交道的一般步骤是:加载驱动程序、与数据库建立连接、发送 SQL 语句、处理结果。示意代码如下:

目前,比较常见的JDBC驱动程序可分为以下4类:

● JDBC-ODBC桥+ODBC驱动程序:JDBC桥产品利用ODBC驱动程序提供JDBC访问。这种类型的驱动程序最适合于企业网,或者是用Java编写的具有三层结构的应用程序服务器。

● 本地API:这种类型的驱动程序把客户机API上的JDBC调用转换为Oracle、Sybase、Informix、DB2或其他DBMS的调用。

● JDBC网络纯Java驱动程序:这种驱动程序将JDBC转换为与DBMS无关的网络协议,之后这种协议又被某个服务器转换为一种DBMS协议。这种网络服务器中间件能够将它的纯Java客户机连接到多种不同的数据库上,所用的具体协议取决于提供者。这是最为灵活的 JDBC 驱动程序,有可能所有的这种解决方案的提供者都提供适合于Intranet用的产品。

● 本地协议纯Java驱动程序:这种类型的驱动程序将JDBC调用直接转换为DBMS所使用的网络协议。这将允许从客户机上直接调用DBMS服务器,是Intranet访问的一个很实用的解决方法。由于许多这样的协议都是专用的,因此数据库提供者自己将是主要来源。1.2.5 JTA(Java事务)

一般来说,事务处理由若干个步骤组成。作为一个整体的操作过程,所有步骤必须同时操作成功或者失败。当所有的步骤都操作成功时,事务就算操作成功了;而当其中某一个步骤操作失败时,该步骤之前的操作就必须撤销。简单来说,所谓事务就是一系列必须都成功的操作,只要有一步操作失败,所有其他的步骤将都得撤销。因此,事务中有提交和回滚两个概念。

● 提交(Commit):当所有的操作步骤都被完整执行后,称该事务被提交。

● 回滚(RollBack):由于某一操作步骤执行失败,导致所有步骤都没有被提交,则事务必须回滚,即回到事务执行前的状态。

在JavaEE中,事务主要有Bean-Managed Transaction和Container-Managed Transaction两大类,其中在Bean-Managed Transaction中还会分为JDBC Transaction和JTA Transaction两种。JTA的英文全称是Java Transaction API,它为 JavaEE 平台提供了分布式事务服务。要用 JTA 进行事务界定、提交和回滚,应用程序需调用 javax.transaction.UserTransaction 接口中的begin、commit和rollback方法。JTA 接口包含在javax.transaction 和 javax.transaction.xa 这两个包中,进行JTA事务处理的示意代码如下:

JTA可以实现同一事务对应不同的数据库,但它无法实现事务的嵌套。JTA只定义了一组Java接口用于描述JavaEE中事务管理器与应用程序、资源管理器以及应用服务器之间的事务通信。它主要包括高层接口(即面向应用程序的接口)、XAResource接口(即面向资源的接口)以及事务管理器的接口,JTA没有具体的实现,JTS是服务OTS的JTA的实现。简单地说,JTS实现了JTA接口,并且符合OTS的规范。1.2.6 JavaMail(Java邮件服务)

JavaMail是Sun公司提供给开发者处理电子邮件的编程接口,它可以方便地执行一些常用的邮件传输。在使用JavaMail开发邮件系统之前,有必要先了解几个常用的邮件传输协议。

● SMTP:英文全称是Simple Mail Transfer Protocol,中文意思是“简单邮件传输协议”,它由RFC821定义,定义了发送邮件的机制。在JavaMail环境中,基于JavaMail的程序将和因特网服务供应商(ISP)的 SMTP 服务器通信,SMTP 服务器会将邮件消息给接收方SMTP服务器,以便最终让用户经由POP或者IMAP获得。

● POP:英文全称是Post Office Protocol,中文意思是“邮局协议”,它一般被称为POP3,代表目前的版本是3。这个协议是由RFC1939定义的。POP是一种机制,因特网上大多数用户用它得到邮件。

● IMAP:英文全称是Internet Message Access Protocol,中文意思是“因特网消息访问协议”,它是更高级的用户接收消息的协议。这个协议由RFC2060定义,它一般被称为IMAP4,代表目前的版本是4。在用到IMAP时,邮件服务器必须支持这个协议。

● MIME:英文全称是Multipurpose Internet Mail Extensions,中文意思是“多用途的因特网邮件扩展”标准,它不是邮件传输协议,只是定义了被传输内容、附件以及其他信息的格式。

核心JavaMail API 由7个类组成:Session、Message、Address、Authenticator、Transport、Store 及 Folder。通过上述类,可以完成包括发送消息、接收消息、认证、回复消息、转发消息、管理附件等功能。使用JavaMail来发送邮件的示意代码如下:1.2.7 JMS(Java消息服务)

JMS是JavaEE中有关面向消息中间件的技术规范,它提供创建、发送、接收、读取消息的服务。它的英文全称是Java Message Service,即Java消息服务。

JMS的消息传递机制分为两种:点对点式(P2P)和发布订阅式(P/S)。两种消息的传递机制都实现了异步传递模式,点对点式通过Queue的形式,在Consumer(消费者)和Producer(制造者)之间进行了安全连接,使得消息传递只在这两者之间进行。如果应用程序开发者希望每一条消息都能够被处理,那么应该使用P2P消息模型;发布订阅式通过Topic的形式,实现一到多的消息广播,如果一定程度的消息传递的不可靠性可以被接受的话,那么应用程序开发者也可以使用P/S消息模型。

JMS中的消息由两部分组成:报头和消息主体。报头由路由信息以及有关该消息的元数据组成;消息主体则携带着应用程序的数据或有效负载。消息可以分为5种类型:简单文本(TextMessage)、可序列化的对象(ObjectMessage)、属性集合(MapMessage)、字节流(BytesMessage)、原始值流(StreamMessage)。

JMS的运行机制是:客户机将消息发送给一个主题或队列,而其他的JMS 客户机则预订或监听这个虚拟通道,当 JMS 客户机发送消息后,它并不等待回应,而是继续执行下一条指令,消息可能最终转发到一个或多个客户机,这些客户机都不需要做出回应。发送一个消息队列的示意代码如下:

接收一个消息队列的示意代码如下:1.2.8 RMI(远程方法调用)

RMI允许开发人员使用Java编写分布式对象,它大大增强了Java开发分布式应用的能力。RMI的英文全称是Remote Method Invocation,即远程方法调用,它支持存储于不同地址空间的程序级对象之间彼此进行通信,实现远程对象之间的无缝远程调用。

RMI用来进行通信的协议是JRMP(Java Remote Messaging Protocol,Java远程消息交换协议),JRMP是专为Java的远程对象制定的协议,是分布式应用系统的Java解决方案,但RMI对于用非Java语言开发的应用系统的支持不足,不能与用非Java语言书写的对象进行通信。

使用RMI的步骤如下:

● 定义和实现远端接口中的参数。

● 定义和实现远端接口。

● 编写服务端代码。

● 编写客户端代码。

● 生成 stub 和 skeltion,并将 stub 打包到客户端 jar 中,将 skeltion 打包到服务器端 jar中。

● 启动rmiregistry,并将服务注册到rmiregistry中,然后运行代码。1.2.9 JNDI(Java命名和目录服务)

JNDI是Sun公司提供的一种标准的Java命名系统接口,它的英文全称为Java Naming and Directory Interface,即Java命名和目录服务。它是一个应用程序设计的API,为开发人员提供了查找和访问各种命名和目录服务的通用、统一的接口,类似于JDBC,都是构建在抽象层上。使用JNDI的示意代码如下:

为了让 JNDI 解析 java:comp/env/jdbc/mydb,必须把标签插入 web.xml 文件中。web.xml文件中的示意代码如下:1.2.10 XML(扩展标识语言)

XML的英文全称是eXtensible Markup Language,它是一种简单的数据存储语言,使用一系列简单的标记描述数据,而这些标记可以用方便的方式建立。虽然XML比二进制数据要占用更多的空间,但XML极其简单且易于掌握和使用。与数据库不同的是,XML不提供数据索引、排序、查找等功能,它仅仅是展示数据。下面展示一个XML的示例:

SGML是所有标记语言的母语言,HTML和XML都派生自SGML,这三者之间的关系如图1.6所示。图1.6 HTML、XML和SGML之间的关系

HTML、SGML和XML将凭借各自的特点继续用于其合适的地方,它们中的任何一个都不会使其他的废弃。HTML 仍是在Web 上快速发布数据的最简单的方法;SGML在高端复杂结构的应用以及规范制定方面将继续适用;而对于数据广泛性和灵活性有特定要求的用户,XML则是最好的选择。1.2.11 JMX(Java分布式管理)

JMX是一个为应用程序、设备、系统等植入管理功能的框架,它的英文全称是Java Management Extensions,即Java分布式管理。JMX可以跨越一系列异构操作系统平台、系统体系结构和网络传输协议,灵活地开发无缝集成的系统、网络和服务管理应用。

JMX的体系结构图如图1.7所示。图1.7 JMX的体系结构图

JMX的体系结构分为以下4个层次:

● 设备层:主要定义了信息模型。在 JMX 中,各种管理对象以管理构件的形式存在,需要管理时,向MBean服务器进行注册。

● 代理层:主要定义了各种服务以及通信模型。该层的核心是一个 MBean 服务器,所有的管理构件都需要向它注册,才能被管理。

● 分布服务层:主要定义了能对代理层进行操作的管理接口和构件,这样管理者就可以操作代理了。

● 附加管理协议 API:定义的 API 主要用来支持当前已经存在的网络管理协议,如SNMP、TMN、CIM/WBEM等。1.2.12 JACC(Java容器授权合同)

JACC为了将各种授权认证服务器置入到JavaEE产品中,它在JavaEE应用服务器和特定的授权认证服务器之间定义了一个连接协约。JACC的英文全称是Java Authorization Service Provider Contract for Containers,它是一种基于标准的方法,用于将外部安全管理器与应用服务器集成。JACC 提供了将安全授权的权限检查委托给外部提供程序的功能。由于授权检查是在容器将控制权交给应用程序前进行的,因此 JACC 具有能够清楚区分自定义授权逻辑和应用程序逻辑的优势,从而满足了关注点分离的需求。1.2.13 JCA(Java连接器体系)

JCA定义了一种使 JavaEE 应用程序与EIS用一种安全的、事务性的方式进行通信的方法。JCA的英文全称是Java Connector Architecture,即Java 连接器体系,它帮助开发者进行不同种类的EIS 之间的无缝集成,用一种安全的、事务性的方法连接JavaEE应用程序和非 JavaEE 环境。JCA 连接器一方面与JavaEE应用服务器建立系统级连接,另一方面与访问EIS 资源的应用组件建立应用级连接。

JCA 规范中定义了两种级别的编程接口:

● 一种接口是公共客户机接口,任何 JavaEE组件都可以用这种接口与 EIS 进行交互。

● 另一种接口是系统编程接口,它们只在应用程序服务器内部使用。

JCA的体系结构图如图1.8所示。图1.8 JCA的体系结构图

使用JCA比使用JMS能更好地结合JavaEE 应用程序和EIS,使用JCA和JMS连接JavaEE和EIS的示意图如图1.9所示。图1.9 使用JCA和JMS连接JavaEE和EIS的示意图

1.3 MVC模式原理

MVC的英文全称是Model-View-Controller,中文的意思是“模式-视图-控制器”。MVC模式起源于Smalltalk语言,它是Xerox PARC在20世纪80年代为编程语言Smalltalk-80发明的一种软件设计模式,MVC模式的结构由以下3个部分组成:模型(Model)、视图(View)和控制器(Controller)。MVC模式的结构图如图1.10所示。图1.10 MVC模式的结构图

图1.10的意思是:不管是视图的改变还是模型的改变,或者控制器的改变,都会引起另外两个的改变,按照模型层、视图层、控制层进行分解,从而使得整个系统责任明确、接口清晰,加快了设计开发过程。下面分别来介绍这三个层次。

1.模型层

这里的模型就是指业务逻辑的处理和数据的存储,它分为两类模型:业务逻辑模型和数据模型。模型接收视图请求的数据,并返回最终的处理结果。这里只所以把模型层单独地抽取出来,是为了应对业务规则的变化,也是判断开发人员是否优秀的设计依据。MVC并没有提供模型的设计方法,而只告诉开发人员应该组织管理这些模型,以便于模型的重构和提高重用性。

数据模型就是指对数据的持久化,它实现了对视图和模型之间交互的支持。实现时把“做什么(业务处理)”和“怎么做(业务实体)”分离,这样可以实现业务逻辑的重用。对一个开发者来说,就可以专注于业务模型的设计。

2.视图层

视图层主要是用来展现用户所需要的数据,它是用户和系统进行交互的界面,这部分工作一般可以由美工人员来进行开发和维护,一般可以采用HTML页面、XML、Servlet和Applet等技术。

一般来说,视图只接收来自模型的数据并显示给用户,以及将用户界面的输入数据和请求传递给控制和模型。MVC设计模式对于视图的处理仅限于视图上数据的采集和处理,以及用户的请求,而不包括在视图上业务流程的处理,业务流程的处理和状态的改变则交给模型层来处理。

视图部分的大致处理流程是:页面模板定义页面的布局,页面配置文件定义视图标签的具体内容,由页面布局策略类初始化并加载页面,每个用户部件根据自己的配置进行初始化,加载校验器并设置参数,以及事件的委托等,用户提交后,通过了表示层的校验,用户部件把数据自动提交给业务实体即模型。

3.控制层

控制层就是一个分发器,选择什么样的模型,选择什么样的视图,可以完成什么样的用户请求。控制层就像一个中转站,它从用户那里接收请求,并根据用户的请求,将模型与视图匹配在一起,共同完成用户的请求。

在实现上,为了能够控制和协调每个用户跨越多个请求的处理,控制机制应该以集中的方式进行管理。用户提交一个表单或者单击一个链接,控制层接收请求后,它本身并不处理业务信息,而是根据用户的请求类型,把用户的信息传递给相对应的模型,告诉模型做什么,等模型处理完毕后,再把模型处理后的数据选择符合要求的视图返回给用户。

通过将模型、视图与控制器分离,使得一个模型可以对应多个视图,一个视图可能对应多个模型。如果用户通过某个视图的控制器改变了模型的数据,所有其他依赖于这些数据的视图都应反映到这些变化。因此,无论何时发生了何种数据变化,控制器都会将变化通知所有的视图,导致显示的更新。

模型、视图、控制器三者之间的关系和各自的主要功能,即它的功能示意图如图1.11所示。图1.11 MVC模式的功能示意图

通过上面的讲解,可以得出MVC的处理过程:首先用户通过视图层发出请求,接着控制器接收用户的请求,并决定应该调用哪个模型来进行处理,然后模型用业务逻辑来处理用户的请求并返回数据,最后控制器将处理后的数据传递给视图层,并通过视图层展现给用户。

1.4 Model规范

MVC设计模式的理念虽然很好,但技术实现起来却很困难,这主要是由HTML的实现所决定的,这种基于请求/响应的实现方式,很难做到如果有变化了能够及时通知。当JavaEE的JSP Model 2规范出来以后,才有了实现MVC设计模式的可能。它用JSP技术实现视图的功能,用Servlet技术实现控制器的功能,用JavaBean技术实现模型的功能。1.4.1 Model 1规范

Sun公司共制定了两种JSP规范,分别是Model 1和Model 2规范,它们分别描述了采用JSP技术构成Web应用的不同模型。

随着JSP技术的推出,在使用Java技术建立Web应用的实例中,这种便于开发的技术就流行起来。JSP页面可以非常容易地将业务逻辑、服务器端处理过程和HTML结合在一起,在JSP页面中同时实现显示、业务逻辑和流程控制,从而可以快速地完成应用开发。现在很多的Web应用就是由一组JSP页面构成的,这种以JSP为中心的开发模型称为Model 1。Model 1的架构图如图1.12所示。

试读结束[说明:试读内容隐藏了图片]

下载完整电子书


相关推荐

最新文章


© 2020 txtepub下载