首先jar的准备,struts-http://struts.apache.org/download.cgi Hibernate-http://www.hibernate.org/downloads spring-http://www.springsource.org/download/community
在这里说明一下,并不是3个框架的所有jar都需要,我们有选择性的加入jar,全部加进去又可能还会出事。
struts:
hibernate:
spring:
另外要再加入一个:aspectjweaver.jar
数据库驱动包:这里用的是mysql数据库,所以使用mysql-connector-java-5.1.25-bin.jar
好吧,开始了。我们将以一个简单的查询用户实例来进行整合。
说一下我的开发环境:myeclipse2013 jdk1.7.0_25 Tomcat7.0.41
先把数据库表给创了,表结构很简单就三个字段 uid,uname,upass
之后随便往表里添点东西,方便我们等一下测试
新建一个web项目,个人喜欢的顺序是IOC、ORM、WEB。加入spring所需的jar,在src目录下新建spring的配置文件,文件名可以随意。个人习惯是bean.xml
在文件里面新建bean节点,来管理dataSource
<bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource">
<property name="user" value="root"></property>
<property name="password" value="root"></property>
<property name="driverClass" value="com.mysql.jdbc.Driver"></property>
<property name="jdbcUrl" value="jdbc:mysql://localhost:3306/Test"></property>
</bean>
再新建一个bean节点,来管理Hibernate的SessionFactory
<bean id="sessionFactory" class="org.springframework.orm.hibernate4.LocalSessionFactoryBean">
<property name="dataSource" ref="dataSource"></property>
<property name="hibernateProperties">
<props>
<prop key="dialect">org.hibernate.dialect.MySQL5InnoDBDialect</prop>
<prop key="hbm2ddl.auto">update</prop>
<prop key="show_sql">true</prop>
<prop key="hibernate.temp.use_jdbc_metadata_defaults">false</prop>
</props>
</property>
<property name="mappingResources">
<list>
<value>org/ssh/bean/User.hbm.xml</value>
</list>
</property>
</bean>
好了,spring的ORM配置先到这里,我们进行hibernate的配置
先把hibernate所需的jar加入到WEN-INF/lib里边,新建一个类用来映射数据库表,
这里我取的名字是User对应数据库表user
字段很简单,就三个uid,uname,upass。上码
package org.ssh.bean;
import java.io.Serializable;
public class User implements Serializable{
private static final long serialVersionUID = -9110769530375974595L;
private Integer uid;
private String uname;
private String upass;
public Integer getUid() {
return uid;
}
public void setUid(Integer uid) {
this.uid = uid;
}
public String getUname() {
return uname;
}
public void setUname(String uname) {
this.uname = uname;
}
public String getUpass() {
return upass;
}
public void setUpass(String upass) {
this.upass = upass;
}
}
类实现Serializable接口,除了serialVersionUID之外为每一个字段设置getter和setter。
接下来编写User的映射文件 User.hbm.xml跟User类在同一个包下面,DOCTYPE可以在hibernate-core
-4.2.2.Final.jar/org.hibernate/hibernate-mapping-3.0.dtd找到,上码
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-mapping PUBLIC
"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">
<hibernate-mapping schema="Test" package="org.ssh.bean">
<class name="User">
<id column="uid" name="uid" type="java.lang.Integer">
<generator class="identity"></generator>
</id>
<property name="uname" column="uname" type="java.lang.String"></property>
<property name="upass" column="upass" type="java.lang.String"></property>
</class>
</hibernate-mapping>
表映射完毕,我们来做一下测试。测试之前请确保你程序已经加入了commons-logging-1.1.3.jar hibernate和spring都没有提供这一个jar,但是这个日志jar是必须的。
随意新建一个测试类,上码
package org.ssh.test;
import org.hibernate.HibernateException;
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.springframework.beans.BeansException;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import org.ssh.bean.User;
public class Test {
/**
* @param args
*/
public static void main(String[] args) {
ApplicationContext context=new ClassPathXmlApplicationContext("bean.xml");
SessionFactory factory = null;
Session session=null;
try {
factory = (SessionFactory)context.getBean("sessionFactory");
session=factory.openSession();
org.ssh.bean.User user=(User) session.get(User.class, 1);
System.out.println(user);
} catch (BeansException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (HibernateException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}finally{
if(session!=null)session.close();
if(factory!=null)factory.close();
}
}
}
如果能够正常的输出用户名的话,那么spring与hibernate整合算好了一半,接下来我们还要增加事务管理
在增加事务管理之前,我们先把Dao层写好。新建UserDao类,在里面把SessionFactory和Session都封装了一把。上码
package org.ssh.dao;
import java.util.List;
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.ssh.bean.User;
public class UserDao {
private SessionFactory factory;
public SessionFactory getFactory() {
return factory;
}
public void setFactory(SessionFactory factory) {
this.factory = factory;
}
public Session openSession(){
return factory.getCurrentSession();
}
/**
* 获取全部用户
* */
public List<User> getListUser(){
List<User> list=null;
list=openSession().createQuery("from User").list();
return list;
}
}
接下来打开spring配置文件,新建bean节点,让spring管理事务
<bean id="transactionManager" class="org.springframework.orm.hibernate4.HibernateTransactionManager">
<property name="sessionFactory" ref="sessionFactory"></property>
</bean>
新建事务通知节点,配置隔离级别,传播行为,通知哪一些方法需要事务管理
<tx:advice transaction-manager="transactionManager" id="tm">
<tx:attributes>
<tx:method name="get*" propagation="REQUIRED"/>
</tx:attributes>
</tx:advice>
再新建切入点,写一个表达式,告诉程序哪一些类的哪一些方法将需要事务管理
新建织入者,引用上面的事务管理,引用上面的切入点。到这里声明式事务配置完毕
<aop:config>
<aop:pointcut expression="execution(* org.ssh.dao.*.*(..))" id="tp"/>
<aop:advisor advice-ref="tm" id="ta" pointcut-ref="tp"/>
</aop:config>
现在再来测试一把。在测试之前,请确保你的程序已经加了aop所需要的jar。上面提到的struts里面的aopalliance-1.0.jar和aspectjweaver-1.5.0.jar都是必须加进去的
package org.ssh.test;
import java.util.List;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import org.ssh.bean.User;
import org.ssh.dao.UserDao;
public class Test {
/**
* @param args
*/
public static void main(String[] args) {
ApplicationContext context=new ClassPathXmlApplicationContext("bean.xml");
UserDao dao = (UserDao)context.getBean("userDao");
List<User> list=dao.getListUser();
for (User user : list) {
System.out.println(user.getUname());
}
}
}
到了这一步如果能正常输出所有用户的用户名,那么spring与hibernate的整合基本完成。
这里说明一下,spring配置文件的根节点beans的几个属性是必须有的,没有这些属性的话,程序有可能会出事。
贴一下beans节点的配置,里面包含了基本的bean节点。还有aop节点,tx节点
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:aop="http://www.springframework.org/schema/aop"
xmlns:tx="http://www.springframework.org/schema/tx"
xsi:schemaLocation="
http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/aop
http://www.springframework.org/schema/aop/spring-aop-3.2.xsd
http://www.springframework.org/schema/tx
http://www.springframework.org/schema/tx/spring-tx-3.2.xsd">
</beans>
接下来我们把struts给整进去,struts与spring整合需要注意的细节相比之下就不是那么多了。
先把struts所需的jar扔进你的程序。我们项目为了跟企业级项目靠近一点,需再增加业务类,取名:UserBiz,上码
package org.ssh.biz;
import java.util.List;
import org.ssh.bean.User;
import org.ssh.dao.UserDao;
public class UserBiz {
private UserDao userDao;
public UserDao getUserDao() {
return userDao;
}
public void setUserDao(UserDao userDao) {
this.userDao = userDao;
}
public List<User> getListUser(){
return userDao.getListUser();
}
}
之后需要在bean.xml文件增加对该类的管理,老样子,新建一个bean节点
<bean id="userBiz" class="org.ssh.biz.UserBiz">
<property name="userDao" ref="userDao"></property>
</bean>
新建web层的Action类,取名 UserAction,上码
package org.ssh.web.action;
import java.util.ArrayList;
import java.util.List;
import org.ssh.bean.User;
import org.ssh.biz.UserBiz;
import com.opensymphony.xwork2.ActionSupport;
public class UserAction extends ActionSupport{
private static final long serialVersionUID = -3724476188656181250L;
private UserBiz userBiz;
private List<User> list=new ArrayList<User>();
public List<User> getList() {
return list;
}
public void setList(List<User> list) {
this.list = list;
}
public UserBiz getUserBiz() {
return userBiz;
}
public void setUserBiz(UserBiz userBiz) {
this.userBiz = userBiz;
}
@Override
public String execute() throws Exception {
list=userBiz.getListUser();
return SUCCESS;
}
}
之后需要在bean.xml文件增加对该类的管理,老样子,新建一个bean节点
<bean id="userAction" class="org.ssh.web.action.UserAction">
<property name="userBiz" ref="userBiz"></property>
</bean>
再来,src目录下新建struts.xml文件
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE struts PUBLIC
"-//Apache Software Foundation//DTD Struts Configuration 2.3//EN"
"http://struts.apache.org/dtds/struts-2.3.dtd">
<struts>
<package name="web" extends="struts-default">
<action name="user" class="userAction">
<result>index.jsp</result>
</action>
</package>
</struts>
请仔细观察上面struts的配置文件,里面action的实现类,不再是一个类的完整路径了。而是spring里面为这个Action提供的id
接下来,配置web.xml文件,代开WEN-ING/web.xml文件。增加struts的全局filter,和spring的listener
<filter>
<filter-name>struts</filter-name>
<filter-class>org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>struts</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:bean.xml</param-value>
</context-param>
<listener>
<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>
接下来,在你返回的view,我这里是webroot下面的index.jsp.把你拿到的东西在页面打印出来。这里我用到了struts标签
用struts标签之前,别忘了先加入struts标签的taglib
<%@ taglib prefix="s" uri="/struts-tags" %>
<s:iterator value="list">
<s:property value="uname"/>
</s:iterator>
OK,最后一步了,把你项目部署到Tomcat上面,启动他,如果启动过程有关于这个项目的错误的话,多半是跑不起来的。
确认无误后,访问 http://localhost:8080/项目名/Action的name
如果能正确输出所有用户的用户名,那么恭喜你,整合成功了。
第一次写技术博客,感觉写得还是有点凌乱。有什么不足或者看了之后有什么问题,欢迎拍砖。
项目和所需要的jar,都上传到csdn资源了。