Struts 2.0 + Hibernate 3.2 + Spring 2.0 框架整合                                       
                                               ------学习笔记
1.软件环境:
Windows XP、MySQL 5.0、Tomcat 6.0、JDK 1.62.jar包的导入:
首先:加入Hibernate 3.2的支持;
其次:加入Spring 2.0的支持;
最后:加入Struts 2.0的支持(一般只需要导入5个jar文件)。3.创建struts.xml配置文件
文件头:
<!DOCTYPE struts PUBLIC
"-//Apache Software Foundation//DTD Struts Configuration 2.0//EN"
"http://struts.apache.org/dtds/struts-2.0.dtd">
主要用于定义action4.完善web.xml配置文件
首先:配置Struts2的一些映射,即过滤器。相关类:
<filter-class>
   org.apache.struts2.dispatcher.FilterDispatcher
</filter-class>其次:配置Spring监听器。相关类:<listener-class>
   org.springframework.web.context.ContextLoaderListener
</listener-class>因为 web-app version="2.5"(servlet版本),所以在整合Spring的时候我们可以在这里使用监听器,如果低于此版本,我们必须配置相应的过滤器。二者的代码在本质上是一样的,但是机制却是不一样的。监听器是在web应用启动的时候就自动启动了,而过滤器是在有访问的时候才启动。5.客户端(JSP页面)
需要导入Struts2的标签库:<%@ taglib prefix="s" uri="/struts-tags"%>关于国际化
7.定义服务器端的对象------com.test.bean
用于存放用户的java bean,与数据库对应,即表对应类、字段对应元素。
定义一个对象后,在同一包内生成它与数据库的映射文件,即 *.hbm.xml
例如:有User这样一个bean,它的映射文件为User.hbm.xml创建action------com.test.action.*
因为一个项目中action较多,所以我们需要将action分类,这里"*"表示action的一个类别。例如:com.test.action.user表示与用户操作相关的action
所有Action都要继承 extends ActionSupport
例如:有SaveUserAction这样一个action
首先:映射客户端里的属性,例如:name="user.firstname"(客户端) 对应private User user(服务器端);其次:定义相应的execute()方法。该方法执行相应的操作,即响应来自客户端的请求。
但是这里不能直接去完成操作,它必须要调用业务逻辑层的service,而业务逻辑层又要先去访问DAO,最后是DAO去访问数据库。
所以在action、service中并不直接对数据库进行操作。Action代码要去访问Service层的代码,因此需要Service层向对应的一个实例。这里采用了Spring的依赖注入,在配置文件中将其注入。
例如:我们可以这样声明一个成员变量private UserService service;既然要注入就要生成其相应的set()方法。例如:当action接受到增加用户这一客户端的请求时,它通过此方法实现操作。
public String execute() throws Exception
{
this.service.save(user);
return SUCCESS;
}
创建dao的接口包------com.test.dao
声明用户的一些相关操作。
例如:有UserDAO这样一个接口。
例如:接口中有增加用户这一方法。
public void saveUser(User user);10.创建dao的实现类的包------com.test.dao.impl
声明接口的实现类。
例如:有UserDAOImpl这样一个实现类。
要实现Spring对Hibernate的支持,即使用getHibernateTemplate()这一方法,在这里需要继承:extends HibernateDaoSupport这个类。
例如:增加用户这一个方法的实现。
public void saveUser(User user)
{
this.getHibernateTemplate().save(user);
}11.创建服务层的接口包------com.test.service
服务层即业务逻辑层。声明业务逻辑层所提供的业务逻辑,即服务层所提供的服务。
例如:有UserService这样一个接口。
例如:接口中有增加用户这一业务逻辑。
public void save(User user);12.创建服务层接口的实现类的包------com.test.service.impl
用于定义接口的实现,即这些业务逻辑的实现。
服务层的代码要去访问DAO层的代码,因此需要DAO层向对应的一个实例。这里采用了Spring的依赖注入,在配置文件中将其注入。
例如:我们可以这样声明一个成员变量private UserDAO userDao;既然要注入就要生成其相应的set()方法。
例如:有UserServiceImpl这样一个业务逻辑实现类。
例如:有增加用户这一业务逻辑的实现。
public void save(User user) 
{
this.userDao.saveUser(user);
}Spring容器的配置
依赖注入的流程,即Spring容器bean配置的一个顺序。
声明数据库连接池→通过连接池获得一个连接→将连接池里的数据源(dataSource)注入到Spring容器中的SessionFactoryBean中→连接被DAO使用→DAO注入到Service中→再把Serviec注入到Action中配置步骤:
A.配置数据源,这里用到的是apache的dbcp连接池。
<bean id="dataSource"  class="org.apache.commons.dbcp.BasicDataSource">
   <property name="driverClassName" value="com.mysql.jdbc.Driver"></property>
   <property name="url" value="jdbc:mysql://localhost:3306/test"></property>
   <property name="username" value="root"></property>
   <property name="password" value="******"></property>
   <property name="maxActive" value="100"></property>
   <property name="maxIdle" value="30"></property>
   <property name="maxWait" value="500"></property>
   <property name="defaultAutoCommit" value="true"></property>
</bean>B.配置sessionFactory<bean id="sessionFactory" class="org.springframework.orm.hibernate3.LocalSessionFactoryBean">
<property name="dataSource" ref="dataSource"></property>
<property name="hibernateProperties">
<props>
<prop key="hibernate.dialect">
    org.hibernate.dialect.MySQLDialect
</prop>
<prop key="hibernate.sql">true</prop>
</props>
</property>
<property name="mappingResources">
<list>
<value>com/test/bean/User.hbm.xml</value>
</list>
</property>
</bean>C.配置userDao
<bean id="userDao" class="com.test.dao.impl.UserDAOImpl" scope="singleton">
    <property name="sessionFactory"><ref bean="sessionFactory"/></property>
</bean>
没有状态的Bean应该配置成单例的,即singleton,在Spring2.0下本身就默认是单例的,但是在Spring1.2中就不是单例的,必须声明singleton="true"。D.配置userSrevice
<bean id="userService" class="com.test.service.impl.UserServiceImpl">
<property name="userDao" ref="userDao"></property>
</bean>E.配置saveUserAction
<bean id="saveUserAction" class="com.test.action.user.SaveUserAction">
<property name="service" ref="userService"></property>
</bean>