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
的帮助。