第1章 JavaEE概述

容器

Web容器、EJB容器、Applet容器、Application Client容器。

常用技术

1.     JDBC

JDBC(Java Database Connectivity,Java数据库连接)是一种用于执行SQL语句的JavaAPI,可为访问不同的关系型数据库提供一种统一的途径。

2.     JNDI

JNDI(Java Name and Directory Interface,Java命名和目录接口)被用于执行名字和目录服务。它提供了一致的模型来存取和操作企业级的资源,如DNS、LDAP、本地文件系统或应用服务器中的对象。

3.     Servlet

Servlet技术规范是JavaEE技术规范中的一个重要组成部分。Servlet是一种独立于平台和协议的服务器端的Java应用程序,可以生成动态的Web页面。

4.     JSP

JSP(Java Server Pages)是由Sun公司倡导、许多公司参与一起建立的一种动态网页技术标准。JSP技术有点类似ASP,PHP等技术,它是在传统的网页HTML文件(*.htm,*.html)中插入Java程序段(Scriptlet)和JSP标记(tag),从而形成JSP文件(*.jsp)。运行JSP,也是需要Servlet容器的,原因就是JSP在第一次被访问的时候,会被翻译为一个Servlet,所以,JSP是在Servlet的技术上构建出来的,相比传统的ASP脚本的解释方式,JSP的运行速度快了许多。

5.     JSF

JSF (Java Server Faces) 是一种用于构建Web应用程序的新标准Java框架,是一种Java EE 表示层的技术,其主旨是为了使 Java 开发人员能够快速的开发基于 Java 的 Web 应用程序。它不同于其它 Java 表示层技术的最大优势是其采用的组件模型和事件驱动,确保了应用程序具有更高的可维护性。

6.     EJB

EJB(Enterprise JavaBean)提供了一个框架来开发和实施分布式商务逻辑,由此显著地简化了具有可伸缩性和高度复杂的企业级应用开发。EJB规范定义了EJB组件在何时如何与它们的容器进行交互作用。

7.     JMS

JMS(Java Message Service)是具有面向消息的中间件相互通信的应用程序接口(API)。它既支持点对点的消息模型,也支持发布/订阅的消息模型。

8.     RMI

RMI(Remote Method Invoke,远程方法调用)定义了调用远程对象上的方法的标准接口。它作为一种被EJB使用的更底层的协议,通过使用序列化方式在客户端和服务器端直接传递数据。

9.     JTA

JTA(Java Transaction Architecture,Java事物架构)定义了面向分布式事务服务的标准API,可支持事物范围的界定、事物的提交和回滚。

10.   JavaMail

许多互联网应用程序需要发送邮件的功能,因此Java EE平台包含了JavaMail API以及相应的JavaMail服务供应商API,使应用程序组件可以发送互联网邮件。JavaMail API 有两个部分: 一个是应用程序组件用于发送邮件的应用程序级接口,另一个是Java EE SPI级的服务供应商接口。

11.   Web Service

Web Service是一种通过WWW的HTTP协议进行交互和交流的方式,使得在运行在不同的平台和框架的软件应用程序之间可以进行互操作。Web Service是以强大的互操作能力和可扩展能力为特征的。Web Service可以以松耦合的方式达成复杂的操作,程序提供简单的服务,可以实现交互,达成高性能的增值服务。

支持的服务器

WebLogic、JBoss、Tomcat

第2章 Servlet程序开发

Servlet程序基本构成

1、继承了HttpServlet类的Servlet类,

2、重写所需的doGet、doPost等方法,

3、使用@WebServlet标注或者使用web.xml配置文件对Servlet进行说明,并给出该Servlet的访问路径。

servlet工作原理

Servlet生命周期

当Servlet容器接收到客户的Servlet调用请求时,容器首先判断Servlet是否是第一次被访问,如果是第一次被访问容器创建Servlet对象并调用Servlet的init()方法对Servlet进行初始化,而后调用service()方法为客户提供服务。Servlet实质上是以单例的形式被实现的,它在被初始化之后将一直在内存中活动,后续的客户请求Servlet服务时将不再创建该Servlet的新的对象,只是新建一个线程调用service()方法提供服务。当服务器重新启动时,所有已经创建的Servlet对象需要被销毁,这时候容器会调用Servlet的destroy()方法,然后把内存中的Servlet对象销毁。

tips

客户端访问某个Servlet时,服务器端是如何找到对应的Servlet实例来为客户端提供服务的?

正确答案:

根据@WebServlet标注中或者是web.xml文件中定义的Servlet服务路径与Servlet类进行映射,找到相应的Servlet对象,再根据请求的服务类型,调用相应的doGet或者doPost方法。

在同一个服务器的同一个应用中,同一个Servlet类存在多个实例吗?

正确答案:

同一个服务器的同一个应用中,同一个Servlet类仅存在一个实例。

GenericServlet类与HttpServlet的关系是什么?它们的作用分别是什么?

GenericServlet类是HttpServlet类的父类。

GenericServlet类可作为通用型Servlet的基类。

HttpServlet类作为基于Http服务的Servlet类的基类。

HttpServlettRequest接口作为输入接口。封装了输入数据,以及获取输入信息的相关方法。

HttpServletResponse接口作为输出接口。封装了输出数据,以及写入输出信息的相关方法。

写servlet:

@WebServlet("/login") 
public class LoginServlet extends HttpServlet { 

	@Override 
	protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException 
	{ 

第3章 JSP程序开发

JSP组成元素

JSP是在HTML中嵌入Java代码和JSP元素的动态网页技术。 JSP页面的基本构成除了包括HTML元素之外包括了以下一些JSP元素:JSP声明、JSP程序块、JSP表达式、JSP指令、JSP动作、JSP注释。

JSP和Servlet的关系

Servlet具有强大的处理能力,但是在页面的组织上繁琐、复杂,给Web页面的开发带来了极大的不便。

JSP结合了HTML页面设计方便和Servlet强大处理能力而产生的一种动态网页设计技术。

从本质上讲JSP可以说是更易于书写和理解的Servlet程序,实际上JSP在执行之前也是首先被转换成Servlet。

JSP的优点是擅长于网页制作,生成动态页面比较直观,缺点是不容易跟踪与排错。

Servlet是纯Java语言,擅长于处理流程和业务逻辑,缺点是生成动态网页不直观。

JSP调用Servlet:

从JSP页面调用Servlet可以通过Form表单的提交、jsp:include动作、jsp:forward动作以及使用anchor标记的href属性等方法来实现。

1、通过Form的Action属性

示例:<form method="POST" action="/servlet/DataServlet">

2、通过jsp:include动作

示例:<jsp:include page="/servlet/DataServlet" />

3、通过jsp:forward动作

示例:<jsp:forward page="/servlet/DataServlet" />

4、使用anchor标记的href属性

示例:<a href="/servlet/DataServlet" >

JSP工作原理

JSP内置对象

tips

什么是JavaBean,它的作用是什么?在JSP页面中如何调用JavaBean,通过编程进行展示?

正确答案:

1、一个JavaBean和一个Java applet相似,是一个非常简单的遵循某种严格协议的Java类。

2、用户可以使用JavaBean将功能、处理、值、数据库访问和其他任何可以用java代码创造的对象进行打包,并且其他的开发者可以通过内部的JSP页面、Servlet、其他JavaBean、applet程序或者应用来使用这些对象。

3、在JSP中可以使用<jsp:useBean>、 <jsp:setProperty>、<jsp:getProperty>这三个动作来完成对JavaBean的调用。

        <jsp:useBean>动作用来将一个JavaBean的实例引入到JSP中,并且使得这个实例具有一定生存范围,在这个范围内还具有一个唯一的id。这样JSP通过id来识别JavaBean,并通过id.method类似的语句来调用JavaBean中的公共方法。 在执行过程中,<jsp:useBean>首先会尝试寻找已经存在的具有相同id和scope值的JavaBean实例,如果没有就会自动创建一个新的实例。

        <jsp:setProperty>动作主要用于设置bean的属性值。

        <jsp:getProperty>动作用来获得JavaBean实例的属性值,并将他们转换为 java.lang.String, 最后放置在隐含的out对象中. JavaBean的实例必须在<jsp:getProperty>前面定义。

第4章 JSF

Facelet

Facelet是用来建立JSF应用程序时的一个可供选择的表现层技术,提供了一个强有力的模板化系统,让开发人员使用HTML样式的模板来定义JSF的表现层,减少了把JSF用户界面整合到表现层时的大量冗余代码。

托管Bean的作用域

视图作用域

请求作用域

会话作用域

应用程序作用域

生命周期

第5章  JDBC

第6章  JNDI

主要的接口和类

Context接口和InitialContext类

Name接口

Binding类

Referenceable接口和Reference类

DirContext接口和InitialDirContext类

Attribute接口和Attributes接口

SearchResult类和SearchControls类

EventContext接口和EventDirContext接口

NamingEvent类

NamingListener/NamespaceChangeListener/ObjectChangeListener类

tips

3、什么是命名服务?

正确答案:所谓命名服务,就是把名称和对象进行关联,并可根据名称获取对象的一种服务。

4、什么是目录服务?

正确答案:目录服务是一种扩展的命名服务。与命名服务不同的是,目录服务中对象可以有属性,而命名服务中对象没有属性。因此,在目录服务中,可以根据对象的属性搜索对象。

5、什么是JNDI?

正确答案: JNDI提供了一组标准的独立于Java语言命名系统的API,这些API构建在命名系统之上。JNDI的存在有助于将应用与实际数据源分离,不管应用访问的是LDAP、RMI、DNS,还是其它的命名和目录服务,JNDI都可以以一种统一的形式对服务进行封装,提供一致的访问接口。

将JNDI和JDBC的设计思想和架构进行比对。

正确答案:

都采用了接口和实现分离的思想,向用户提供了一组独立于具体实现的接口。

第7章 EJB

组件类型

EJB组件分为两种类型:Session Bean(会话Bean)和Message-Driven Bean(消息驱动Bean)。会话Bean主要是对业务逻辑的封装,其既可运行于独立的EJB容器中,也可运行于作为标准Java平台、Java EE应用程序服务器一部分EJB容器中。消息驱动Bean(MDB)是设计用来专门处理基于消息请求的组件。

组件生命周期

无状态会话Bean,单例会话Bean:

(1).不存在状态

       主要针对无状态会话Bean组件对象,而不是EJB组件本身。在此状态下,无状态会话Bean组件对象不存在,但无状态会话Bean组件已经被部署到服务容器中。

(2).池状态

         在一个无状态会话Bean组件被部署到服务器后,EJB服务器通常会提前创建一定量的无状态会话Bean组件对象,并将它们临时缓存在缓冲区中,这种状态的对象,称为处于池状态的EJB组件对象。

(3).调用状态

         对应正在为远程或本地客户提供服务的组件对象,这种状态又称为服务状态。任何一个客户请求被发送到无状态会话Bean组件时,EJB服务器会首先从无状态会话Bean组件池中查找特定的无状态会话Bean组件对象,并使用这种组件对象为客户请求提供服务,在请求方法完成后,EJB服务器会将提供服务的组件释放到无状态会话Bean组件的对象池中。因此当远程客户连续对同一个无状态会话Bean组件进行访问时,很可能由两个完全不同的组件对象提供服务。

单例会话bean与无状态会话bean在大体上是一样的,只不过对于单例会话bean在实例池中只有一个实例存在,而对于无状态会话Bean来说,在实例池中存在多个实例。

消息驱动Bean:

与无状态会话Bean类似,消息驱动Bean的生命周期中也只存在3种状态:不存在状态、池状态和调用状态,这三种状态间的转换关系如图所示。

1)不存在状态

主要针对消息驱动Bean组件对象不存在的状态。

2)池状态

在一个消息驱动Bean组件被部署到服务器后,服务器通常会提前创建一定量的消息驱动Bean组件对象,并将它们临时缓存在缓冲区中,这种状态的对象,称为处于池状态的MDB组件对象。

3)调用状态

当有消息到达MDB组件所关联的消息队列时,EJB服务器会接受该消息,并从MDB组件池中选取或重新创建一个MDB组件对象,调用该组件上的onMessage()方法处理消息。一个MDB组件在特定时间只能处理一个消息,处理完消息的MDB组件对象会被释放到组件池中或被销毁。

有状态会话Bean:

运行原理

1. 定义EJB接口。

2. 编写实现接口的EJB实现类。

3. 部署到服务器中,将JNDI名称发布。

4. 编写客户端程序,并将接口拷贝给客户端,通过JNDI查找获得EJB,客户端调用EJB。

5. 客户端向服务器发起连接,在服务器上寻找相应的JNDI名称,如果找到,返回一个对象。

6. 客户端将该对象强制转换为接口类型。

7. 客户端调用接口中的方法,实际上调用了服务器端EJB实现类内的方法。

第8章 会话Bean

有状态会话Bean和无状态会话Bean

无状态会话Bean不维持和客户端的会话状态,这意味着客户端程序对这类组件的两次方法调用之间是没有联系的。

有状态会话Bean是一种保持会话状态的服务,每个实例都与特定的客户端相关联,在与客户端的方法调用之间维持对话状态

区别:

(1)组件对象进入休眠(缓存状态)的时刻

有状态会话Bean进入休眠状态,通常是因为对应的组件对象长时间不被使用,或服务器负载十分重的情况下才会发生;而无状态会话Bean在一个方法执行完毕后就会被释放到实例池中。

(2)组件对象在休眠状态或缓存状态的差别

无状态会话Bean进入缓存状态后,其对应的对象在服务器上还存在;而有状态会话Bean对象进入休眠状态后,其EJB组件对象被销毁,只是其对象状态被保存到了硬盘或数据库中。

(3)组件对象进入休眠或(缓存状态)时,EJB服务器所保留的组件数据

无状态会话Bean组件对象进入缓存状态后,其被保留的是组件上下文环境;而有状态会话Bean组件对象进入休眠状态时被保存的不但是EJB组件的上下文环境,而且还包括EJB组件的各种属性状态。

会话Bean分类

1 无状态会话Bean 2 有状态会话Bean 3 单例会话Bean

无状态和单例会话Bean生命周期一样

无状态会话Bean的生命周期中值存在3种状态:不存在状态、池状态和调用状态。

(1). 不存在状态

主要针对无状态会话Bean组件对象,而不是EJB组件本身。在此状态下,无状态会话Bean组件对象不存在,但无状态会话Bean组件已经被部署到服务容器中。

(2). 池状态

在一个无状态会话Bean组件被部署到服务器后,EJB服务器通常会提前创建一定量的无状态会话Bean组件对象,并将它们临时缓存在缓冲区中,这种状态的对象,称为处于池状态的EJB组件对象。

(3). 调用状态

对应正在为远程或本地客户提供服务的组件对象,这种状态又称为服务状态。任何一个客户请求被发送到无状态会话Bean组件时,EJB服务器会首先从无状态会话Bean组件池中查找特定的无状态会话Bean组件对象,并使用这种组件对象为客户请求提供服务,在请求方法完成后,EJB服务器会将提供服务的组件释放到无状态会话Bean组件的对象池中。因此当远程客户连续对同一个无状态会话Bean组件进行访问时,很可能由两个完全不同的组件对象提供服务。

有状态会话Bean生命周期

由于有状态会话Bean需要保持与客户端会话的状态,当容器生成一个实例时,将把它指定给一个客户端,这样每个从这个客户端来的请求都会被传递给同一个实例,因此有状态会话Bean的生命周期由客户端决定:当一个客户向EJB服务器请求一个组件引用时,EJB组件对象被服务器创建;在客户端使用组件过程中,EJB组件对象一直存在;假如客户端长时间没有调用它的bean实例,容器将在JVM内存溢出前把实例清除,并持久化这个实例的状态,这一过程称为钝化。而当客户端需要的时候再重新加载进内存,这一过程称为激活。EJB容器自动管理着Bean实例的钝化和激活。当客户端放弃EJB组件引用时,对应的EJB组件对象会被EJB容器销毁。

单例会话Bean并发控制

第9章 JMS与消息驱动Bean

JMS消息传递模型种类

2种:PTP消息队列和Pub/Sub消息队列

PTP消息队列特点

PTP模型是基于队列的,发送方发送消息到队列,接收方从队列接收消息,其结构如图9-3所示。(queue)

l  这种消息队列可以同时有多个发送者,每个发送者可以自由地向当前队列发送消息,被发送的消息按照先进先出的原则依次排列在队列中,图中有3个消息发送者依次发送消息M1、M2、M3到消息队列。

l  每个消息只能有一个消费者,一旦一个消息被使用后,就将从消息队列中删除,此时其后的消息才能被使用者使用。

l  消息的使用者可以使用队列中的所有消息,但默认情况下,必须按照消息在队列中的次序依次使用。

l  当发送者发送了消息后,不管发送者有没有正在运行,都不会影响到接收者接收消息。

l  接收者在成功接收消息之后须向队列应答成功

Pub/Sub模型特点(topic)

l  一个消息可以有多个消费者。默认情况下,如果当前队列没有使用者,则队列中的消息会自动被丢失。

l  所有发送者可以自由地向消息队列中发送消息,也遵循先进先出的原则,即最先发送的消息先进入队列,后发送的消息排在队列后面;

l  针对一个主题的订阅者,它必须创建一个订阅之后,才能消费发布者的消息,而且订阅者必须保持运行的状态。JMS允许订阅者创建一个可持久化的订阅,这样,即使订阅者没有运行,它也可能接收到发布者的消息。

JMS消息发送的过程

1)获得一个JBoss上下文的引用;

2)创建连接工厂;

3)使用连接工厂创建一个连接;

4)使用连接创建一个会话;

5)通过JNDI查找Queue或者Topic

6)使用会话和目的创建消息的生产者;

7)使用会话创建一个需要发送的消息类型的实例;

8)发送信息

第10章 JPA

定义

JPA全称为Java Persistence API,即Java 持久化API。基于Java 持久化的解决方案,旨在规范、简化Java对象的持久化工作。

主要是为了解决ORM 框架的差异,它的出现在某种程度上能够解决目前ORM框架之间不能够兼容的问题。

实体(JPA)的生命周期

ORM定义

对象关系映射(Object Relational Mapping,简称ORM)是一种为了解决面向对象与关系数据库存在的互不匹配的现象的技术。

这里的“O”表示的是对象,“R”表示的是关系型数据库,“M”表示的是对象和关系型数据库之间的联系。

简单的说,ORM是通过使用描述对象和数据库之间映射的元数据,将面向对象程序中的对象自动持久化到关系数据库中。

ORM基本原则

类通常映射为表

类中的属性通常映射为表中的一列

如果类的属性是集合类,则会涉及到多个表的关联映射

主键的生成策略

(1) GeneratorType.AUTO: 由JPA容器自动生成,自动选择一个最适合底层数据库的主键生成策略,这个是默认选项。
(2) GenerationType.IDENTITY : 使用数据库的自动增长字段生成,JPA容器将使用数据库的自增长字段为新增的实体对象赋唯一值,这种情况下,需要数据库本身提供自增长字段属性,支持该属性的DB有:SQL Server、DB2、MySQL、Derby等支持。

(3) GenerationType.SEQUENCE: 使用数据库的序列号为新增加的实体对象赋唯一值, 这种情况下需要数据库提供对序列号的支持常用的数据库中,Oracle支持。

(4) GenerationType.TABLE : 使用数据库表的字段生成,表示使用数据库中指定表的某个字段,记录实体对象的标识。

关联的分类

从方向上:

单向关联(Unidirectional)

双向关联(Bidirectional)

从实体数量上:

一对一(One to One)

一对多(One to Many)

多对一(Many to One)

多对多(Many to Many)

对于任何的两个实体,都要从这两方面区分它们之间的关系。因此总结起来,包括七种实体关系:

一对一单向

一对一双向

一对多单向

一对多双向

多对一单向

多对多单向

多对多双向

实体管理器分类(管理方式)

根据EntityManager对象的管理方式,可以有以下两种类型:

(1)容器托管的EntityManager 对象

    容器托管的EntityManager对象最简单,程序员不需要考虑EntityManager连接的释放,以及事务等复杂的问题,所有这些都交给容器去管理。容器托管的EntityManager对象必须在EJB容器中运行,而不能在Web 容器和JAVA SE 的环境中运行。

2)应用(Bean)托管的EntityManager 对象

应用托管的EntityManager对象,程序员需要手动地控制它的释放和连接、手动地控制事务等。这种获得应用托管的EntityManager对象的方式,不仅可以在EJB容器中应用,也可以使JPA脱离EJB容器,而与任何的Java环境集成,比如说Web容器、JAVA SE 环境等。

EntityManager对象的事务管理方式分类

JPA中的事务是由EntityManager对象来管理的, EntityManager对象所使用的事务管理方式有两种,分别为JTA和RESOURCE_LOCAL(JDBC事务),即Java Transaction API方法和本地的事务管理。

JPQL

查询参数:位置参数,命名参数;

第11章 Web Service

定义

Web Service也是一种远程调用方式,只是因为它具有自描述、跨平台、开放性等特点,再加上它使用了Web上协议进行通信,使得Web Service的开发可以使用现有的基础设施,并具有和Web一样穿越防火墙的能力,使得Web Service得到了发展。

优缺点

与其它服务相比,Web Service有以下的优越性:

(1)平台无关。不管你使用什么平台,都可以使用Web Service。

(2)编程语言无关。只要遵守相关协议,就可以使用任意编程语言,获取Web Service。

(3)对于Web Service使用者来说,可以轻易实现多种数据、多种服务的聚合。

缺点是有两个:

(1)受限于HTTP协议。

(2)效率相对较低。

种类

 Big Web Service和RESTful Web Service。

web Service适用情形

Web Service的使用场合:

(1)异构、多技术平台、松耦合。

(2)基于互联网的系统。

不适用的场合:

(1)同一技术平台。

(2)局域网内部。

第12章 事务

定义

事务管理是对一系列操作的管理,它最终只有两个结果,要么成功,要么失败。

  一旦失败,所有的操作将回滚到初始状态。

  一旦成功,才最终提交。

类型

  • Bean管理的事务:JDBC事务、JTA(Java Transaction API)事务;

  • 容器管理的事务

1、通过容器管理的事务,叫CMT(容器事务)。 简化编程,不用显式地标记事务的边界,代码中并不包括表示事务的开始和事务结束的语句。EJB默认采用CMT。

@TransactionManagement(TransactionManagementType.CONTAINER)

2、通过bean管理的事务,叫BMT(JDBC事务或者JTA事务)。 代码中需要使用表示事务的开始和事务结束的语句来确定事务的边界。

@TransactionManagement(TransactionManagementType.BEAN)。