Java EE应用的分层模型
Java EE大致上都可分为如下几层:
- Domain Object(领域对象)层,此层由一系列的POJO(Plain Old Java Object,普通的、传统的Java对象)组成,这些对象是该系统的Domain Object,往往包含了给所需实现的业务逻辑方法。
- DAO(Data Access Object,数据访问对象)层:此层由一系列的DAO组件组成,这些DAO实现了对数据库的创建、查询、更新和删除(CURD)等原子操作。
- 业务逻辑层:此层由一系列的业务逻辑对象组成,这些业务逻辑对象实现了系统所需要的业务逻辑方法。这些业务逻辑方法可能仅仅用于暴露Domain Object对象所实现的业务逻辑方法,也可能是依赖DAO组件实现的业务逻辑方法。
- 控制器层:此层由一系列控制器组成,这些控制器用于拦截用户请求,并调用业务逻辑组件的业务逻辑方法,处理用户请求,并根据处理结果转发到不同的表现层组件。
- 表现层:此层由一系列的JSP页面、Velocity页面、PDF文档视图组件组成,负责收集用户请求,并显示处理结果。
以EJB3、JPA为核心的Java EE应用的结构分层相似,只是它的DAO层(一般曾为EAO层)组件、业务逻辑层组件都由EJB充当。
Java EE应用的组件
Java EE应用大致包括如下几类组件:
- 表现层组件:主要负责收集用户输入数据,或者向客户显示系统状态。最常用的表现层技术是JSP,但JSP并不是唯一的表现层技术。表现出还可由Velocity、FreeMaker和Tapestry等技术完成,或者使用普通的应用程序充当表现层组件,甚至可以是小型智能设备。
- 控制器组件:对于Java EE的MVC框架而言,框架提供一个前端核心控制器,而核心控制器负责拦截用户请求,并将请求转发给用户实现的控制器组件,而这些用户实现的控制器则负责处理调用业务逻辑方法,处理用户请求。
- 业务逻辑组件:是系统的核心组件,实现系统的业务逻辑。通常,一个业务逻辑方法对应一次用户操作,一个业务逻辑方法应该是一个整体,因此要求对业务逻辑方法增加事务性。业务逻辑方法仅仅负责实现业务逻辑,不应该进行数据库访问,因此,业务逻辑组件中不应该出现原始的Hibernate、JDBC等API。
- DAO组件:Data Access Object,也被称为数据访问对象。这个类型的对象比较缺乏变化,每个DAO组件都提供Domain Object对象基本的创建、查询、更新和删除等操作,这些操作对应数据表的CRUD(创建、查询、更新和删除)等原子操作。当然,如果采用不同的持久层访问技术,DAO组件的实现会完全不同。为了业务逻辑组件的实现与DAO接口变成,这样才能提供更好的解耦。
- 领域对象组件:领域对象(Domain Object)抽象了系统的对象模型。通常而言,这些领域对象的状态都必须保存在数据库里。因此,每个领域对象通常对应一个或多个数据表,领域对象通常需要提供对数据记录访问方式。
常用的Java EE服务器
常见的Web服务器有如下三个。
- Tomcat:Tomcat和Java结合的最好,是Oracle官方推荐的JSP服务器。Tomcat是开源的Web服务器,经过长时间的发展,性能、稳定性等方面都非常优秀。
- Jetty:另一个优秀的Web服务器。Jetty有个更大的优点就是,Jetty可作为一个嵌入式服务器,即:如果在应用中加入Jetty的JAR文件,应用可在代码中对外提供Web服务。
- Resin:目前最快的JSP、Servlet运行平台,支持EJB。个人学习该服务器是免费的,但如果想将该服务器用作商业用途,则需要交纳相应的费用。
除了上面的Web服务器外,还有一些专业的Java EE服务器,相对于Web服务器而言,Java EE服务器支持更多的Java EE特性,例如分布式事物、EJB容器等。常用的Java EE服务器有如下几个。
- JBoss:开源的Java EE服务器,全面支持各种最新的Java EE规范。
- GlassFish:Oracle官方提供的Java EE服务器,通常能最早支持各种Java EE规范。
- WebLogic和WebSphere:这两个是专业的商用Java EE服务器,价格不菲。但在性能等各方面也是相当出色的。
对于轻量级Java EE而言,没有必要使用Java EE服务器,使用简单的Web容易已经完全能胜任。
EJB容器
:Enterprise java bean 容器。更具有行业领域特色。他提供给运行在其中的组件EJB各种管理功能。只要满足J2EE规范的EJB放入该容器,马上就会被容器进行高效率的管理。并且可以通过现成的接口来获得系统级别的服务。例如邮件服务、事务管理。WEB容器和EJB容器在原理上是大体相同的,更多的区别是被隔离的外界环境。WEB容器更多的是跟基于HTTP的请求打交道。而EJB容器不是。它是更多的跟数据库、其它服务打交道。但他们都是把与外界的交互实现从而减轻应用程序的负担。例如SERVLET不用关心HTTP的细节,直接引用环境变量session,request,response就行、EJB不用关心数据库连接速度、各种事务控制,直接由容器来完成。
JSF是Oracle所推荐的Java EE规范
,拥有最纯正的血统,而且Apache也为JSF提供了MyFaces实现,这使得JSF具有很大的吸引力。
EJB(Enterprise JavaBean)
: https://baike.baidu.com/item/EJB/144195?fr=aladdin
ORM(Object Relation Mapping)
:通过技术能让Java以面向对象的方式操作关系数据库。 最早的ORM是Entity EJB(Enterprise JavaBean),EJB就是经典的Java EE应用核心,从EJB 1.0到EJB 2.X,许多人觉得EJB非常繁琐,所以导致EJB备受诟病。
JPA(Java Persistence API)规范
:EJB 2.X被Sun公司抛弃,引入JPA规范,JPA规范其实是一种ORM规范,因此它的底层可以使用Hibernate、TopLink等任意一种ORM框架作为实现。 很明显,如果应用程序面向JPA变成,将可以让应用程序即可利用Hibernate的持久层技术----因为可以用Hibernate作为实现;也可以让应用程序保持较好的可扩展性----因为可以在各种ORM技术之间自由切换。
除了可以使用Hibernate这种ORM框架之外,轻量级Java EE应用通常还可以选择Mybatis框架作为持久层框架,Mybatis(并没有实现JPA的规范,也不是一个完全意义上的ORM框架)是Apache组织提供的另一个轻量级持久层框架,Mybatis允许将SQL语句查询结果映射成对象,因此常常也将Mybatis称为SQL Mapping工具。
Tomcat介绍
Tomcat不仅提供了Web容器的基本功能,还支持JAAS和JNDI绑定等。
JAAS的全称是Java Authentication Authorization Service(Java验证和授权API),它用于控制对Java Web应用的授权访问。
JNDI的全称是Java Naming Directory Interface,即Java命名和目录接口,听起来非常专业,其实很简单:就是为某个Java对象起一个名字。
解压Tomcat后应有如下的文件结构:
- bin:存放启动和关闭Tomcat的命令的路径。
- conf:存放Tomcat的配置,所有的Tomcat的配置都在该路径下设置。
- lib:存放Tomcat服务器的核心类库(JAR文件),如果需要扩展Tomcat功能,也可将第三方类库复制到该路径下。
- logs:这是一个空路径,该路径用于保存Tomcat每次运行后产生的日志。
- temp:保存Web应用运行过程中生成的临时文件。
- webapps:该路径用于自动部署Web应用,将Web应用复制在该路径下,Tomcat会将该应用自动部署在容器中。
- work:保存Web应用在运行中,编译生成的class文件。该文件夹可以删除,但每次启动Tomcat服务器时,系统将再次建立该路径。
- LICENSE等相关文件。
Maven介绍
Maven是一个先进的项目管理工具,它采用一个“约定优于配置(CoC)”的策略来管理项目。它不仅用于把源代码构建成可发布的项目(包括编译、打包、测试和分发),还可以生成报告、生成Web站点等。
解压Maven后应有如下的文件结构:
- bin:保存Maven的可执行命令。其中mvn和mvn.bat就是执行maven工具的命令。
- boot:该目录只包含一个plexus-classworlds-2.5.1.jar。plexus-classworlds是一个类加载器框架,与默认的Java类加载器相比,它提供了更丰富的语法以方便配置,Maven使用该管家加载自己的类库。通常无需理会该文件。
- conf:保存Maven配置文件的目录,该目录包含setting.xml文件,该文件用于设置Maven的全局行为。通常建议将该文件复制到~/.m2/目录下(~表示用户目录),这样可以只设置当前用户的Maven行为。
- lib:该目录包含了所有Maven运行时需要的类库,Maven本身是分模块开发的,因此用户能看到诸如maven-core-3.2.1.jar、maven-repository-metadata-3.2.1.jar等文件。因此,还包含Maven所依赖的第三方类库。
- LICENSE、README.txt等说明性文档。
Maven工具的命令主要就是mvn,该命令的基本格式是:
mvn <plugin-prefix>:<goal> -D<属性名>=<属性名> ...
上面mvn命令中,plugin-prefix是一个有效的插件前缀,goal就是该插件所包含的指定目录,-D用于为该目标指定属性,每次运行mvn命令可通过多个-D选项来制定属性名、属性值。
Maven插件是一个非常重要的概念,从某种程度来看,Maven核心是一个空的“容器”,Maven核心其实并不做什么实际的事情,它只是解析一些XML文档,管理生命周期和插件,除此之外,Maven什么也不懂。Maven的强大来自于它的插件,这些插件可以编译源代码、打包二进制代码、发布站点等。换句话说,Maven的“空”才是它的强大,因为Maven是“空”的,所以它可以装各种插件,因此它的功能可以无限扩展。直接从Apache下载的Maven不知道如何编译Java代码,不知道如何打包WAR文件,也不知道如何运行单元测试......它什么都不懂。当开发者第一次使用全新的Maven运行诸如mvn install命令时,Maven会自动从远程资源库下载大部分核心Maven插件。
Maven插件的功能和用法可登陆
https://maven.apache.org/plugins/index.html页面进行查看。
Maven的核心概念
只要将项目的源文件按Maven要求的规范组织,并提供pom.xml文件,及时pom.xml文件中只包含极少的信息,开发者也依然可以使用Maven来编译项目、运行程序,甚至可以运行测试用例、打包项目,这是因为Maven采用了“约定优于配置(Convention over Configuration,CoC)”的原则,根据此原则,Maven的主要约定有如下几条。
- 源代码应该位于${basedir}/src/main/java路径下。
- 资源文件应该位于${basedir}/src/main/resources路径下。
- 测试代码应该位于${basedir}/src/test路径下。
- 编译生成的class文件应该位于${basedir}/target/classes路径下。
- 项目应该会产生一个JAR文件,并将生成的JAR包放在${basedir}/target路径下。
Maven的生命周期
Maven包含三个基本的生命周期:
- clean生命周期
- default生命周期
- site生命周期
clean生命周期用于在构建项目之前进行一些清理工作,该生命周期包含如下三个核心阶段。
- pre-clean:在构建之前执行预清理。
- clean:执行清理。
- post-clean:最后清理
默认的生命周期包含了项目构建的核心部分,默认的生命周期包含如下核心阶段。
- compile:编译项目。
- test:单元测试。
- package:项目打包。
- install:安装到本地仓库。
- deploy:部署到远程仓库。
site证明周期用于生成项目报告站点、发布站点。该生命周期包含如下核心阶段。
- pre-site:生成站点之前做验证。
- site:生成站点。
- post-site:生成站点之后做验证。
- site-deploy:发布站点到远程服务器。
pom.xml中<scope/>:制定依赖库起作用的范围。该子元素可接受compile、provided、test、system、runtime、import等值。
- compile:默认的范围,编译、测试、打包时需要。
- provided:表示容器会在runtime时提供。
- runtime:表示编译时不需要,但测试和运行时需要,最终打包时会包含进去。
- test:只用于测试阶段。
- system:与provided类似,但要求该JAR是系统中自带的。
- import:继承父POM文件中用dependencyManagement配置的依赖,import范围只能在dependencyManagement元素中使用(为了解决多继承)。
POM文件的元素
- <properties/>:该元素用于定义全局属性。
- <dependencies/>:该元素用于定义依赖院系。该元素可以包含0~N个<dependency/>子元素,每个<dependency/>子元素定义一个依赖关系。
- <dependencyManagement/>:该元素用于定义依赖管理。
- <build/>:该元素用于定义构建信息。
- <reporting/>:该元素用于定义站点报告的相关信息。
- <license/>:该元素用于定义该项目的License信息。
- <organization/>:该元素指定该项目所属的组织信息。
- <developers/>:该元素用于配置该项目的开发者信息。
- <contributors/>:该元素用于配置该项目的贡献者信息。
- <issueManagement/>:定义该项目的bug跟踪系统。
- <mailingLists/>:定义该项目的邮件列表。
- <scm/>:制定该项目源代码管理工具,如CVS、SVN等。
- <repositories/>:该元素用于定义远程资源库的位置。
- <pluginRepositories/>:钙元素用于定义插件资源库的位置。
- <distributionManagement/>:部署管理。
- <profiles/>:该元素指定根据环境调整构建配置。
信息的语句约束可参考
http://maven.apache.org/maven-v4_0_0.xsd文件。