WAS6.1 +HIBERNATE+SPRING +MYECLIPSE5.1.1 整合

概述

Hibernate 是传统的 Java 对象 (POJO) 的开放源代码持久性框架,它通过 XML 配置文件提供 POJO 到关系数据库表的与对象相关的映射。 Hibernate 框架是应用程序调用的、用于数据持久性的数据访问抽象层。此外, Hibernate 还提供了从 Java 类到数据库表(以及从 Java 数据类型到 SQL 数据类型)的映射以及数据查询和检索功能。 Hibernate 生成必需的 SQL 调用,还负责结果集处理和对象转换。

Hibernate Gavin King Hibernate 项目的奠基人)领导的软件开发团队开发,目的是解决 EJB 2.x 实体 EJB 中存在的诸多缺陷。 Hibernate JBoss Group 紧密关联,这是由于 JBoss 雇佣了大量的一流 Hibernate 开发人员的结果。最近,在 Java Community Process (JCP) 中的持久性框架的发展中已涉及 Hibernate ,并且 Hibernate 的许多概念已合并到 Java Persistence API (JPA) 规范中。最新版本的 Hibernate 将发展为符合 JPA 规范。

   即使拥有良好的工具和优秀技术,应用软件开发也是困难重重。应用开发往往牵扯到方方面面,每件事情都难以控制,而且,开发周期也很难把握(除非它的确是一个重量级的复杂应用,倒也有情可原)。 Spring 提供了一种轻量级的解决方案,用于建立“快装式企业应用”。在此基础上, Spring 还提供了包括声明式事务管理, RMI Web Services 远程访问业务逻辑,以及可以多种方法进行的持久化数据库地解决方案。另外, Spring 还有一个全功能的 MVC 框架,并能透明的把 AOP 集成到你的软件中去。你可以把 Spring 当作一个潜在的一站式企业应用。或者,把 Spring 看作一个标准开发组件,根据自己的需要,只取用它的部分组件使用而无需涉及其他。例如,你可以利用控制反转容器在前台的展现层使用 Struts ,还可以只使用 Hibernate 集成编码 或是 JDBC 抽象层 去处理数据存储。 Spring 被设计成(并将继续保持)无侵入性的方式,意味着应用几乎不需要对框架进行依赖(或根据实际使用的范围,将依赖做到最小)。

       目前 12580 系统正是基于 Spring Hibernate 两个开放源代码项目集成而成的开发框架,采用的 J2EE 规范包括了 EJB Servlet Jsp MVC 等,运行的应用服务器是 BEA Weblogic81 。随着 12580 信息资讯互动中心业务应用的不断发展,业务不断累加,在这种情况下,采用原有的开发框架( Jsp+Servlet+Hibernate+EJB )完成新业务的开发,导致了整个系统的代码不断累加,维护性、运行效率都非常的差,而且对于新来的员工想快速利用原有的开发框架上手非常的难,客户对系统的性能以及业务快速开发要求越来越高,因此 , 为了解决这个问题,利用了开源社区比较成熟的技术对原有的开发框架进行了无缝移植,即将原有的开发技术框架( Jsp+Servlet+Hibernate+EJB )移植到 Jsp+Servlet+Spring Spring+WebWork2 上,开发环境由原来的 WSAD 移植到基于 Eclipse SDK J2EE 开发工具 Myeclipse 。主要是为了减少工作量,减少企业应用对应用服务器的依赖,易于移植到不同的平台中,同时新业务的开发采用新的技术框架,极大的提高了开发进度,为 12580 系统快速推出新业务占领信息市场提供了技术保障。

 

 

环境要求

1.  Application Server IBM WebSphere Application Server V6.1Base_Windows32bit

2.  JDK \IBM\WebSphere6.1\AppServer\java

3.  IDE Eclipse3.2.2+MyEclipse5.1.1

4.  Spring spring-framework-2.0.3

5.  Hibernate hibernate-3.2.2.ga

6.  CVS CVS for NT (CVSNT) 2.0

7.  DB oracle92

可到 \\10.243.194.69\Temp\ 系统移植所需软件下载以上软件。

WAS V6.1 安装以及基本配置

安装

安装过程比较简单,按照安装提示一路操作即可,在此不一一介绍,需要提醒的是要记得安装过程中所设置的用户名、密码,该帐号信息是 WAS 管理控制台的登录帐号。

基本配置

下面以图文并茂的方式简单介绍 WAS 的基本配置,包括常用的环境变量、共享库、 JDBC 提供程序、数据源的配置等。

启动服务器

启动 WAS ,如下图:

选择启动服务器,看到以下内容,表示服务器启动正常,如下图:

进入管理控制台

WAS 的管理控制台端口是 9060 ,具体 URL http://localhost:9060/ibm/console ,也可以通过以下方式登录。

选择管理控制台即可,在打开的 IE 窗口输入管理员帐号、密码,进入管理控制页面,如下图:

配置环境

环境配置主要是配置企业应用系统所用到的依赖 jar 包、路径变量等。常用到的配置有 WebSphere 变量、共享库。

1.  WebSphere 变量

使用此页面来定义替换变量。这些变量指定某些系统定义的值(例如,文件系统根目录)的间接程度。变量有作用域级别,即服务器、节点、集群或单元。某个作用域的值可与其他级别的值不同。当变量具有冲突的作用域值时,粒度较细的值会覆盖作用域级别高一些的值。因此,服务器变量覆盖节点变量,节点变量覆盖集群变量,集群变量覆盖单元变量。具体操作选择左边菜单:环境-》 WebSphere 变量,如下图:

选择新建操作,切换到配置页面,输入名称、值,如下图:

确定之后,系统返回提示是否保存,选择保存,如下图:

保存后则配置的变量生效,可以在其他配置中使用定义好的变量名称代替具体的文件路径。

按同样的方法设置其他需要用到企业应用程序依赖 JAR 的本地文件路径变量配置。如下图:

2.  共享库配置

使用此页面来定义可由已部署应用程序使用的容器范围内共享库。具体操作选择左边菜单:环境-》共享库,如下图:

选择新建操作,切换到共享库配置页面,输入名称、类路径或本机路径,其中设置类路径的话使用到前面定义的路径变量,如果设置本机路径,则可以具体指定本地文件系统所在目录的 jar 文件。输入完毕点确定即可。如下图:

系统提示是否保存,如下图:

保存后,返回共享库配置列表,配置好的共享库,可以在以后的应用系统部署中使用到。如下图:

JDBC 配置

该配置主要是配置企业应用系统所引用到 JNDI 数据源配置。常用到的配置有 JDBC 提供程序、数据源。

1.  JDBC 提供程序

使用此页面来编辑 JDBC 提供程序的属性。 JDBC 提供程序对象包括特定的 JDBC 驱动程序实现类,以便访问环境中的特定供应商数据库。具体操作:选择左边菜单-》 JDBC -》 JDBC 提供程序,如下图:

选择新建操作,系统切换到配置页面,输入名称、类路径或本机库路径、实现类名,以新建 ORACLE 提供 JDBC 程序为例,名称为: Oracle JDBC Driver 、类路径为: ${oracle_jdbc_driver_path}/ojdbc14.jar 或本机路径为: C:\oracle\ora92\jdbc\lib\ojdbc14.jar 、实现类名为: oracle.jdbc.pool.OracleConnectionPoolDataSource ,其中 ${oracle_jdbc_driver_path} 为前面设置的 websphere 变量名称,如下图:

点确定,系统提示保存页面,如下图:

点保存后,系统返回 JDBC 提供程序列表,如下图:

2.  数据源配置

使用此页面来编辑与所选 JDBC 提供程序相关联的数据源设置。数据源对象为应用程序提供用于访问数据库的连接。具体操作:选择左边菜单-》资源-》 JDBC -》数据源,如下图:

选择新建,系统切换到数据源配置页面。

第一步:输入数据源名称: oracle74 JNDI 名称: jdbc/oracle74 ,点下一步,如下图:

第二步:选择 JDBC 提供程序:选择现有的 JDBC 提供程序,从下拉列表中选择 Oracle JDBC Driver ,点下一步,如下图:

第三步:输入数据源的特定于数据库的属性: URL 输入: jdbc:oracle:thin:@10.243.194.73:1521:trustel ,点下一步,如下图:

第四步:总结以上配置信息,点完成,如下图:

点完成按钮后,系统提示是否需要保存,如下图:

点保存后,系统返回数据源列表,如下图:

最后一步:定制数据源属性,这部分比较关键,是初学者比较困惑的地方。我们看到,界面上并没有输入用户名、口令的地方,而没有用户名称、口令是无法连接数据库的,为了成功连接数据库,需要我们手工定制数据源的属性。具体操作如下:

在数据源列表中,点击选择对应的数据源配置信息,系统切换到该配置源信息的页面,如下图:

点定制属性,系统切换到属性定制列表页面,具体操作主要分几步:

1.  选择 driverType ,值输入 oracle.jdbc.driver.OracleDriver 如下图:

确定后保存即可。

2.  同样得方法设置 databasename 的值 trustel servername 的值 10.243.194.74

3.  其他值采用默认值。

4.  设置 user ,点新建按钮,系统切换到常规属性定制页面,名称输入 user ,值输入 gmccadmin ,如下图:

点确定之后保存。

5.  同样得方法设置 password 属性。设置完毕之后,我们看到,“定制属性”中多了两个我们自定义的属性 user password

返回数据源设置页面,点测试连接,提示连接成功,如下图:

 

WAS V61 中部署基于 Spring 的企业 /WEB 应用

Spring 与底层 J2EE 应用服务器还是存在一些需要结合的地方,这里通过图文并茂的方式给出 WAS 中的一些结合点,包括如何使用 WAS 的数据源、 JTA 事务管理、加载 Spring jar 包、部署基于 Spring web 应用。

使用 WAS 数据源

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

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

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

<property name="driverClassName">

<value>oracle.jdbc.driver.OracleDriver</value>

</property>

<property name="url">

<value>jdbc:oracle:thin:@10.243.194.73:1521:trustel </value>

</property>

</bean>

   ( 2 Spring 提供了 JndiObjectFactoryBean 类来支持第二种方式的数据源获取。对于部署在 WAS 上的 Web 应用,在生产环境中推荐使用 WAS 实现的数据库连接池。一方面是因为连接池实现地比较完善。另一方面,使用 WAS 提供的 数据库连接池可以很完善地支持 JTA 事务。在 12580 系统中,我们推荐使用这种方式连接数据源,如果使用环境发生变化,那么只需要修改 Spring 的配置文件即可。假设 WAS 中已经配置好的数据源名称为 jdbc /oracle ,那么我们如何连接到 WAS 定义好的数据源呢?由于 Spring 无法直接从 JndiObjectFactoryBean 类获取到 WAS 配置的数据源,我们只能先通过 WEB 应用利用目标资源 JNDI 名称引用 WAS 的数据源,然后 Spring 再通过 WEB 应用获取到 WAS 的数据源,从而实现了数据源的获取。具体配置片断如下:

web 应用的 web.xml 中配置如下:

       <resource-ref>

              <res-ref-name>jdbc/oracle</res-ref-name>

              <res-type>javax.sql.DataSource</res-type>

              <res-auth>Container</res-auth>

       </resource-ref>

       spring 的配置文件 applicationContext.xml 中配置如下:

    < bean id = "dataSource"

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

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

       < property name = "lookupOnStartup" value = "false" />

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

       < property name = "proxyInterface" value = "javax.sql.DataSource" />

    </ bean >

使用 WAS JTA

   Web 应用程序在使用事务的时候常常会涉 及一个事务类型的选择。是选择像 JDBC 事务这样的本地事务呢还是使用 JTA 支持的全局事务。这个与应用程序需要涉及到的事务管理器类型和个数密切相关。 Spring 本身不支持分布式事务,因此分布式事务需要底层的 JTA 。但是 Spring 提供了事务的抽象,即底层真正事务实现可以切换而不影响应用程序代 码。这样应用程序可以依赖于底层 WAS ,也可以轻易地脱离开应用服务器的环境。这一点与前面数据源的抽象非常类似。因此在 12580 系统中也建议使用 WAS JTA 事务管理。

   WAS 本身对于事务划分有两种支持方式,一种是声明式的,当然这种管理方式需要 EJB 容器的支持,即所谓的容器管理事务( CMT )。另外一种方式是编程式的,通过程序代码 来直接使用 JTA 编程接口。 Spring 对于事务的划分也可以分为声明式和编程式两种方式。对于 Spring 编程式的事务划分方式,总体上可以分为两大类。一类是通过直接使用实现 PlatformTransactionManager 接口的类。另一类是通过使用 TransactionTemplate 模板类,模板类的使用可以简化事务控制代码。 Spring 对于声明式事务划分的支持实际上是利用了它的 AOP 机制。相对于编程式事务划分,这种基于 AOP 的方式比较灵活,而且对代码的侵入性几乎为零。因此,如果没有特殊需要推荐使用这种事务划分方式。基于 AOP 的常用事务划分方式可以使用 ProxyFactoryBean TransactionInterceptor 方式,或者使用 TransactionPorxyFactoryBean 的方式。前一种方式相对比较灵活,而后一种则对使用相对比较简单。

  无论是哪一种事务划分方式,底层都需要一个事务管理机制作为支撑。如果是单一的事务资源管理器,那么根据所使用的后台事务管理资源不同的类型,可以选择的 PlatformTransactionManager 实现有 DataSourceTransactionManager HibernateTransactionManager JdoTransactionManager PersistenceBrokerTransactionManager ,和 JmsTransactionManager 等。无论是单个还是多个事务资源管理器,都可以使用 JtaTransactionManager 类。如果使用 JtaTransactionManager ,那么所有事务管理实际都会委 托给底层应用服务器的 JTA 实现。

   使用 WAS JTA 支持,我们需要在 Spring 的配置文件 applicationContext.xml 配置如下:

<bean id="wasTxMgr"class="org.springframework.transaction.jta.WebSphereTransactionManagerFactoryBean" />

<bean id="transactionManager"class="org.springframework.transaction.jta.JtaTransactionManager><property name="transactionManager"><ref local="wasTxMgr" /></property></bean>

   通过采用 Spring 的事务支持,底层事务采用何种方式的决定就不必在一开始开发就做出决定。因为我们能够通过 Spring 的外部配置文件来进行切换真 正的事务支持。不过,虽然也有第三方的 JTA 支持,但是 WAS 能够提供非常稳定的 XA 支持,因此推荐使用 WAS JTA ,尤其是当应用涉及到分布事务处理 的时候。这样无论应用涉及几个事务资源都可以统一解决。

如何加载 Spring JAR

Spring 架的核心 JAR 包是 spring.jar ,但是根据实际使用情况需要一些扩展 JAR 包和依赖 JAR 包。那在 WAS 中如何处理这些 JAR 包文件呢?在 Web 应用中一个简单而直接的处理方式放是把这些使用到的 JAR 文件都拷贝到对应的 WEB-INF/lib 目录下面。这种方法虽然简单,但是当有多个 Spring 应用程序的时候这种处理方式就需要在每个应用的 WEB-INF/lib 目录下都拷贝一份相同的 JAR 文件。这里可以通过共享库的方式来统一解 决类库共享这个问题。

  共享库就是 WAS 专门用来解决不同应用程序之间共享 JAR 或本地库文件的一种机制。共享库由一个名字、一个 JAVA 类路径和 / 或一个装载 JNI 库本地库路径组成。它可以分别在单元,节点和服务器级别定义。但是共享库定义了并不意味着它会被装载,只有当这个共享 库与某个应用程序或应用服务器关联之后,它才会被加载。如果一个共享库与一个应用程序关联,那么这个共享库由应用程序类加载器加载。如果一个共享库与应用 服务器关联,那么这个共享库就需要一个专门定义的类加载器来加载。这个类加载器需要用户自己定义。其操作如下:选应用服务器比如 server1' 类加载器 ' 新建一个类加载器 ' 加载器与共享库关联。

  在创建这个类加载器之前一般都需要预先定义好共享库。 根据上面的介绍可知,通过共享库解决 Spring 应用的 JAR 包共享问题,主要就是两个步骤。一是,把 Spring 应用中需要共享的 JAR 包定义成为一个 共享库。二是,选定相应的 WAS 服务器实例,把它与上面创建的共享库关联起来。这样此 WAS 服务器实例上的所有应用都能够使用共享库中定义的 JAR 包。使 用共享库这种方式的时候要注意理解类的装载次序和方式。如果是这种与 WAS 服务器实例关联的共享库 JAR 包,其类加载器在层次结构上在应用程序类加载器上 面,即是它的父加载器。

如何在 WAS 部署基于 Spring WEB 应用

要在 WAS 部署基于 Spring Web 应用,必须严格按照以上的配置来进行,配置完毕之后,必须将 Web 应用依赖到的 Jar 包加载到 WAS 的服务器中,加载 Jar 包的方式有两种,一种是通过共享库的方式来加载,一种则是直接将 Web 应用所依赖的 jar 包拷贝到 C:\IBM\WebSphere6.1\AppServer\lib\ext 目录下,同时导出 WAR 文件。启动 WAS ,打开管理控制台,如下图:

左边菜单选择应用程序-》安装新的应用程序,在右边的工作区页面中选择导出的 WAR 文件,输入上下文根,如下图:

点下一步,采用默认设置,一直到步骤 3 将资源引用映射至资源时,需要输入 web 应用引用到的 WAS 的资源,如下图:

点下一步采用默认设置,最后点完成, WAS 开始加载 Web 应用,如果加载成功,在提示如下页面:

 

点保存后,通过左边菜单应用程序-》应用程序查看已安装的 Web 应用,发现是一个小红×,这表示尚未启动该 web 应用,如下图:

勾上该 Web 应用,启动它, WAS 最后提示启动成功,如下图:

查看后台日志,发现该 web 应用中 Spring ContextLoader 初始化 WebApplicationContext 成功,同时加载了 applicationContext.xml 配置的所有 bean 资源、 O/R 映射、数据源连接等,启动成功的日志片断如下:

看到日志无日常,则表示 web 启动成功,可以通过网页访问 web 应用,如下图:

MyEclipse5 下配置 WAS V6.1

MyEclipse 为我们提供了在超过 20 几种的不同应用服务器上无缝部署、执行、测试 MyEclipse J2EE 应用的便利,然而,在 MyEclipse 上正确配置 WebSphere 6.1 应用服务器需要比配置其他应用服务器花费更多的时间,本文档以图文并茂的方式一步一步教你配置一个基于 MyEclipse WebSphere 服务器实例,同时将你开发的 web 应用通过 MyEclipse 快速的部署到 WAS 中。

通过 MyEclipse 的应用服务器连接器参数配置,你在 MyEclipse 直接控制本地的 J2EE 服务器实例,因此,对于 WASV6.1 来说,你需要重新建一个基于 MyEclipse 的应用服务器实例,具体操作如下。

新建 WAS 服务器实例

第一步:打开概要管理工具,如下图:

 

概要文件管理工具启动后,点下一步,选择高级概要文件创建,如下图:

点下一步,采用默认设置直到系统提示输入概要文件名、概要文件目录,输入你喜欢的概要文件名、概要文件目录,构选使用开发模板创建服务器,如下图:

点下一步,输入你喜欢的节点名称,主机名一般不建议修改。如下图:

点下一步,输入你喜欢的管理控制台帐号、密码,如下图:

点下一步,修改 WAS 的端口值,一般默认即可,如下图:

采用建议的端口值之后,点下一步,记住哦,千万不要作为 window 服务运行,省得无谓耗用自己电脑资源,如下图:

点一下步,一般不需要创建 web 服务器创建,没那个必要嘛,如下图:

点下一步,最后点创建 WAS 服务器用例,等待成功中。

终于看到成功界面了,点完成即可。

修改 WAS 配置

该部分详细描述了如何配置一个 WAS 开发实例使之能在 MyEclipse 中运行、部署、监控日志等。

第一步:要想见到控制台,当然要先启动服务器。如下图:

第二步:打开管理控制台,用管理员帐号登录,如下图:

第三步:登录成功后,需要对 server1 进行配置。具体操作如下,左边菜单-》服务器-》应用服务器,如下图:

第四步:现在为了保证 WAS 的输入日志、错误提示能在 MyEclipse 中显示,则需要对 server1 进行修改配置。如下图:

点记录和跟踪-》 JVM 日志,如下图:

将应用程序服务器 > server1 > 记录和跟踪 > JVM 日志中的 System.out 以及 System.err 文件名修改为 console ,如下图:

点确定之后,保存即可,注销退出,停掉 WAS 服务器。

MyEclipse 中配置 WAS

在配置 MyEclipse 之前,你需要确定新建 WAS 服务器实例之后的节点名称、单元名称,可以查看 WAS 目录如下:

其中节点名为: gd12580 ,单元名称为 lidNode03Cell ,在 myeclipse 中需要正确配置对应的名称。具体配置如下:

第一步:启动 myeclipse ,在 MyEclipse 运行 WAS 需要配置 IBM JDK 。找到 Window > Preferences >Java>Installed JREs ,如下图:

add ,输入 JRE name 、指向本地 websphere java home ,确定即可,如下图:

第二步:找到 WebSphere 6.1 的连接器设置,在 Window > Preferences > MyEclipse > Application Servers > WebSphere 6.1 中,   Once you have navigated to the WebSphere 6.1 preference window, first be sure to Enable the application server, then fill in the WebSphere installation location.  Most of the remaining fields will be defaulted for you. All of the fields should be straight forward, the only two that might be a little tricky are the Node Name and Server Name fields that are shown below. The Node Name field is the value you used during the Profile creation wizard, in our example it was gd12580 and the Cell Name is the directory name you had to lookup in the step above. When you are done, click the JDK node under the WebSphere 6.1 node on the left. Here we will configure the IBM JDK that MyEclipse will use to launch WebSphere. 不翻译了,不懂的请拿金山词霸出来照吧,如下图:

配置成功之后的 was 服务器可以在 myeclipse 中看到,启动,出现一下信息,则恭喜你,成功咯!如下图:

MyEclipse 中部署 EAR/WAR

该部分主要描述在 MyEclipse 中部署 EAR WAR ,包括快速部署、热部署等,具体细节在此不一一描述,有兴趣的请参考 MyEclipse 的帮助。