搞定J2EE核心技术与企业应用
上QQ阅读APP看本书,新人免费读10天
设备和账号都新为新人

第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 2等,其实每种技术都有自己的一个适用范围,Velocity和FreeMarker是模板引擎,SiteMesh用来做页面装饰、布局,最常用的应该是JSP技术了。

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

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

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

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

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

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很容易使用,因为很短,如果把写程序当成像打字一样,这样的命名真的很省事,但却造成代码很难被了解、维护和新增功能。

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

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

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

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