Java技术名词

Java EE应用的分层模型

Java EE大体上均可分为以下几层:html

  1. Domain Object(领域对象)层,此层由一系列的POJO(Plain Old Java Object,普通的、传统的Java对象)组成,这些对象是该系统的Domain Object,每每包含了给所需实现的业务逻辑方法。
  2. DAO(Data Access Object,数据访问对象)层:此层由一系列的DAO组件组成,这些DAO实现了对数据库的建立、查询、更新和删除(CURD)等原子操做。
  3. 业务逻辑层:此层由一系列的业务逻辑对象组成,这些业务逻辑对象实现了系统所须要的业务逻辑方法。这些业务逻辑方法可能仅仅用于暴露Domain Object对象所实现的业务逻辑方法,也多是依赖DAO组件实现的业务逻辑方法。
  4. 控制器层:此层由一系列控制器组成,这些控制器用于拦截用户请求,并调用业务逻辑组件的业务逻辑方法,处理用户请求,并根据处理结果转发到不一样的表现层组件。
  5. 表现层:此层由一系列的JSP页面、Velocity页面、PDF文档视图组件组成,负责收集用户请求,并显示处理结果。

以EJB三、JPA为核心的Java EE应用的结构分层类似,只是它的DAO层(通常曾为EAO层)组件、业务逻辑层组件都由EJB充当。前端

Java EE应用的组件

Java EE应用大体包括以下几类组件:java

  • 表现层组件:主要负责收集用户输入数据,或者向客户显示系统状态。最经常使用的表现层技术是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服务器有以下三个。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容易已经彻底能胜任。apache


EJB容器:Enterprise java bean 容器。更具备行业领域特点。他提供给运行在其中的组件EJB各类管理功能。只要知足J2EE规范的EJB放入该容器,立刻就会被容器进行高效率的管理。而且能够经过现成的接口来得到系统级别的服务。例如邮件服务、事务管理。WEB容器和EJB容器在原理上是大致相同的,更多的区别是被隔离的外界环境。WEB容器更多的是跟基于HTTP的请求打交道。而EJB容器不是。它是更多的跟数据库、其它服务打交道。但他们都是把与外界的交互实现从而减轻应用程序的负担。例如SERVLET不用关心HTTP的细节,直接引用环境变量session,request,response就行、EJB不用关心数据库链接速度、各类事务控制,直接由容器来完成。tomcat

JSF是Oracle所推荐的Java EE规范,拥有最纯正的血统,并且Apache也为JSF提供了MyFaces实现,这使得JSF具备很大的吸引力。服务器

EJB(Enterprise JavaBean) : https://baike.baidu.com/item/EJB/144195?fr=aladdinsession


ORM(Object Relation Mapping):经过技术能让Java以面向对象的方式操做关系数据库。
最先的ORM是Entity EJB(Enterprise JavaBean),EJB就是经典的Java EE应用核心,从EJB 1.0到EJB 2.X,许多人以为EJB很是繁琐,因此致使EJB备受诟病。app

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包含三个基本的生命周期:

  1. clean生命周期
  2. default生命周期
  3. site生命周期

clean生命周期用于在构建项目以前进行一些清理工做,该生命周期包含以下三个核心阶段。

  1. pre-clean:在构建以前执行预清理。
  2. clean:执行清理。
  3. post-clean:最后清理

默认的生命周期包含了项目构建的核心部分,默认的生命周期包含以下核心阶段。

  1. compile:编译项目。
  2. test:单元测试。
  3. package:项目打包。
  4. install:安装到本地仓库。
  5. deploy:部署到远程仓库。

site证实周期用于生成项目报告站点、发布站点。该生命周期包含以下核心阶段。

  1. pre-site:生成站点以前作验证。
  2. site:生成站点。
  3. post-site:生成站点以后作验证。
  4. 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文件。