基于Spring框架的WebSphere应用开发(3)

基于Spring框架的WebSphere应用开发(3)

[@more@]

2.ContextLoaderServlet:需要配置<load-on-startup>使得它率先装载。真正装载Context的类是ContextLoader,上面两个类只是两种调用ContextLoader的不同途径。ContextLoader内部实际调用的是XmlWebApplicationContext,其缺省配置文件为/WEB-INF/applicationContext.xml。

如果使用ContextLoaderListener,其在web.xml中的配置一般如下:

<listener>

<listener-class>

org.springframework.web.context.ContextLoaderListener

</listener-class>

</listener>

如果使用ContextLoaderServlet,其在web.xml中的配置一般如下:

<servlet>

<servlet-name>context</servlet-name>

<servlet-class>

org.springframework.web.context.ContextLoaderServlet

</servlet-class>

<load-on-startup>1</load-on-startup>

</servlet>

应用本身可能除了基于HTTP的Web渠道之外还通过别的渠道对外提供服务,因此,一个比较好的做法是把展示相关的配置与后面业务处理部分的配置分开。这样如果更改了应用的访问渠道,只需要修改对应的配置文件即可。因此,Spring提供了一个WebApplicationContext的概念。在WebApplicationContext中一般包含与Web访问相关的配置定义,包括各种控制动作的定义、界面展示的定义等等。

WebApplicationContext一般由DispatcherServlet来初始化。在上下文层次结构上可以把它看成是ApplcationContext的子上下文。在缺省的情况下,DispatcherServlet装载的配置文件名称为其Servlet名称-Servlet.xml,但是可以通过contextConfigLocation参数来定制。DispatcherServlet在web.xml中的定义示例如下:

<servlet>

<servlet-name>Dispatcher</servlet-name>

<servlet-class>

org.springframework.web.servlet.DispatcherServlet

</servlet-class>

<load-on-startup>2</load-on-startup>

</servlet>

<init-param>

<param-name>contextConfigLocation</param-name>

<param-value>/WEB-INF/context/Webcontrollers.xml</param-value>

</init-param>

2.4 数据持久化层

虽然使用J2EE技术的Web应用可以连接多种不同的企业信息系统(EIS),但是毫无疑问数据库是其中最为重要和常见的一种。正因如此,Spring对数据库访问提供了非常完备的支持。数据访问对象(DAO)模式是J2EE模式中非常重要的一种。它的主要目的是使得持久化层与业务逻辑层分离,从而屏蔽持久化层的具体实现。我们可以把Spring的DAO支持分为两大类,一是直接基于Spring JDBC模板的数据访问,另一类是基于某种O/R映射框架的数据访问。这里刚好可以使用Spring的控制反转特性,通过外部配置文件来定义DAO接口和实际实现类之间的关系。Spring框架目前支持的O/R映射框架包括Hibernate、JDO、TopLink、iBATIS等。

假设我们定义了一个userDAO。当使用JDBC来实现这个DAO的时候,定义的类可以如下所示:

public class userDAOJDBC extends JdbcDaoSupport implements userDAO{ … }

如果使用Hibernate来实现这个DAO的时候,定义的类如下:

public class UserDAOHibernate extends HibernateDaoSupport implements UserDAO { … }

Spring对于其它的O/R映射机制都有相应的抽象类供应用使用,比如对于iBATIS有SqlMapClientDaoSupport,对于JDO有JdoDaoSupport等。

下面我们看一下如何在Spring的配置文件中定义上述DAO与具体实现的关系。假设我们的userDAO具体实现是通过Hibernate,那么在applicationContext.xml中的一个DAO可以定义如下:

<bean id="userDAO" class="com.fgw.dao.hibernate.UserDAOHibernate">

<property name="sessionFactory">

<ref local="sessionFactory"/>

</property>

</bean>

在这里我们实际DAO接口定义是:com.fgw.dao.UserDAO,而具体实现类为:com.fgw.dao.hibernate.UserDAOHibernate。显然,对于其它DAO的实现,我们只需要在配置文件中修改相应的实现类(具体实现类当然是比不可少的)和属性即可。比如对于JDBC的DAO实现,属性就定义成相应的数据源。

3、Spring与WebSphere应用服务器的配合

Spring与底层J2EE应用服务器还是存在一些需要结合的地方,这里给出WAS中的一些结合点。

3.1 使用WAS数据源

在Java应用程序中,数据库的连接一般有两种方式来得到。一种是通过java.sql.DriverManager的方式来得到数据库连接。这种方式不依赖于应用服务的支持,但是也不提供数据库连接池的功能。另外一种方式是通过javax.sql.DataSource的方式来得到数据库连接。在传统基于J2EE的应用需要通过JNDI来得到数据源(javax.sql.DataSource)对象,然后再通过数据源来得到相应的数据库连接。常见的应用服务器都支持这种方式,且一般都提供了数据库连接池的支持。虽然说我们一般推荐使用数据库连接池,但是也有一些时候我们需要脱离开应用服务器的环境使用数据库(比如单元测试,比如应用移植等)。然而应用程序使用这两种方式的时候代码是不一样的,因此只能通过代码来应变。Spring提供了一个统一使用数据源的解决方案,然后通过控制反转的机制用外部配置文件来指定使用的数据源。这样一方面可以统一这两种得到数据库连接的方式,另一方面也不需要像通常的J2EE应用通过繁琐的JNDI代码来得到数据源。这样应用程序也就不需要知道使用的何种数据源。

Spring提供了一个DriverManagerDataSource类来统一第一种方式的数据源获取。如果使用WAS中的Cloudscape数据库,用外部配置文件可配置如下:

<bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource">

<property name="driverClassName">

<value>com.ibm.db2j.jdbc.DB2jDriver</value>

</property>

<property name="url">

<value>jdbc:db2j:D:DBName</value>

</property>

</bean>

Spring提供了JndiObjectFactoryBean类来支持第二种方式的数据源获取。假设WAS中已经配置好的数据源名称为jdbc /MyDB,那么用外部配置文件可配置如下:

<bean id="dataSource"

class="org.springframework.jndi.JndiObjectFactoryBean">

<property name="jndiName"><value>java:comp/env/jdbc/MyDB</value></property>

</bean>

或者

<bean id="dataSource"

class="org.springframework.jndi.JndiObjectFactoryBean">

<property name="jndiName"><value>jdbc/MyDB</value></property>

<property name="resourceRef"><value>true</value></property>

</bean>

来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/7839366/viewspace-919849/,如需转载,请注明出处,否则将追究法律责任。

转载于:http://blog.itpub.net/7839366/viewspace-919849/

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值