当前位置:文档之家› DAO设计模式

DAO设计模式

DAO设计模式
DAO设计模式

DAO编程模式

J2EE开发人员使用数据访问对象(DAO)设计模式把底层的数据访问逻辑和高层的商务逻辑分开.实现DAO模式能够更加专注于编写数据访问代码.在这篇文章中,Java开发人员Sean C. Sullivan从三个方面讨论DAO编程的结构特征:事务划分,异常处理,日志记录.

在最近的18个月,我和一个优秀的软件开发团队一起工作,开发定制基于WEB的供应链管理应用程序.我们的应用程序访问广泛的持久层数据,包括出货状态,供应链制度,库存,货物发运,项目管理数据,和用户属性等.我们使用JDBC API连接我们公司的各种数据库平台,并且在整个应用程序中应用了DAO设计模式.

下图显示了应用程序和数据源的关系:

通过在整个应用程序中应用数据访问对象(DAO)设计模式使我们能够把底层的数据访问逻辑和上层的商务逻辑分开.我们为每个数据源创建了提供CRUD(创建,读取,更新,删除)操作的DAO类.

在之篇文章中,我将向你介绍DAO的实现策略以及创建更好的DAO类的技术.我会明确的介绍日志记录,异常处理,和事务划分三项技术.你将学在你的DAO类中怎样把这三种技术结合在一起.这篇文章假设你熟悉JDBC API,SQL和关系性数据库编程.

我们先来回顾一下DAO设计模式和数据访问对象.

DAO基础

DAO模式是标准的J2EE设计模式之一.开发人员使用这个模式把底层的数据访问操作和上层的商务逻辑分开.一个典型的DAO实现有下列几个组件:

1. 一个DAO工厂类;

2. 一个DAO接口;

3. 一个实现DAO接口的具体类;

4. 数据传递对象(有些时候叫做值对象).

具体的DAO类包含了从特定的数据源访问数据的逻辑。在下面的这段中你将学到设计和实现数据访问对象的技术。

事务划分:

关于DAO要记住的一件重要事情是它们是事务性对象。每个被DAO执行的操作(象创建,更新、或删除数据)都是和事务相关联的。同样的,事务划分(transaction demarcation)的概念是特别重要的。

事务划分是在事务界定定义中的方式。J2EE规范为事务划分描述了两种模式:编程性事务(programmatic)和声明性事务(declarative).下表是对这两种模式的拆分:

声明性事务划分编程性事务划分

程序员使用EJB的布署描述符声明事务属性程序员担负编写事务逻辑代码的责任。

运行时环境(EJB容器)使用这些属性来自动的管理事务。应用程序通过一个API接口来控制事务。

我将把注意力集中的编程性事务划分上。

象前面的介绍一样,DAOs是一些事务对象。一个典型的DAO要执行象创建、更新、和删除这的事务性操作。在设计一个DAO时,首先要问自己如下问题:

1、事务将怎样开始?

2、事务将怎样结束?

3、那个对象将承担起动一个事务的责任?

4、那个对象将承担结束一个事务的责任?

5、 DAO应该承担起动和结束事务的责任?

6、应用程序需要交叉访问多个DAO吗?

7、一个事务包含一个DAO还是多个DAO?

8、一个DAO包含其它的DAO中的方法吗?

回答这些问题将有助于你为DAO对象选择最好的事务划分策略。对ADO中的事务划分有两个主要的策略。一种方法是使用DAO承担事务划分的责任;另一种是延期性事务,它把事务划分到调用DAO对象的方法中。如果你选择前者,你将要在DAO类中嵌入事务代码。如果你选择后者,事务代码将被写在DAO 类的外部。我们将使用简单的代码实例来更好的理解这两种方法是怎样工作的。

实例1展示了一个带有两种数据操作的DAO:创建(create)和更新(update):

public void createWarehouseProfile(WHProfile profile);

public void updateWarehouseStatus(WHIdentifier id, StatusInfo status);

实例2展示了一个简单的事务,事务划分代码是在DAO类的外部。注意:在这个例子中的调用者把多个DOA操作组合到这个事务中。

tx.begin(); // start the transaction

dao.createWarehouseProfile(profile);

dao.updateWarehouseStatus(id1, status1);

dao.updateWarehouseStatus(id2, status2);

https://www.doczj.com/doc/ce8209844.html,mit(); // end the transaction

这种事务事务划分策略对在一个单一事务中访问多个DAO的应用程序来说尤为重要。

你即可使用JDBC API也可以使用Java 事务API(JTA)来实现事务的划分。JDBC事务划分比JTA事务划分简单,但是JTA提供了更好的灵活性。在下面的这段中,我们会进一步的看事务划分机制。

使用JDBC的事务划分

JDBC事务是使用Connection对象来控制的。JDBC的连接接口(java.sql.Connection)提供了两种事务模式:自动提交和手动提交。Java.sql.Connection为控制事务提供了下列方法:

.public void setAutoCommit(Boolean)

.public Boolean getAutoCommit()

.public void commit()

.public void rollback()

实例3展示怎样使用JDBC API来划分事务:

import java.sql.*;

import javax.sql.*;

// ...

DataSource ds = obtainDataSource();

Connection conn = ds.getConnection();

conn.setAutoCommit(false);

// ...

pstmt = conn.prepareStatement("UPDATE MOVIES ...");

pstmt.setString(1, "The Great Escape");

pstmt.executeUpdate();

// ...

https://www.doczj.com/doc/ce8209844.html,mit();

// ...

使用JDBC事务划分,你能够把多个SQL语句组合到一个单一事务中。JDBC事务的缺点之一就是事务范围被限定在一个单一的数据库连接中。一个JDBC事务不能够跨越多个数据库。接下来,我们会看到怎样使用JTA来做事务划分的。因为JTA不象JDBC那样被广泛的了解,所以我首先概要的介绍一下JTA。

JTA概要介绍

Java事务API(JTA Java Transaction API)和它的同胞Java事务服务(JTS Java Transaction Service),为J2EE平台提供了分布式事务服务。一个分布式事务(distributed transaction)包括一个事务管理器(transaction manager)和一个或多个资源管理器(resource manager)。一个资源管理器(resource manager)是任意类型的持久化数据存储。事务管理器(transaction manager)承担着所有事务参与单元者的相互通讯的责任。下车站显示了事务管理器和资源管理的间的关系。

JTA事务比JDBC事务更强大。一个JTA事务可以有多个参与者,而一个JDBC事务则被限定在一个单一的数据库连接。下列任一个Java平台的组件都可以参与到一个JTA事务中:

.JDBC连接

.JDO PersistenceManager 对象

.JMS 队列

.JMS 主题

.企业JavaBeans(EJB)

.一个用J2EE Connector Architecture 规范编译的资源分配器。

使用JTA的事务划分

要用JTA来划分一个事务,应用程序调用https://www.doczj.com/doc/ce8209844.html,erTransaction接口中的方法。示例4显示了一个典型的JNDI搜索的UseTransaction对象。

import javax.transaction.*;

import javax.naming.*;

// ...

InitialContext ctx = new InitialContext();

Object txObj = ctx.lookup("java:comp/UserTransaction");

UserTransaction utx = (UserTransaction) txObj;

应用程序有了UserTransaction对象的引用之后,就可以象示例5那样来起动事务。

utx.begin();

// ...

DataSource ds = obtainXADataSource();

Connection conn = ds.getConnection();

pstmt = conn.prepareStatement("UPDATE MOVIES ...");

pstmt.setString(1, "Spinal Tap");

pstmt.executeUpdate();

// ...

https://www.doczj.com/doc/ce8209844.html,mit();

// ...

当应用程序调用commit()时,事务管理器使用两段提交协议来结束事务。

JTA事务控制的方法

https://www.doczj.com/doc/ce8209844.html,erTransaction接口提供了下列事务控制方法:

.public void begin()

.public void commit()

.public void rollback()

.public void getStatus()

.public void setRollbackOnly()

.public void setTransactionTimeout(int)

应用程序调用begin()来起动事务,即可调用commit()也可以调用rollback()来结束事务。

使用JTA和JDBC

开发人员经常使用JDBC来作为DAO类中的底层数据操作。如果计划使用JTA来划分事务,你将需要一个实现了javax.sql.XADataSource,javax.sql.XAConnection 和javax.sql.XAResource接口JDBC的驱动。实现了这些接口的驱动将有能力参与到JTA事务中。一个XADataSource对象是一个XAConnection对象的工厂。XAConnections是参与到JTA事务中的连接。

你需要使用应用程序服务器管理工具来建立XADataSource对象。对于特殊的指令请参考应用程序服务器文档和JDBC驱动文档。

J2EE应用程序使用JNDI来查找数据源。一旦应用程序有了一个数据源对象的引用,这会调用javax.sql.DataSource.getConnection()来获得数据库的连接。

XA连接区别于非XA连接。要记住的是XA连接是一个JTA事务中的参与者。这就意味着XA连接不支持JDBC的自动提交特性。也就是说应用程序不必在XA连接上调用https://www.doczj.com/doc/ce8209844.html,mit()或java.sql.Connection.rollback()。相反,应用程序应该使用UserTransaction.begin()、https://www.doczj.com/doc/ce8209844.html,mit()和UserTransaction.rollback().

选择最好的方法

我们已经讨论了JDBC和JTA是怎样划分事务的。每一种方法都有它的优点,回此你需要决定为你的应用程序选择一个最适应的方法。

在我们团队许多最近的对于事务划分的项目中使用JDBC API来创建DAO类。这DAO类总结如下:

.事务划分代码被嵌入到DAO类内部

.DAO类使用JDBC API来进行事务划分

.调用者没有划分事务的方法

.事务范围被限定在一个单一的JDBC连接

JDBC事务对复杂的企业应用程序不总是有效的。如果你的事务将跨越多个DAO对象或

多个数据库,那么下面的实现策略可能会更恰当。:

.用JTA对事务进行划分

.事务划分代码被DAO分开

.调用者承担划分事务的责任

.DAO参与一个全局的事务中

JDBC方法由于它的简易性而具有吸引力,JTA方法提供了更多灵活性。你选择什么样的实现将依赖于你的应用程序的特定需求。

日志记录和DAO

一个好的DAO实现类将使用日志记录来捕获有关它在运行时的行为细节。你可以选择记录异常、配置信息、连接状态、JDBC驱动程序的元数据或查询参数。日志对开发整个阶段都是有益的。我经常检查应用程序在开发期间、测试期间和产品中的日志记录。

在这段中,我们将展现一段如何把Jakarta Commaons Logging结合中一个DAO中的例子。在我们开始之前,让我们先回顾一些基础知识。

选择一个日志例库

许多开发人员使用的基本日志形式是:System.out.println和System.err.println.Println语句。这种形式快捷方便,但它们不能提供一个完整的日志系统的的能力。下表列出了Java平台的日志类库:

日志类库开源吗? URL

Java.util.logging

Jakarta Log4j

Jakarta Commons Logging 是 http:/https://www.doczj.com/doc/ce8209844.html,/commons/logging.html

Java.util.logging是J2SE1.4平台上的标准的API。但是,大多数开发人员都认为Jakarta Log4j提供了更大的功能性和灵活性。Log4j超越java.util.logging的优点之一就是它支持J2SE1.3和J2SE1.4平台。

Jakarta Commons Logging能够被用于和java.util.loggin或Jakarta Log4j一起工作。Commons Logging是一个把你的应用程序独立于日志实现的提取层。使用Commons Logging你能够通过改变一个配置文件来与下面的日志实现来交换数据。Commons Logging被用于JAKARTA Struts1.1和Jakarta HttpClient2.0中。

一个日志示例

示例7显示了在一个DOA类中怎样使用Jakarta Commons Logging

import https://www.doczj.com/doc/ce8209844.html,mons.logging.*;

class DocumentDAOImpl implements DocumentDAO

{

static private final Log log = LogFactory.getLog(DocumentDAOImpl.class);

public void deleteDocument(String id)

{

// ...

log.debug("deleting document: " + id);

// ...

try

{

// ... data operations ...

}

catch (SomeException ex)

{

log.error("Unable to delete document", ex);

// ... handle the exception ...

}

}

}

日志是评估应用程序的基本部分。如果你在一个DAO中遇到了失败,日志经常会为理解发生的什么错误提供最好的信息。把日志结合到你的DAO中,确保得到调试和解决问题的有效手段。

DAO中的异常处理

我们已经看了事务划分和日志记录,并且现在对于它们是怎样应用于数据访问对象的有一个深入的理解。我们第三部分也是最后要讨论的是异常处理。下面的一些简单的异常处理方针使用你的DAO更容易使用,更加健壮和更具有可维护性。

在实现DAO模式的时候,要考滤下面的问题:

.在DAO的public接口中的方法将抛出被检查的异常吗?

.如果是,将抛出什么样的检查性异常?

.在DAO实现类中怎能样处理异常。

在用DAO模式工作的过程中,我们的团队为异常处理开发了一组方针。下面的这些方针会很大程度的改善你的DAO:

.DAO方法应该抛出有意义的异常。

.DAO方法不应该抛出https://www.doczj.com/doc/ce8209844.html,ng.Exception异常。因为https://www.doczj.com/doc/ce8209844.html,ng.Exception太一般化,它不能包含有关潜在问题的所有信息。

.DAO方法不应该抛出java.sql.SQLException异常。SQLException是一个底层的JDBC异常,DAO应用努力封装JDBC异常而不应该把JDBC异常留给应用程序的其它部分。

.在DAO接口中的方法应该只抛出调用者期望处理的检查性异常。如果调用者不能用适当的方法来处理异常,考滤抛出不检查性(运行时run-time)异常。

.如果你的数据访问代码捕获了一个异常,不可要忽略它。忽略捕获异常的DAO是很处理的。

.使用异常链把底层的异常传递给高层的某个处理器。

.考滤定义一个标准的DAO异常类。Spring框架提供了一个优秀的预定义的DAO异常类的集合。

看Resources,查看有异常和异常处理技术的更详细信息。

实现示例:MovieDAO

MoveDAO是一个示范了在这篇文章中所讨论的所有技术,包括事务划分、日志记录和异常处理。你会在Resources段找到MovieDAO的源代码。它被分下面的三个包:

.daoexamples.exception

.daoexamples.move

.daoexamples.moviedemo

这个DAO模式的实现由下面的类和接口组成:

.daoexamples.movie.MovieDAOFactory

.daoexamples.movie.MovieDAO

.daoexamples.movie.MovieDAOImpl

.daoexamples.movie.MovieDAOImplJTA

.daoexamples.movie.Movie

.daoexamples.movie.MovieImple

.daoexamples.movie.MovieNotFoundException

.daoexamples.movie.MovieUtil

MovieDAO接口定义了DAO的数据操作。这个接口有如下五个方法:

.public Movie findMovieById(String id)

.public java.util.Collection findMoviesByYear(String year)

.public void deleteMovie(String id)

.public Movie createMovie(String rating,String year,String title)

.public void updateMovie(String id,String rating,String year,String title)

daoexamples.movie包包含了两个MovieDAO接口的实现。每个实现使用了一个同的事务划分方法,如下表所示:

MovieDAOImpl MovieDAOImplJTA

实现了MovieDAO接口吗? Yes Yes

通过JNDI获得DataSource吗? Yes Yes

从一个DataSource获得java.sql.Connection对象吗? Yes Yes

DAO界定内部的事务吗? Yes No

使用JDBC事务吗? Yes No

使用一个XA DataSource吗? No Yes

分担JTA事务吗? No Yes

MovieDAO 示范应用程序

这个示范应用程序是一个叫做daoexamples.moviedemo.DemoServlet.DemoServlet的servlet类,它使用Movie DAO来查询和更新一个表中的movie数据。

这个servlet示范了把JTA感知的MovieDAO和Java消息服务组合到一个单一的事务中,如示例8所示:

UserTransaction utx = MovieUtil.getUserTransaction();

utx.begin();

batman = dao.createMovie("R",

"2008",

"Batman Reloaded");

publisher = new MessagePublisher();

publisher.publishTextMessage("I'll be back");

dao.updateMovie(topgun.getId(),

"PG-13",

topgun.getReleaseYear(),

topgun.getTitle());

dao.deleteMovie(legallyblonde.getId());

https://www.doczj.com/doc/ce8209844.html,mit();

要运行这个范例应用程序,在你的应用程序服务器中配置一个XA 数据源和一个非XA数据源。然后布署daoexamples.ear文件。这个应用程序将运行在任何与J2EE兼容的应用程序服务器。

DAO编程模式

转自:javaresearch 翻译muzi_li

J2EE开发人员使用数据访问对象(DAO)设计模式把底层的数据访问逻辑和高层的商务逻辑分开.实现DAO模式能够更加专注于编写数据访问代码.在这篇文章中,Java开发人员Sean C. Sullivan从三个方面讨论DAO编程的结构特征:事务划分,异常处理,日志记录.

在最近的18个月,我和一个优秀的软件开发团队一起工作,开发定制基于WEB的供应链管理应用程序.我们的应用程序访问广泛的持久层数据,包括出货状态,供应链制度,库存,货物发运,项目管理数据,和用户属性等.我们使用

JDBC API连接我们公司的各种数据库平台,并且在整个应用程序中应用了DAO设计模式.

下图显示了应用程序和数据源的关系:

通过在整个应用程序中应用数据访问对象(DAO)设计模式使我们能够把底层的数据访问逻辑和上层的商务逻辑分

开.我们为每个数据源创建了提供CRUD(创建,读取,更新,删除)操作的DAO类.

在之篇文章中,我将向你介绍DAO的实现策略以及创建更好的DAO类的技术.我会明确的介绍日志记录,异常处理,

和事务划分三项技术.你将学在你的DAO类中怎样把这三种技术结合在一起.这篇文章假设你熟悉JDBC API,SQL和关系性数据库编程.

我们先来回顾一下DAO设计模式和数据访问对象.

DAO基础

DAO模式是标准的J2EE设计模式之一.开发人员使用这个模式把底层的数据访问操作和上层的商务逻辑分开.一个典型的DAO实现有下列几个组件:

1. 一个DAO工厂类;

2. 一个DAO接口;

3. 一个实现DAO接口的具体类;

4. 数据传递对象(有些时候叫做值对象).

具体的DAO类包含了从特定的数据源访问数据的逻辑。在下面的这段中你将学到设计和实现数据访问对象的技术。事务划分:

关于DAO要记住的一件重要事情是它们是事务性对象。每个被DAO执行的操作(象创建,更新、或删除数据)都是和事务相关联的。同样的,事务划分(transaction demarcation)的概念是特别重要的。

事务划分是在事务界定定义中的方式。J2EE规范为事务划分描述了两种模式:编程性事务(programmatic)和声明性事务(declarative).下表是对这两种模式的拆分:

声明性事务划分编程性事务划分

程序员使用EJB的布署描述符声明事务属性程序员担负编写事务逻辑代码的责任。

运行时环境(EJB容器)使用这些属性来自动的管理事务。应用程序通过一个API接口来控制事务。

我将把注意力集中的编程性事务划分上。

象前面的介绍一样,DAOs是一些事务对象。一个典型的DAO要执行象创建、更新、和删除这的事务性操作。在设计一个DAO时,首先要问自己如下问题:

1、事务将怎样开始?

2、事务将怎样结束?

3、那个对象将承担起动一个事务的责任?

4、那个对象将承担结束一个事务的责任?

5、 DAO应该承担起动和结束事务的责任?

6、应用程序需要交叉访问多个DAO吗?

7、一个事务包含一个DAO还是多个DAO?

8、一个DAO包含其它的DAO中的方法吗?

回答这些问题将有助于你为DAO对象选择最好的事务划分策略。对ADO中的事务划分有两个主要的策略。一种方法是使用DAO承担事务划分的责任;另一种是延期性事务,它把事务划分到调用DAO对象的方法中。如果你选择前者,你将要在DAO类中嵌入事务代码。如果你选择后者,事务代码将被写在DAO类的外部。我们将使用简单的代码实例来更好的理解这两种方法是怎样工作的。

实例1展示了一个带有两种数据操作的DAO:创建(create)和更新(update):

public void createWarehouseProfile(WHProfile profile);

public void updateWarehouseStatus(WHIdentifier id, StatusInfo status);

实例2展示了一个简单的事务,事务划分代码是在DAO类的外部。注意:在这个例子中的调用者把多个DOA操作组合到这个事务中。

tx.begin(); // start the transaction

dao.createWarehouseProfile(profile);

dao.updateWarehouseStatus(id1, status1);

dao.updateWarehouseStatus(id2, status2);

https://www.doczj.com/doc/ce8209844.html,mit(); // end the transaction

这种事务事务划分策略对在一个单一事务中访问多个DAO的应用程序来说尤为重要。

你即可使用JDBC API也可以使用Java 事务API(JTA)来实现事务的划分。JDBC事务划分比JTA事务划分简单,但是JTA提供了更好的灵活性。在下面的这段中,我们会进一步的看事务划分机制。

使用JDBC的事务划分

JDBC事务是使用Connection对象来控制的。JDBC的连接接口(java.sql.Connection)提供了两种事务模式:自动提交和手动提交。Java.sql.Connection为控制事务提供了下列方法:

.public void setAutoCommit(Boolean)

.public Boolean getAutoCommit()

.public void commit()

.public void rollback()

实例3展示怎样使用JDBC API来划分事务:

import java.sql.*;

import javax.sql.*;

// ...

DataSource ds = obtainDataSource();

Connection conn = ds.getConnection();

conn.setAutoCommit(false);

// ...

pstmt = conn.prepareStatement("UPDATE MOVIES ...");

pstmt.setString(1, "The Great Escape");

pstmt.executeUpdate();

// ...

https://www.doczj.com/doc/ce8209844.html,mit();

// ...

使用JDBC事务划分,你能够把多个SQL语句组合到一个单一事务中。JDBC事务的缺点之一就是事务范围被限定在一个单一的数据库连接中。一个JDBC事务不能够跨越多个数据库。接下来,我们会看到怎样使用JTA来做事务划分的。因为JTA不象JDBC那样被广泛的了解,所以我首先概要的介绍一下JTA。

JTA概要介绍

Java事务API(JTA Java Transaction API)和它的同胞Java事务服务(JTS Java Transaction Service),为J2EE平台提供了分布式事务服务。一个分布式事务(distributed transaction)包括一个事务管理器(transaction manager)和一个或多个资源管理器(resource manager)。一个资源管理器(resource manager)是任意类型的持久化数据存储。事务管理器(transaction manager)承担着所有事务参与单元者的相互通讯的责任。下车站显示了事务管理器和资源管理的

间的关系。

JTA事务比JDBC事务更强大。一个JTA事务可以有多个参与者,而一个JDBC事务则被限定在一个单一的数据库连接。下列任一个Java平台的组件都可以参与到一个JTA事务中:

.JDBC连接

.JDO PersistenceManager 对象

.JMS 队列

.JMS 主题

.企业JavaBeans(EJB)

.一个用J2EE Connector Architecture 规范编译的资源分配器。

使用JTA的事务划分

要用JTA来划分一个事务,应用程序调用https://www.doczj.com/doc/ce8209844.html,erTransaction接口中的方法。示例4显示了一个典型的JNDI搜索的UseTransaction对象。

import javax.transaction.*;

import javax.naming.*;

// ...

InitialContext ctx = new InitialContext();

Object txObj = ctx.lookup("java:comp/UserTransaction");

UserTransaction utx = (UserTransaction) txObj;

应用程序有了UserTransaction对象的引用之后,就可以象示例5那样来起动事务。

utx.begin();

// ...

DataSource ds = obtainXADataSource();

Connection conn = ds.getConnection();

pstmt = conn.prepareStatement("UPDATE MOVIES ...");

pstmt.setString(1, "Spinal Tap");

pstmt.executeUpdate();

// ...

https://www.doczj.com/doc/ce8209844.html,mit();

// ...

当应用程序调用commit()时,事务管理器使用两段提交协议来结束事务。

JTA事务控制的方法

https://www.doczj.com/doc/ce8209844.html,erTransaction接口提供了下列事务控制方法:

.public void begin()

.public void commit()

.public void rollback()

.public void getStatus()

.public void setRollbackOnly()

.public void setTransactionTimeout(int)

应用程序调用begin()来起动事务,即可调用commit()也可以调用rollback()来结束事务。

使用JTA和JDBC

开发人员经常使用JDBC来作为DAO类中的底层数据操作。如果计划使用JTA来划分事务,你将需要一个实现了javax.sql.XADataSource,javax.sql.XAConnection和javax.sql.XAResource接口JDBC的驱动。实现了这些接口的驱动将有能力参与到JTA事务中。一个XADataSource对象是一个XAConnection对象的工厂。XAConnections是参与到JTA事务中的连接。

你需要使用应用程序服务器管理工具来建立XADataSource对象。对于特殊的指令请参考应用程序服务器文档和JDBC驱动文档。

J2EE应用程序使用JNDI来查找数据源。一旦应用程序有了一个数据源对象的引用,这会调用

javax.sql.DataSource.getConnection()来获得数据库的连接。

XA连接区别于非XA连接。要记住的是XA连接是一个JTA事务中的参与者。这就意味着XA连接不支持JDBC 的自动提交特性。也就是说应用程序不必在XA连接上调用https://www.doczj.com/doc/ce8209844.html,mit()或

java.sql.Connection.rollback()。相反,应用程序应该使用UserTransaction.begin()、https://www.doczj.com/doc/ce8209844.html,mit()和UserTransaction.rollback().

选择最好的方法

我们已经讨论了JDBC和JTA是怎样划分事务的。每一种方法都有它的优点,回此你需要决定为你的应用程序选择一个最适应的方法。

在我们团队许多最近的对于事务划分的项目中使用JDBC API来创建DAO类。这DAO类总结如下:

.事务划分代码被嵌入到DAO类内部

.DAO类使用JDBC API来进行事务划分

.调用者没有划分事务的方法

.事务范围被限定在一个单一的JDBC连接

JDBC事务对复杂的企业应用程序不总是有效的。如果你的事务将跨越多个DAO对象或

多个数据库,那么下面的实现策略可能会更恰当。:

.用JTA对事务进行划分

.事务划分代码被DAO分开

.调用者承担划分事务的责任

.DAO参与一个全局的事务中

JDBC方法由于它的简易性而具有吸引力,JTA方法提供了更多灵活性。你选择什么样的实现将依赖于你的应用程序的特定需求。

日志记录和DAO

一个好的DAO实现类将使用日志记录来捕获有关它在运行时的行为细节。你可以选择记录异常、配置信息、连接状态、JDBC驱动程序的元数据或查询参数。日志对开发整个阶段都是有益的。我经常检查应用程序在开发期间、测试期间和产品中的日志记录。

在这段中,我们将展现一段如何把Jakarta Commaons Logging结合中一个DAO中的例子。在我们开始之前,让我们先回顾一些基础知识。

选择一个日志例库

许多开发人员使用的基本日志形式是:System.out.println和System.err.println.Println语句。这种形式快捷方便,但它们不能提供一个完整的日志系统的的能力。下表列出了Java平台的日志类库:

日志类库开源吗? URL

Java.util.logging

Jakarta Log4j

Jakarta Commons Logging 是 http:/https://www.doczj.com/doc/ce8209844.html,/commons/logging.html

Java.util.logging是J2SE1.4平台上的标准的API。但是,大多数开发人员都认为Jakarta Log4j提供了更大的功能性和灵活性。Log4j超越java.util.logging的优点之一就是它支持J2SE1.3和J2SE1.4平台。

Jakarta Commons Logging能够被用于和java.util.loggin或Jakarta Log4j一起工作。Commons Logging是一个把你的应用程序独立于日志实现的提取层。使用Commons Logging你能够通过改变一个配置文件来与下面的日志实现来交换数据。Commons Logging被用于JAKARTA Struts1.1和Jakarta HttpClient2.0中。

一个日志示例

示例7显示了在一个DOA类中怎样使用Jakarta Commons Logging

import https://www.doczj.com/doc/ce8209844.html,mons.logging.*;

class DocumentDAOImpl implements DocumentDAO

{

static private final Log log = LogFactory.getLog(DocumentDAOImpl.class);

public void deleteDocument(String id)

{

// ...

log.debug("deleting document: " + id);

// ...

try

{

// ... data operations ...

}

catch (SomeException ex)

{

log.error("Unable to delete document", ex);

// ... handle the exception ...

}

}

}

日志是评估应用程序的基本部分。如果你在一个DAO中遇到了失败,日志经常会为理解发生的什么错误提供最好的信息。把日志结合到你的DAO中,确保得到调试和解决问题的有效手段。

DAO中的异常处理

我们已经看了事务划分和日志记录,并且现在对于它们是怎样应用于数据访问对象的有一个深入的理解。我们第三部分也是最后要讨论的是异常处理。下面的一些简单的异常处理方针使用你的DAO更容易使用,更加健壮和更具有可维护性。

在实现DAO模式的时候,要考滤下面的问题:

.在DAO的public接口中的方法将抛出被检查的异常吗?

.如果是,将抛出什么样的检查性异常?

.在DAO实现类中怎能样处理异常。

在用DAO模式工作的过程中,我们的团队为异常处理开发了一组方针。下面的这些方针会很大程度的改善你的DAO:

.DAO方法应该抛出有意义的异常。

.DAO方法不应该抛出https://www.doczj.com/doc/ce8209844.html,ng.Exception异常。因为https://www.doczj.com/doc/ce8209844.html,ng.Exception太一般化,它不能包含有关潜在问题的所有信息。

.DAO方法不应该抛出java.sql.SQLException异常。SQLException是一个底层的JDBC异常,DAO应用努力封装JDBC 异常而不应该把JDBC异常留给应用程序的其它部分。

.在DAO接口中的方法应该只抛出调用者期望处理的检查性异常。如果调用者不能用适当的方法来处理异常,考滤抛出不检查性(运行时run-time)异常。

.如果你的数据访问代码捕获了一个异常,不可要忽略它。忽略捕获异常的DAO是很处理的。

.使用异常链把底层的异常传递给高层的某个处理器。

.考滤定义一个标准的DAO异常类。Spring框架提供了一个优秀的预定义的DAO异常类的集合。

看Resources,查看有异常和异常处理技术的更详细信息。

实现示例:MovieDAO

MoveDAO是一个示范了在这篇文章中所讨论的所有技术,包括事务划分、日志记录和异常处理。你会在Resources 段找到MovieDAO的源代码。它被分下面的三个包:

.daoexamples.exception

.daoexamples.move

.daoexamples.moviedemo

这个DAO模式的实现由下面的类和接口组成:

.daoexamples.movie.MovieDAOFactory

.daoexamples.movie.MovieDAO

.daoexamples.movie.MovieDAOImpl

.daoexamples.movie.MovieDAOImplJTA

.daoexamples.movie.Movie

.daoexamples.movie.MovieImple

.daoexamples.movie.MovieNotFoundException

.daoexamples.movie.MovieUtil

MovieDAO接口定义了DAO的数据操作。这个接口有如下五个方法:

.public Movie findMovieById(String id)

.public java.util.Collection findMoviesByYear(String year)

.public void deleteMovie(String id)

.public Movie createMovie(String rating,String year,String title)

.public void updateMovie(String id,String rating,String year,String title)

daoexamples.movie包包含了两个MovieDAO接口的实现。每个实现使用了一个同的事务划分方法,如下表所示: MovieDAOImpl MovieDAOImplJTA

实现了MovieDAO接口吗? Yes Yes

通过JNDI获得DataSource吗? Yes Yes

从一个DataSource获得java.sql.Connection对象吗? Yes Yes

DAO界定内部的事务吗? Yes No

使用JDBC事务吗? Yes No

使用一个XA DataSource吗? No Yes

分担JTA事务吗? No Yes

MovieDAO 示范应用程序

这个示范应用程序是一个叫做daoexamples.moviedemo.DemoServlet.DemoServlet的servlet类,它使用Movie DAO来查询和更新一个表中的movie数据。

这个servlet示范了把JTA感知的MovieDAO和Java消息服务组合到一个单一的事务中,如示例8所示:UserTransaction utx = MovieUtil.getUserTransaction();

utx.begin();

batman = dao.createMovie("R",

"2008",

"Batman Reloaded");

publisher = new MessagePublisher();

publisher.publishTextMessage("I'll be back");

dao.updateMovie(topgun.getId(),

"PG-13",

topgun.getReleaseYear(),

topgun.getTitle());

dao.deleteMovie(legallyblonde.getId());

https://www.doczj.com/doc/ce8209844.html,mit();

要运行这个范例应用程序,在你的应用程序服务器中配置一个XA 数据源和一个非XA数据源。然后布署daoexamples.ear文件。这个应用程序将运行在任何与J2EE兼容的应用程序服务器。

Java中常见设计模式面试题

Java中常见设计模式面试题 一、设计模式的分类 总体来说设计模式分为三大类: 创建型模式,共五种:工厂方法模式、抽象工厂模式、单例模式、建造者模式、原型模式。 结构型模式,共七种:适配器模式、装饰器模式、代理模式、外观模式、桥接模式、组合模式、享元模式。 行为型模式,共十一种:策略模式、模板方法模式、观察者模式、迭代子模式、责任链模式、命令模式、备忘录模式、状态模式、访问者模式、中介者模式、解释器模式。 1.请列举出在JDK中几个常用的设计模式? 单例模式(Singleton pattern)用于Runtime,Calendar和其他的一些类中。工厂模式(Factory pattern)被用于各种不可变的类如Boolean,像Boolean.valueOf,观察者模式(Observer pattern)被用于 Swing 和很多的事件监听中。装饰器设计模式(Decorator design pattern)被用于多个 Java IO 类中。 2.什么是设计模式?你是否在你的代码里面使用过任何设计模式? 设计模式是世界上各种各样程序员用来解决特定设计问题的尝试和测试的方法。设计模式是代码可用性的延伸 3.Java 中什么叫单例设计模式?请用Java 写出线程安全的单例模式 单例模式重点在于在整个系统上共享一些创建时较耗资源的对象。整个应用中只维护一个特定类实例,它被所有组件共同使用。https://www.doczj.com/doc/ce8209844.html,ng.Runtime是单例模式的经典例子。从 Java 5 开始你可以使用枚举(enum)来实现线程安全的单例。 4.在 Java 中,什么叫观察者设计模式(observer design pattern)?

J2EE期末考试复习题

一、填空题 发布到服务器上的组件除包含自身实现的代码文件外,还要包含一(XML)部署描述文件。 Java EE技术框架可分为三部分:组件技术、(服务技术)、通信技术。 Servlet 最大的用途是通过(动态响应)客户机请求来扩展服务器功能。 表单数据的提交方法有两种,(Post)方法和Get方法。 (Filter)拦截请求和响应,以便查看、提取正在客户机和服务器之间交换数据。 (Listener)实现了Servlet的事件驱动。 JSP页面的脚本元素用来嵌入(java)代码。 JSP动作组件是一些(XML)语法格式的标记,被用来控制Web容器的行为。 JSP供提供九种内置对象,(request)对象代表的是来自客户端的请求。 JSP 标准标记库是一个实现(Web )应用程序中常用功能的定制标记库集。 java.sql.Statement对象代表一条发送到数据库执行的SQL语句。有(三)种Statement 对象。 Servlets可以使用(MIME)类型来向浏览器传送非HTML 文件。 Enterprise Bean 是在(多)台机器上跨几个地址空间运行的组件。 JavaBean 是(一)台机器上同一个地址空间中运行的组件。 在标记描述TLD文件中Required 定义为(true)代表为必须。 二、单项选择题

1、表单数据的提交方法有两种, ()方法使得数据由标准的输入设备读入。 A.Get B. Post C.Read D.Input 2、在表单提交的数据中,如果变量的值有多个,这时应调用( )方法, A. getParameterValues() B. getParameter() C. getParameterNames() D. getAttribute() 3、Servlet的事件驱动由()实现。 A. Filter B. Listener C . Response D. Request 4、标记名称由两部分组成,( )用来区分不同标记库. A. 后缀 B. 前缀 C.JSP D. bean 5、客户机对Servlet的请求和Servlet对客户端的响应,都是通过( )来实现的。 A、EJB B、XML C、API D、Web服务器 6、获取数据库连接的方法是()。 A、Connection() B、getConnection() C、Con D、getContent() 7、常用的接收邮件的协议是() A、SMTP B、POP3 C、IMAP D、MIME 8、()用来获取一个已被创建的JavaBean组件的属性值。 A、 B、 C、 D. 9、要对体内容进行操作的标记,必须继承的接口是()。 A. javax.Servlet.jsp.tagext. Tag B.javax.Servlet.jsp.tagext.BodyTag C. javax.Servlet.jsp. Tag D. 三个都必须 10、core标记库主要的标记有()

J2EE期末考试深刻复知识题(88份)

J2EE期末考试试题(笔试) A卷 姓名:学号: 注意事项:(考试时间90分钟) 1)整个试卷中不得做任何形式的书写或标记,是否试卷成绩做废; 2)认真准确填写并核对答题卡中的各项内容,因填涂错误造成的任何后果,由考生自负; 3)考试完毕,不得将所有考卷.答题卡.草稿纸带离考场,否则试卷成绩作废; 4)作弊,雷同答卷,成绩一律为0分 答题结束后,必须经监考老师确认考卷,答题卡,草稿纸已经提交后,方可离开考场 一、选择题(单项选择,每题2分,共50题) 1、下面对Web应用开发中Servlet组件说法错误的是。 A)Servlet是按照接受请求/返回响应的模式工作的 B)运行于Servlet容器中,是被动态加载的 C)在Struts框架中,Servlet充当模型组件 D)在Struts框架中,Servlet充当控制器组件 2、在Struts应用中,能在下列哪几种范围内共享数据说法错误的是。A)只有request与session B)request

C)session D)application 3、下面那个选项不属于MVC三个核心模块。 A)模型 B)视图 C)数据库连接 D)控制器 4、下列关于Struts框架的说法中,正确的是。 A)Struts实质是在JSP Model2的基础上实现的一个MVC框架 B)在Struts框架中,模型是由实现业务逻辑的JavaBean与EJB组件构成C)在Struts框架中,视图是由一组JSP文件组成 D)以上都是 5、关于在web.xml文件中配置欢迎文件清单说法错误的是。 A)使用元素配置欢迎清单 B)只能配置一个欢迎文件 C)可以配置多个欢迎文件 D)Web容器调用会依次寻找欢迎文件,直到找到为止 6、下列哪个元素可以配置数据源。

J2EE复习题

填空题 1.MVC模式中,M代表(Model(模型)),V代表(View(视图)),C代表(Controller(控制器))。2.Struts2框架主要有两个核心配置文件:struts.properties和(struts.xml)。 3.struts2的框架校验包含字段校验和(非字段校验)。 单项选择题 1.J2EE中,( D )类的()方法用于创建对话。 A.HttpServletRequest、getSession B.HttpServletResponse、newSession C.HtttpSession、newInstance D.HttpSession、getSession 2.下列哪个不是HTML的常用标记(D) A. B. C. D. 3.在Servlet里,能正确获取session的语句是(A) A.HttpSession session = request.getSession( ); B.HttpSession session = request.getHttpSession( ); C.HttpSession session = response.getSession( ); D.HttpSession session = response. getHttpSession ( ); 4.下列(A)实现单击超级链接是弹出确认对话框,询问用户是否真的删除。 A. 删除 B. 删除 C. 删除 D. 删除 5.不属于Action接口中定义的字符串常量的是( B ) A.INPUT B.FAILURE C.SUCCESS D.ERROR 6.J2EE中,JSP EL表达式:${user.loginName}的执行效果等同于(A)。 A.<%=user.getLoginName()%> B.<%=user.getLoginName();%> C.<%=user.loginName%> D.<%=user.loginName;%> 7.在J2EE中,下列( C )语句可以获取页面请求中的一个文本框的输入的内容(文本框的名字为:title)。 A.response.getParameter(“title”); B.request.getAttribute(“title”); C.request.getParameter(“title”); D.request.getParamet ers(“title”); 8.给定JSP程序源码如下,该JSP运行后输出的结果是(B ) <% int count =1;%> Count: <%=++count%> A.Count:1 B.Count:2 C.1:2 D.Count 9.在JavaScript中window对象的(D )方法用于关闭当前窗口。 A.open() B.confirm() C.alert() D.close() 10.Tomcat服务器的默认端口为(C) A.8888 B.8001 C.8080 D.80 11.资源文件的后缀名为( D ) A.doc B.txt C.property D.properties 12.在Servlet里,能正确获取session的语句是(A) A.HttpSession session = request.getSession( ); B.HttpSession session = request.getHttpSession( ); C.HttpSession session = response.getSession( ); D.HttpSession session = response.getHttpSession ( );

J2EE考试题目及答案

J2简答题 1、简述J2的四层模型。 运行在客户端机器上的客户层组件;运行在J2服务器上的层组件;运行在J2服务器上的业务逻辑层组件;运行在服务器上的企业信息系统层软件 2、什么是对象持久化? 即把数据(如内存中的对象)保存到可永久保存的存储设备中(如磁盘)。持久化的主要应用是将内存中的数据存储在关系型的数据库中,当然也可以存储在磁盘文件中、数据文件中等等。 3、简述一下,为什么我们使用它? ( )是一种为了解决面向对象与关系型数据库存在的互不匹配的现象的技术。简单说:是通过使用描述对象和数据库之间映射的元数据,将程序中的对象自动持久化到关系数据中。本质上就是将数据从一种形式转换到另外一种形式。 原因:用它来架起对象和关系型数据库的桥梁,可解决对象层次的映射、对象关系的映射以及对象的持久化问题。 4、简述一下如何使用实现对象持久化的过程(可画图或用伪码描述) 1:创建对象。在这一步中主要为了进行配置文件的装载操作,读取所有的配置文件并进行解析、

2: 创建对象。通过创建好的对象可以创建一个对象的实例,同时是生成对象实例的工厂,他在整个应用中应该是,唯一的。 3:创建对象。对象类似于数据库的连接对象,可以理解为与数据库建立的一个连接,但是他的功能要比中的对象丰富很多。 4:开始一个事务。在中定义一个事务操作的开始,这是使用进行持久化操作必不可少的步骤 5:进行持久化操作。在这个步骤中可以读取或者保存对象。 6:结束事务。在操作完成之后还要进行显式的结束事务的操作。 7:关闭。类似于释放数据库的连接。 5、为什么要实现序列化? 1、序列化以某种存储形式使自定义对象持久化 2、序列化将对象转换为可传输方式从一个地方传递到另一个地方 3、序列化使程序更具维护性 6、比较一下中的()和()方法 1、创建的会和绑定到当前线程,而不会。 2 、创建的线程会在事务回滚或事物提交后自动关闭,而必须手动关闭 7、比较一下中的()和()方法,以及如何保证每次都是从数据库读取而不是在缓存中读? ()和()方法均可以根据指定的实体类和从数据库读取记录,并返回与之对应的实体对象。

J2EE简答题及答案

1、简述J2EE的四层模型。 运行在客户端机器上的客户层组件 运行在J2EE服务器上的Web层组件 运行在J2EE服务器上的业务逻辑层组件 运行在EIS服务器上的企业信息系统层软件 2、什么是对象持久化? 即把数据(如内存中的对象)保存到可永久保存的存储设备中(如磁盘)。持久化的主要应用是将内存中的数据存储在关系型的数据库中,当然也可以存储在磁盘文件中、XML数据文件中等等。 3、简述一下ORMAPPING,为什么我们使用它? ORM(Object Relational Mapping)是一种为了解决面向对象与关系型数据库存在的互不匹配的现象的技术。简单说:ORM是通过使用描述对象和数据库之间映射的元数据,将Java程序中的对象自动持久化到关系数据中。本质上就是将数据从一种形式转换到另外一种形式。 原因:用它来架起对象和关系型数据库的桥梁,可解决对象层次的映射、对象关系的映射以及对象的持久化问题。 4、简述一下如何使用Hibernate实现对象持久化的过程(可画图或用伪码描述)STEP 1:创建Configuration对象。在这一步中主要为了进行配置文件的装载操作,读取所有的配置文件并进行解析

STEP 2: 创建SessionFactory对象。通过创建好的Configuration对象可以创建一个sessionFactory对象的实例,同时是生成Session对象实例的工厂,他在整个应用中应该是唯一的。 STEP 3:创建Session对象。 Session对象类似于数据库的连接对象,可以理解为与数据库建立的一个连接,但是他的功能要比JDBC中的Connection对象丰富很多。 STEP 4:开始一个事务。在Java中定义一个事务操作的开始,这是使用Hibernate 进行持久化操作必不可少的步骤 STEP 5:进行持久化操作。在这个步骤中可以读取或者保存Java对象。 STEP 6:结束事务。在操作完成之后还要进行显式的结束事务的操作。 STEP 7:关闭Session。类似于释放数据库的连接。 5、为什么要实现序列化? 1、序列化以某种存储形式使自定义对象持久化 2、序列化将对象转换为可传输方式从一个地方传递到另一个地方 3、序列化使程序更具维护性 6、比较一下sessionFactory中的opensession()和getcurrentsession()方法。 1、getCurrentSession创建的session会和绑定到当前线程,而openSession不会。 2 、getCurrentSession创建的线程会在事务回滚或事物提交后自动关闭,而

J2ee复习题3

一、填空 2. 在Tomcat服务器中部署Web应用程序时,可以直接将Web程序归档文件W AR存放到tomcat服务的_______________ webapps ________目录中。 3. 在Servlet中用来接收客户表单数据的两个常用方法为____ doGet _________、_____doPost________。 4. 在一个应用程序中不同的页面共享数据时,最好的JSP内置对象为__________application /session _______。 7. JDBC中_________DriverManager/Connection _接口用于连接数据库。 8. Resulset接口的_________next()_方法可以使结果集指针指向下行数据。 二、单选选择 1.在JSP中如果要导入java.io.* 包,应该使用_________A______指令。 A. page B. taglib C. include D. forward 2.如果当前JSP页面出现异常时需要转到一个异常页,需要设置page 指令的__D______属性。 A. Exception B. isErrorPage C. error D. errorPage 3.在MVC模式中,核心内容为____C____。 A. view B. control C. model D. 不确证 8.sesson对象的_______D___方法用于判断是否为开始新会话。 A. begin() B. isNewSessionID() C. invalidate() D. isNew() 9.创建JSP应用程序时,配置文件web.xml应该在程序下的____C______目录中。 A. admin B. servlet C. WEB-INF D. WebRoot 10.下列不属于URL的组件部分为____________D___________。 A. 协议 B. IP地址或域名 C.目录或文件 D. 服务器名称 11.下列表单

,如果单击提交按钮时,表单____________C____________。 A. 没有指定action属性,所以不做提交 B. 使用post方式提交 C. 提交到当前页 D. 不确定 13.JSP中的隐式注释为_______C____________。 A. // 注释内容 B. C. <%--注释内容--%> D. /* 注释内容*/ 14.下列__A______指令定义在JSP编译时包含所需要的资源。 A. include B. page C. taglib D. forward 15.如果编写一个计数器程序,用来记载当前网站的访问量,最好采用JSP中的_____D _对象。 A. page B. session C. request D. application 16.下列可以正确获取当前Web程序物理路径的方法为_____A__________。 A.request.getRealPath(“/”) B.request.getFile(“/”) C. esponse.getRealPath(“/”) D. response.getFile(“/”) 19.如果想在tomcat服务器启动时将jar包加载到内存,且该jar包可以被tomcat服务器上所有的应用使用,应该将该jar包复制到tomcat的________C_____________目录。 A. common B. server C. lib D. server\lib 20.Tomcat服务器的默认端口为________C______________。 A. 8888 B. 8001 C. 8080 D. 80 22.如果在网页上显示一幅图片,下面哪句代码是正确的_____A________________。

JAVA高级面试题集及答案

1 1、BS与CS的联系与区别。 回答:C/S 是Client/Server 的缩写。服务器通常采用高性能的PC、工作站或小型机,并采用大型数据库系统,如Oracle、 Sybase、Informix 或SQL Server。客户端需要安装专用的客户端软件。B/S是Brower/Server 的缩写,客户机上只要安装 一个浏览器(Browser),如Netscape Navigator 或Internet Explorer,服务器安装Oracle、Sybase、Informix或SQL Server 等数据库。在这种结构下,用户界面完全通过WWW浏览器实现,一部分事务逻辑在前端实现,但是主要事务逻辑在服务器端 实现。浏览器通过web Server 同数据库进行数据交互。 C/S 与B/S 区别: 1.硬件环境不同: C/S 一般建立在专用的网络上, 小范围里的网络环境, 局域网之间再通过专门服务器提供连接和数据交换服务. B/S 建立在广域网之上的, 不必是专门的网络硬件环境,例与电话上网, 租用设备. 信息自己管理. 有比C/S 更强的适 应范围, 一般只要有****作系统和浏览器就行 2.对安全要求不同 C/S 一般面向相对固定的用户群, 对信息安全的控制能力很强. 一般高度机密的信息系统采用C/S 结构适宜. 可以通 过B/S 发布部分可公开信息. B/S 建立在广域网之上, 对安全的控制能力相对弱, 可能面向不可知的用户。 3.对程序架构不同 C/S 程序可以更加注重流程, 可以对权限多层次校验, 对系统运行速度可以较少考虑. B/S 对安全以及访问速度的多重的考虑, 建立在需要更加优化的基础之上. 比C/S 有更高的要求B/S 结构的程序架构 是发展的趋势, 从MS 的.Net系列的BizTalk 2000 Exchange 2000等, 全面支持网络的构件搭建的系统. SUN 和IBM推的 JavaBean 构件技术等,使B/S更加成熟. 4.软件重用不同 C/S 程序可以不可避免的整体性考虑, 构件的重用性不如在B/S要求下的构件的重用性好. B/S 对的多重结构,要求构件相对独立的功能. 能够相对较好的重用.就入买来的餐桌可以再利用,而不是做在墙上的石 头桌子 5.系统维护不同 C/S 程序由于整体性, 必须整体考察, 处理出现的问题以及系统升级. 升级难. 可能是再做一个全新的系统 B/S 构件组成,方面构件个别的更换,实现系统的无缝升级. 系统维护开销减到最小.用户从网上自己下载安装就可以实 现升级. 6.处理问题不同 C/S 程序可以处理用户面固定, 并且在相同区域, 安全要求高需求, 与****作系统相关. 应该都是相同的系统

10计算机《J2EE试卷-期末》含答案

10计算机《J2EE试卷-期末》含答案 以下是为大家整理的10计算机《J2ee试卷-期末》含答案的相关范文,本文关键词为计算机,J2ee试卷-期末,答案,河海,大学,文天,学院,2,您可以从右上方搜索框检索更多相关文章,如果您觉得有用,请继续关注我们并推荐给您的好友,您可以在综合文库中查看更多范文。 河海大学文天学院20XX~20XX学年度(二) 10计算机《J2ee应用架构与eclipse开发技术》期末试卷 一、填空题:(共10小题,每空2分,共20分)

1.根据Java应用环境的不同可将Java平台划分为三种类型的版本,其中用于创建嵌入式应用程序的Java平台版本是_____J2me_________。 2.在hTmL中,一组选项中只可以选择单项的表单元素是___radio________。 3.web服务器会加载servlet类创建一个servlet对象,这个对象调用___init()_____方法完成必要的初始化工作。 4.在Tomcat中访问helloapp应用的login.html文件时,在浏览器地址栏应写的url为:___________________________________________________________ ____(注:端口号为8080)。 5.Jsp文件中,一个Jsp页面可以有许多程序片,这些程序片将被Jsp引擎按顺序执行,请问插入Java程序片的标记符为:___________。 6.在Jsp中,注释可以增强Jsp文件的可读性,并易于Jsp文件的维护。Jsp中的注释可分为两种,一种是hTmL注释,另一种为Jsp注释,其中Jsp注释的标记符号为______。 7.在“Jsp+Javabean”二层架构中增加了控制层,引入“控制器”概念以释放Jsp的控制逻辑功能,请问控制器角色由_servlet____________来担任。 8.servlet容器启动每一个web应用时,都会为它创建一个唯一的_____AppLIcATIon____对象,该对象和web应用有相同的生命周期。 9.如果要在Jsp页面中使用struts2提供的标签库,首先必须在页

J2EE考试题目及答案

J2EE简答题 1、简述J2EE的四层模型。 运行在客户端机器上的客户层组件;运行在J2EE服务器上的Web层组件;运行在J2EE服务器上的业务逻辑层组件;运行在EIS服务器上的企业信息系统层软件 2、什么是对象持久化? 即把数据(如内存中的对象)保存到可永久保存的存储设备中(如磁盘)。持久化的主要应用是将内存中的数据存储在关系型的数据库中,当然也可以存储在磁盘文件中、XML数据文件中等等。 3、简述一下ORMAPPING,为什么我们使用它? ORM(Object Relational Mapping)是一种为了解决面向对象与关系型数据库存在的互不匹配的现象的技术。简单说:ORM是通过使用描述对象和数据库之间映射的元数据,将Java程序中的对象自动持久化到关系数据中。本质上就是将数据从一种形式转换到另外一种形式。 原因:用它来架起对象和关系型数据库的桥梁,可解决对象层次的映射、对象关系的映射以及对象的持久化问题。 4、简述一下如何使用Hibernate实现对象持久化的过程(可画图或用伪码描述) STEP 1:创建Configuration对象。在这一步中主要为了进行配置文件的装载操作,读取所有的配置文件并进行解析、

STEP 2: 创建SessionFactory对象。通过创建好的Configuration对象可以创建一个sessionFactory对象的实例,同时是生成Session对象实例的工厂,他在整个应用中应该是,唯一的。 STEP 3:创建Session对象。 Session对象类似于数据库的连接对象,可以理解为与数据库建立的一个连接,但是他的功能要比JDBC中的Connection对象丰富很多。 STEP 4:开始一个事务。在Java中定义一个事务操作的开始,这是使用Hibernate进行持久化操作必不可少的步骤 STEP 5:进行持久化操作。在这个步骤中可以读取或者保存Java对象。 STEP 6:结束事务。在操作完成之后还要进行显式的结束事务的操作。 STEP 7:关闭Session。类似于释放数据库的连接。 5、为什么要实现序列化? 1、序列化以某种存储形式使自定义对象持久化 2、序列化将对象转换为可传输方式从一个地方传递到另一个地方 3、序列化使程序更具维护性 6、比较一下sessionFactory中的opensession()和getcurrentsession()方法 1、getCurrentSession创建的session会和绑定到当前线程,而openSession 不会。 2 、getCurrentSession创建的线程会在事务回滚或事物提交后自动关闭,而openSession必须手动关闭 7、比较一下session中的load()和get()方法,以及如何保证每次都是从数据库读取而不是在缓存中读? load()和get()方法均可以根据指定的实体类和id从数据库读取记录,并返回与之对应的实体对象。 其区别在于:如果未能发现符合条件的记录,get方法返回null,而load方法会抛出一个ObjectNotFoundException。 Load方法可返回实体的代理类实例,而get方法永远直接返回实体类。

J2EE期末复习题

一、选择题 1)、在J2EE中,<%=”2”+4%>将输出()。(选择一项) a) 2+4 b) 6 c) 24 d) 不会输出,因为表达式是错误的 2)J2EE中,JSP表达式语言的语法是()。(选择一项)a) {EL expression} b) ${EL expression} c) @{EL expression} d) &{EL expression} 3)在J2EE中,下列()语句可以获取页面请求中的一个文本框的输入(文本框的名字为title)。(请选择一项)a) response.getParameter(“title”); b) request.getAttribute(“title”); c) requert.getParameter(“title”); d) requert.getParameters(“title”); 4)J2EE中,HttpSession接口位于()包中。(选择一项)a) javax.servlet b) javax.servlet.http c) javax.servlet.http.session d) javax.servlet.session 5)在J2EE中,test.jsp文件中有如下一行代码: 要使user对象在用户对其发出请求时存在,下划线中应填入()。(选择一项)a) Page b) request c) Session d) application 6)在J2EE MVC设计模式体系结构中,()是实现控制器的首选方案。(选择一项)a) JavaBean b) Servlet c) JSP d) HTML e) XML 7) 在J2EE中,若要在JSP正确使用标签:,在jsp中声明的taglib指令为:<%@taglib uri=”/WEB-INF/myTags.tld”prefix=”-_____”%>,下列线处应该是()。(选择一项)a) x b) getKing b) myTags d) king 8)J2EE中在JSP中要使用user包中的User类,则以写法正确的是()。(选择一项)a) b) c) d) 9) J2EE中,HttpServletRequest类的( )方法用返回与当前请求相关联的会话,如果没有,则返回null。(选择一项)a) getSession() b) getSession(true) c) getSession(false) d) getSession(null)

10计算机《J2EE试卷-期末》含答案

河海大学文天学院2012~2013学年度(二) 10计算机《J2EE 应用架构与Eclipse 开发技术》期末试卷 一、填空题:(共10小题,每空2分,共20分) 1.根据Java 应用环境的不同可将Java 平台划分为三种类型的版本,其中用于创建嵌入式应用程序的J ava 平台版本是_____J2ME_________。 2. 在HTML 中,一组选项中只可以选择单项的表单元素是___radio________。 3. WEB 服务器会加载Servlet 类创建一个Servlet 对象,这个对象调用___init()_____方法完成必要的初始化工作。 4. 在Tomcat 中访问helloapp 应用的login.html 文件时,在浏览器地址栏应写的url 为:_______________________________________________________________(注:端口号为8080)。 5. JSP 文件中,一个JSP 页面可以有许多程序片,这些程序片将被JSP 引擎按顺序执行,请问插入Java 程序片的标记符为:__<% %>_________。 6. 在JSP 中,注释可以增强JSP 文件的可读性,并易于JSP 文件的维护。JSP 中的注释可分为两种,一种是HTML 注释,另一种为JSP 注释,其中JSP 注释的标记符号为___<%-- --%>___。 7. 在“JSP+JavaBean ” 二层架构中增加了控制层,引入“控制器”概念以释放JSP 的控制逻辑功能,请问控制器角色由_Servlet____________来担任。 8. Servlet 容器启动每一个web 应用时,都会为它创建一个唯一的_____APPLICATION____对象,该对象和web 应用有相同的生命周期。 9.如果要在JSP 页面中使用Struts 2提供的标签库,首先必须在页面中使用_____PAGE_____编译指令导入标签库。 10.L10N 是___________________________的缩写形式,本意是指软件的________________。 二、判断题:(共10小题,每题2分,共20分) 1.Tomcat 的端口一旦配置好,就不可以再改变。()F 2.JSP 中声明的一个变量的例子如下:<%! int i,j %>。F 3.所有用户在同一项目中的Application 对象是相同的,不同项目中的Application 对象是不相同的 ( T ) 4.在通过JDBC 操作数据库时,执行execute(String sql)方法,如果返回值为true ,则表明执行是更新语句。( F ) 5.Include 指令标记语法格式是:<%@ include file=“文件名字”%>。( T ) 6.Servlet 中out 对象和JSP 中内置对象out 是一样的。T 7.session 对象可以使用setAttribute 方法将参数object 指定的对象添加到session 对象中。T 8.JavaBean 就是类文件。T 9.JavaBean 属性声明的关键字一般使用private 。T 10.JSP 中,useBean 如果未指定scope ,则scope 默认为request 。( F ) 三、选择题:(共15小题,每题2分,共30分) 1.Web 客户端、Applets 和应用程序客户端等是J2EE 哪一层的组件:___________ A .Web 层 B.客户层 C .业务层 D.企业信息系统(EIS )层 2.在使用Myeclipse 快捷键操作中,如果要将缺少的Import 语句加入,并将多余的Import 语句被删除使用到哪一种快捷键:_____________ A. Ctrl +Shift+O B. Ctrl+Shift+F C. Ctrl+D D. Ctrl+Shift+M 3. Jsp 中Ja va 表达式的标记符为:_______________ A. <%= %> B. <%! %> C. <%@ %> D. <% %> 4.有关ServletConfig 对象和ServletContext 对象的区别,下列叙述中错误的是:____________ A :从作用范围来说: ServletConfig 作用于整个Web 应用并在Servlet 容器启动时加载。ServletContext 作用于某个特定的Servlet , B :如果一个参数为整个Web 应用所用,那么就配置为ServletContext 参数;如果仅为一个Servlet 所用,那么就应该配置为ServletConfig 参数 。 C :访问ServletConfig 参数,取得ServletConfig 对象后,调用getInitParameter()方法; D :访问ServletContext 参数,需先调用现有的ServletConfig 对象的getServletContext(),然后调用getInitParamter()方法才能获取参数。 5. 在保存JSP 页面时,文件名必须符合规定,以下不符合JSP 文件命名规定的是:____________ A :login.jsp B :51job.jsp C :a_3.jsp D :abc_$.jsp 6.MVC 设计模式的含义理解错误的是:__________ A .模型(model )是应用程序的数据和业务规则集合,通常被称作应用程序的业务逻辑。 B .视图(view )是应用程序的用户界面。 C .控制器(controller )定义了应用程序与用户输入及模型进行交互的方式,它被称作应用程序的控制逻辑。 D .通过明确区分各个层,MVC 允许组成每个层的各个组件之间紧密地耦合。 7.与JSP 文件类似,Tag 文件中也有一些常用指令,这些指令影响Tag 文件的行为。下列叙述中不属于Tag 文件中经常使用的指令是:____________ 专业 班级 姓名 学号 ----------------------------------------------- 密 -------------------------------- 封 --------------------------- 线 ------------------------------------------------------------

jee中最常用设计模式

j e e中最常用设计模式文件排版存档编号:[UYTR-OUPT28-KBNTL98-UYNN208]

创建型模式:1.FactoryPattern工厂模式 概述:定义一个用于创建对象的接口,让子类决定实例化哪一个类。FactoryMethod使一个类的实例化延迟到其子类。 适用性: 1.当一个类不知道它所必须创建的对象的类的时候。 2.当一个类希望由它的子类来指定它所创建的对象的时候。 3.当类将创建对象的职责委托给多个帮助子类中的某一个,并且你希望将哪一个帮助子类是代理者这一信息局部化的时候。 类图: 2.SingletonPattern单例模式 概述:保证一个类仅有一个实例,并提供一个访问它的全局访问点。 适用性: 1.当类只能有一个实例而且客户可以从一个众所周知的访问点访问它时。 2.当这个唯一实例应该是通过子类化可扩展的,并且客户应该无需更改代码就能使用一个扩展的实例时。 类图: 结构型模式: 3.Fa?adePattern外观模式 概述:为子系统中的一组接口提供一个一致的界面,Facade模式定义了一个高层接口,这个接口使得这一子系统更加容易使用。 适用性:

1.当你要为一个复杂子系统提供一个简单接口时。子系统往往因为不断演化而变得越来越复杂。大多数模式使用时都会产生更多更小的类。这使得子系统更具可重用性,也更容易对子系统进行定制,但这也给那些不需要定制子系统的用户带来一些使用上的困难。Facade可以提供一个简单的缺省视图,这一视图对大多数用户来说已经足够,而那些需要更多的可定制性的用户可以越过facade层。 2.客户程序与抽象类的实现部分之间存在着很大的依赖性。引入facade将这个子系统与客户以及其他的子系统分离,可以提高子系统的独立性和可移植性。 3.当你需要构建一个层次结构的子系统时,使用facade模式定义子系统中每层的入口点。如果子系统之间是相互依赖的,你可以让它们仅通过facade进行通讯,从而简化了它们之间的依赖关系。 类图: 4.AdapterPattern适配器模式 概述:将一个类的接口转换成客户希望的另外一个接口。Adapter模式使得原本由于接口不兼容而不能一起工作的那些类可以一起工作。 适用性: 1.你想使用一个已经存在的类,而它的接口不符合你的需求。 2.你想创建一个可以复用的类,该类可以与其他不相关的类或不可预见的类(即那些接口可能不一定兼容的类)协同工作。 3.(仅适用于对象Adapter)你想使用一些已经存在的子类,但是不可能对每一个都进行子类化以匹配它们的接口。对象适配器可以适配它的父类接口。 类图: 5.BridgePattern桥接模式 概述:将抽象部分与它的实现部分分离,使它们都可以独立地变化。

J2EE和web考试试题

J2EE考试试题(每题2分,共100分) 姓名:班级: 针对如下题目,请选择符合题目要求的答案,针对每一道题,所有答案都选对,则该题得分,错选、不选、漏选均不得分。每题2分。 1、所有Web应用程序都基于(b)架构。(单选) A.C/S B.B/S C.Spring D.MVC 2、在Web应用程序的三层体系结构中,包含系统的功能代码的是下面哪个组件(b)。(单选) A.表示层 B.业务层 C.数据存取层 D.代码层 3、以下说法不正确的是(c)。(单选) A.使用三层体系结构,大大的降低了各个组件之间的耦合性模块之间互联成都的度量。 B.由于表示逻辑和数据存取逻辑相互独立,因而可以方便地扩充表示逻辑,使系统具有良好的可扩展性。 C.由于各个组件的相互独立,所以在多个组件之间共享代码变得困难,所以有很多代码都需要重新编写。 D.三层体系结构便于良好的分工合作。 4、在Tomcat的主目录下,那个文件夹用于发布J2EE应用程序(d)。(单选) A.bin B.webapps C.webapp D.server 5、J2EE应用程序主目录中,web.xml是网站的主要配置文件,它位于文件夹(d)下。(单选) A.根目录下 B.classes C.lib D.WEB-INF 6、Servlet实质上就是一个Java类,它的父类是(a)。(单选) A.HttpServlet B.HttpServletRequest C.InternetServlet

D.HttpSession 7、你是一个公司的网站管理员,网站的物理路径为"C:\Tomcat\webapps\shop\",现在,你使用ServletContext对象的getRealPath方法返回一个字符串,代码如下: ServletContext context = this.getServletContext(); String str = context.getRealPath("image/"); 现在字符串变量str的值是(d)。(单选) A.C:\image\ B.C:\Tomcat\image C.C:\Tomcat\webapps\ image D.C:\Tomcat\webapps\ shop\image 8、以下HttpServletRequest对象的方法中,哪些可以获得客户端用户传递过来的参数(bc)。(选择两项) A.getAttribute() B.getParameter() C.getParameterValues() D.getPathInfo() 9、(d),是指客户端打开与服务器的连接发出请求和服务器响应请求的一段时间。(单选) A.ServletContext B.Request C.Response D.Session 10、以下哪种情况会导致Session的失效(ad )。(选择两项) A.在超过了timeout的指定时间内,用户都没有做任何动作,没有访问网站的任何页面 B.用户关闭了网页 C.用户直接关闭了电脑 D.调用了Invalidate方法 11、以下哪个不是Servlet中的作用范围(d)。(单选) A.Session B.Request C.ServletContext D.Page 12、以下不属于JSP指令元素的是(d)。(单选) A.page B.include C.taglib D.import

相关主题
文本预览
相关文档 最新文档