快捷搜索:

Struts HOW-TO 系列 之 数据库访问

Struts HOW-TO 系列 之 数据库造访

--------------------------------------------------------------------------------

Struts HOW-TO 系列

++如何造访数据库++

[造访一个数据库]

在一个其于Struts的利用系统的设计历程中,最好能在web/表示层(presentation layer)和你的商务逻辑类(包孕所稀有据造访操作的层)的中心,定义一个Action类,作为小型的适配器(thin adapter)。

以是,你可以先定义一些商务API(business API),这些API便是简单的Java类。你可以通报一些参数给这些工具,并从这些工具返回一个Java Bean或者Java Bean的聚拢。这个Action类认真调用这些工具,并把它们返回的值通报给web/表示层。

平日,你可以为每一个你必要调用的商务措施/商务类API创建一个Action类。抱负环境下,所有的数据库造访代码都被封装进了这些商务API类里,以是Struts并不知道你正在应用的持久层(persistent layer)(以致都不知道你应用了持久层)。它只必要通报一个主键(Key)或者一个查询参数,然后处置惩罚返回的结果bean或者bean聚拢。这样,你就可以在其他的利用情况里复用这些商务API类,你还可以对这些自力于Struts或HTTP情况的商务API进行单体测试。

开始的时刻,最简单的措施便是设计一个1:1的规划,为你的每一个商务API进口(entry-point)定义一个Action类。当你的履历富厚了今后,你也可以应用DispatchAction组合这些Action类。你以致可以定义一个简单的"框架"Action,用来调用所有的这些商务类。你可以在contrib目录里找到Scaffold设计的ProcessAction,这是一个"框架"Action的完备实现。应用这种规划可以应用更少的Action类,但你必须对Struts和MVC框架的底层实现有较深的理解。不症结怕在开始的时刻定义过多的Action,Struts的设置设置设备摆设摆设规划可以给予你充分的自由在今后重构你的设计,由于你可以机动的改变你的Action类,而不会对利用法度榜样造成影响。

在抱负环境下,商务逻辑层(business logic layer)应该封装所有的数据造访细节,包括数据库连接的得到。然则,一些利用法度榜样的设计要求调用者可以从一个DataSource工具来得到数据库连接。碰到这种环境时,Struts DataSource治理器可以使你在必要的时刻设置设置设备摆设摆设这些DataSource资本。

Struts DataSource治理器在Struts设置设置设备摆设摆设文件(Struts-config.xml)里定义。这个治理器可以用来分发和设置设置设备摆设摆设任何实现了javax.sql.DataSource接口的数据库连接池(connection pool)。假如你的DBMS或者容器内置了相符这些要求的连接池,你可以优先选用它。

[Jakarta的公共连接池实现 - BasicDataSource]

假如你的手头没有连接池的本地(native)实现,你可以应用Jakarta供给的公共连接池实现[org.apache.commons.dbcp.BasicDataSource],它可以和DataSource治理器"相助"的很好。别的,Struts还在它的util包里包孕了一个GenericDataSource类,这也是一个连接池实现。然则这只是一个异常简单的实现规划,不保举应用,由于它可能在Struts的今后版本中被BasicDataSource或其它的数据源实现调换掉落。

下面是一段Struts-config.xml设置设置设备摆设摆设文件中的数据源设置设置设备摆设摆设(应用GenericDataSource数据源实现),你可以变动响应的设置以得当你自己的系统。

应用BasicDataSource数据源实现的设置设置设备摆设摆设规划如下:

留意,你可以在你的利用系统中定义不止一个数据源,你可以根据必要定义多个数据源,并为它们分手起一个逻辑名(logical name)。这样做可以给你的利用系统供给更好的安然性和可丈量性(scalability),你还可以定义一个专用于测试的数据源。

设置设置设备摆设摆设好DataSource今后,你就可以在你的利用系统中应用这些数据源了。下面这段代码演示了如何在Action类的execute措施中经由过程这些数据源来天生数据库连接。

public ActionForward execute(

ActionMapping mapping,

ActionForm form,

HttpServletRequest request,

HttpServletResponse response)

throws Exception

{

DataSource dataSource;

Connection cnn;

try

{

dataSource = getDataSource(request);

cnn = dataSource.getConnection();

// 数据连接已经建立了,你可以做你想做的工作了

}

catch (SQLException e)

{

getServlet().log("处置惩罚数据库连接", e);

}

finally

{

// 在finally块里包孕这些代码

// 用以包管连接着末会被关闭

try

{

cnn.close();

}

catch (SQLException e)

{

getServlet().log("关闭数据库连接", e);

}

}

}

留意:假如你应用公共的BasicDataSource,你供给给pingQuery属性的查询语句(假如你设置了话)必须至少要能返回一行记录。

例子:SELECT COUNT(*) FROM VALIDTABLE

你可以把VALIDTABLE调换成你的数据库中包孕的任何有效的表。

[应用多个数据源]

假如你必要在模块(Module)中应用多于一个的数据源,你可以在设置设置设备摆设摆设文件的元素里包孕一个key属性。

…属性设置设置设备摆设摆设略, 同上…

…属性设置设置设备摆设摆设略, 同上…

你代码里,你可以经由过程这些key得到不合的数据源。代码如下:

try

{

dataSourceA = getDataSource(request, "A");

dataSourceB = getDataSource(request, "B");

你可以根据必要为每一个模块设置多个数据源。但同一模块里每个数据源的key属性必须独一,由于Struts模块系统因此每一个模块为单位治理命名空间的。

[更多的内容请参考:]

http://www.mail-archive.com/Struts-user@jakarta.apache.org/msg24621.html

http://www.mail-archive.com/Struts-user@jakarta.apache.org/msg24709.html

http://www.mail-archive.com/Struts-user@jakarta.apache.org/msg24626.html

http://www.mail-archive.com/Struts-user@jakarta.apache.org/msg24331.html

http://www.mail-archive.com/Struts-user@jakarta.apache.org/msg24102.html

http://www.mail-archive.com/Struts-user@jakarta.apache.org/msg23501.html

http://www.mail-archive.com/Struts-user@jakarta.apache.org/msg23455.html

http://www.mail-archive.com/Struts-user@jakarta.apache.org/msg23375.html

http://www.mail-archive.com/Struts-user@jakarta.apache.org/msg23321.html

http://www.mail-archive.com/Struts-user@jakarta.apache.org/msg23098.html

http://www.mail-archive.com/Struts-user@jakarta.apache.org/msg22713.html

http://www.mail-archive.com/Struts-user@jakarta.apache.org/msg21974.html

http://www.mail-archive.com/Struts-user@jakarta.apache.org/msg21026.html

http://www.mail-archive.com/Struts-user@jakarta.apache.org/msg19338.html

http://www.mail-archive.com/Struts-user@jakarta.apache.org/msg18323.html

http://www.mail-archive.com/Struts-user@jakarta.apache.org/msg14975.html

http://www.mail-archive.com/Struts-user@jakarta.apache.org/msg14914.html

http://www.mail-archive.com/Struts-user@jakarta.apache.org/msg14435.html

http://www.mail-archive.com/Struts-user@jakarta.apache.org/msg01562.html

转换/数据通报(Transformation/Data Transfer)

http://www.mail-archive.com/Struts-user@jakarta.apache.org/msg24480.html

http://www.mail-archive.com/Struts-user@jakarta.apache.org/msg23623.html

http://www.mail-archive.com/Struts-user@jakarta.apache.org/msg10195.html

http://www.mail-archive.com/Struts-user@jakarta.apache.org/msg10205.html

[供给动态结果集(dynamic result set)]

大年夜多半的数据库查询结果都邑跟你的已经应用的ActionForms逐一对应,你只必要把你的查询结果聚拢提交给响应的ActionForm就可以了。但无意偶尔候,结果集(ResultSet)里有些字段并不是ActionForm的属性,或者更糟。

幸运的是,Struts的自定义标签集并不关心你通报给他们的bean类型。你以致可以直接输出结果集。然则因为结果聚会会议不停维持着与数据库的连接,并且因为它们把所有的数据都直接通报给了JSP,使得页面变得零乱不堪。那么我们该怎么做呢?

从Struts 1.1开始,你可以应用新增添的ResultSetDynaClass来把你的结果集转换成一个DynaBeans的ArrayList。Struts自定义标签集可以像一样平常的JavaBean一样应用DynaBean的属性。(关于DynaActionForm类更具体的信息,请参考Struts用户手册)。

ResultSetDynaClass类已经包孕在于BeanUtils.jar包中,以是你现在所要做的,只必要拿出这个对象,实现自己的通报规划吧…………

您可能还会对下面的文章感兴趣: