Struts2+spring2+hibernate3整合方案

Posted on 2007-12-26 01:11 flustar 阅读(6550) 评论(28)  编辑  收藏 所属分类: SpringStruts2Hibernate

Struts2+spring2+hibernate3整合方案
最近闲来无事可做,于是开始学习struts2。Struts2和struts1、webwork2有什么区别我也不说了,网上有很多这方面的资料。以前在项目中从未使用过struts,一直使用spring+hibernate,现在既然学习了Struts,也不能浪费,于是乎开始琢磨着怎么整合这3个框架。整合原理以spring为容器,管理hibernate的DAO和Struts2的Action。
一、 准备工作
Struts2.06+spring2.5+hibernate3.2+jdk6.0+myeclipse6.0+tomcat5.5+mysql5.0
以上是整合的原料。下面以一个注册登陆的例子来开始我们的整合过程。
这个例子很简单,下面是它的sql脚本内容:
CREATE TABLE `user` (
  `userid` int(11) NOT NULL AUTO_INCREMENT,
  `username` varchar(20) NOT NULL,
  `password` varchar(16) NOT NULL,
  `email` varchar(30) NOT NULL,
  PRIMARY KEY (`userid`)
) ENGINE=InnoDB DEFAULT CHARSET=utf-8;
二、 开始行动
包结构可以参考下图
 
图一

 图二

图三
1) Struts部分:建立struts.xml和struts.properties
Struts.xml内容如下:

 

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE struts PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 2.0//EN" "http://struts.apache.org/dtds/struts-2.0.dtd" >
<struts>
    
<package name="user_curd" extends="struts-default" >
        
<global-results>
            
<!-- 下面定义的结果对所有的Action都有效 -->
            
<result name="exception">/error.jsp</result>
        
</global-results>

        
<global-exception-mappings>
            
<!-- 指Action抛出Exception异常时,转入名为exception的结果。 -->
            
<exception-mapping exception="java.lang.Exception" result="exception"/>
        
</global-exception-mappings>

        
<action name="Login" class="LoginAction">
            
<result name="success">/success.jsp</result>    
            
<result name="input">/login.jsp</result>
        
</action>
        
<action name="Regist" class="RegistAction">
            
<result name="success">/success.jsp</result>    
            
<result name="input">/regist.jsp</result>
        
</action>
    
</package> 
            
</struts>


Struts.properties内容如下:

 

struts.devMode=false
struts.enable.DynamicMethodInvocation
=true
struts.i18n.reload
=true
struts.ui.theme
=xhtml

struts.locale
=zh_CN
struts.i18n.encoding
=UTF-8
struts.objectFactory
=spring
struts.objectFactory.spring.autoWire
=name

struts.serve.static.browserCache
=false
struts.url.includeParams
=none


2) 建立User.java和User.hbm.xml、jdbc.properties:
User.java内容如下:

 

/** 
 * 
 * 
@author <a href="mailto:flustar2008@163.com">flustar</a>
 * 
@version 1.0 
 * Creation date: Dec 23, 2007 1:55:28 PM
 
*/

package com.firstssh.model;

import java.io.Serializable;

public class User implements Serializable {
    
private int id;
    
private String username;
    
private String password;
    
private String email;

    
public int getId() {
        
return id;
    }


    
public void setId(int id) {
        
this.id = id;
    }


    
public String getUsername() {
        
return username;
    }


    
public void setUsername(String username) {
        
this.username = username;
    }


    
public String getPassword() {
        
return password;
    }


    
public void setPassword(String password) {
        
this.password = password;
    }


    
public String getEmail() {
        
return email;
    }


    
public void setEmail(String email) {
        
this.email = email;
    }

}


User.hbm.xml内容:

 

<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC 
    "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
    "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd"
>
<hibernate-mapping 
    
package="com.firstssh.model">

    
<class name="User" table="User">
        
<id name="id" column="userid">
            
<generator class="identity" />
        
</id>    
        
<property name="username"
                  column
="username"
                  not-null
="true"
                  length
="20"
        
/>
        
<property name="password"
                  column
="password"
                  not-null
="true"
                  length
="16" />
        
<property name="email"
                  column
="email"
                  not-null
="true"
                  length
="30"/>
    
</class>
    
</hibernate-mapping>


jdbc.properties内容如下:

 

datasource.type=mysql
datasource.driverClassName
=com.mysql.jdbc.Driver
datasource.url
=jdbc:mysql://localhost:3306/test?useUnicode=true&characterEncoding=UTF-8

datasource.username
=root
datasource.password
=123456

datasource.maxActive
=10
datasource.maxIdle
=2
datasource.maxWait
=120000
datasource.whenExhaustedAction
=1
datasource.validationQuery
=select 1 from dual
datasource.testOnBorrow
=true
datasource.testOnReturn
=false

c3p0.acquireIncrement
=3
c3p0.initialPoolSize
=3
c3p0.idleConnectionTestPeriod
=900
c3p0.minPoolSize
=2
c3p0.maxPoolSize
=50
c3p0.maxStatements
=100
c3p0.numHelperThreads
=10
c3p0.maxIdleTime
=600

hibernate.dialect
=org.hibernate.dialect.MySQLInnoDBDialect
#hibernate.dialect
=org.hibernate.dialect.MySQLMyISAMDialect

hibernate.jdbc.batch_size
=25
hibernate.jdbc.fetch_size
=50
hibernate.show_sql
=true
hibernate.connection.release_mode
=after_transaction


3) Spirng部分:为了清晰把Spring的配置文件拆分成以下几部分applicationContext-dao.xml、appliationContext-service.xml、applicationContext-hibernate.xml、action-servlet.xml。
applicationContext-hibernate.xml内容:

 

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN 2.0//EN" "http://www.springframework.org/dtd/spring-beans-2.0.dtd">
<beans>
<bean id="propertyConfigurer"
    class
="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
    
<property name="locations">
        
<list>
            
<!--  <value>WEB-INF/mail.properties</value>-->
            
<value>WEB-INF/jdbc.properties</value>
            
<!--  <value>WEB-INF/oscache.properties</value>-->
        
</list>
    
</property>
</bean>
<!-- MailSender used by EmailAdvice -->
<!--
    <bean id="mailSender" class="org.springframework.mail.javamail.JavaMailSenderImpl">
    <property name="host" value="${mail.host}"/>
    </bean>
-->
<bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource"
    destroy-method
="close" dependency-check="none">
    
<property name="driverClass">
        
<value>${datasource.driverClassName}</value>
    
</property>
    
<property name="jdbcUrl">
        
<value>${datasource.url}</value>
    
</property>
    
<property name="user">
        
<value>${datasource.username}</value>
    
</property>
    
<property name="password">
        
<value>${datasource.password}</value>
    
</property>
    
<property name="acquireIncrement">
        
<value>${c3p0.acquireIncrement}</value>
    
</property>
    
<property name="initialPoolSize">
        
<value>${c3p0.initialPoolSize}</value>
    
</property>
    
<property name="minPoolSize">
        
<value>${c3p0.minPoolSize}</value>
    
</property>
    
<property name="maxPoolSize">
        
<value>${c3p0.maxPoolSize}</value>
    
</property>
    
<property name="maxIdleTime">
        
<value>${c3p0.maxIdleTime}</value>
    
</property>
    
<property name="idleConnectionTestPeriod">
        
<value>${c3p0.idleConnectionTestPeriod}</value>
    
</property>
    
<property name="maxStatements">
        
<value>${c3p0.maxStatements}</value>
    
</property>
    
<property name="numHelperThreads">
        
<value>${c3p0.numHelperThreads}</value>
    
</property>
</bean>
<bean id="sessionFactory"
    class
="org.springframework.orm.hibernate3.LocalSessionFactoryBean">
    
<property name="dataSource">
        
<ref local="dataSource" />
    
</property>
    
<property name="mappingResources">
        
<list>
            
<value>com/firstssh/model/User.hbm.xml</value>
        
</list>
    
</property>
    
<property name="hibernateProperties">
        
<props>
            
<prop key="hibernate.dialect">${hibernate.dialect}</prop>
            
<prop key="hibernate.show_sql">${hibernate.show_sql}</prop>
            
<prop key="hibernate.jdbc.fetch_size">
                ${hibernate.jdbc.fetch_size}
            
</prop>
            
<prop key="hibernate.jdbc.batch_size">
                ${hibernate.jdbc.batch_size}
            
</prop>
        
</props>
    
</property>
</bean>
<!-- 配置事务管理器bean,使用HibernateTransactionManager事务管理器 -->
<bean id="transactionManager"
    class
="org.springframework.orm.hibernate3.HibernateTransactionManager">
        
<!-- 为事务管理器注入sessionFactory" -->
        
<property name="sessionFactory" ref="sessionFactory"/>
</bean>
<!-- 配置事务拦截器Bean -->
<bean id="transactionInterceptor"
    class
="org.springframework.transaction.interceptor.TransactionInterceptor">
    
<!-- 为事务拦截器bean注入一个事物管理器 -->
    
<property name="transactionManager" ref="transactionManager"></property>
    
<property name="transactionAttributes">
    
<!-- 定义事务传播属性 -->
        
<props>
                
<prop key="insert*">PROPAGATION_REQUIRED</prop>
                
<prop key="update*">PROPAGATION_REQUIRED</prop>
                
<prop key="save*">PROPAGATION_REQUIRED</prop>
                
<prop key="add*">PROPAGATION_REQUIRED</prop>
                
<prop key="remove*">PROPAGATION_REQUIRED</prop>
                
<prop key="delete*">PROPAGATION_REQUIRED</prop>
                
<prop key="get*">PROPAGATION_REQUIRED,readOnly</prop>
                
<prop key="find*">PROPAGATION_REQUIRED,readOnly</prop>
                
<prop key="load*">PROPAGATION_REQUIRED,readOnly</prop>
                
<prop key="change*">PROPAGATION_REQUIRED</prop>
                
<prop key="*">PROPAGATION_REQUIRED,readOnly</prop>
        
</props>
    
</property>
</bean>
<!-- 定义BeanNameAutoProxyCreator -->
<bean class="org.springframework.aop.framework.autoproxy.BeanNameAutoProxyCreator">
    
<!-- 指定满足哪些bean自动生成业务代理 -->
    
<property name="beanNames">
    
<!-- 需要自动创建事务代理的bean -->
        
<list>
            
<value>userService</value>
        
</list>
        
<!-- 其它需要自动创建事务代理的bean -->
    
</property>
    
<property name="interceptorNames">
        
<list>
            
<value>transactionInterceptor</value>
            
<!-- 可增加其它的interceptor -->
        
</list>
    
</property>
</bean>
</beans>


applicationContext-dao.xml内容:

 

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN 2.0//EN" "http://www.springframework.org/dtd/spring-beans-2.0.dtd">
<beans>
<!-- 根DAO -->
<bean id="genericDao" class="com.firstssh.common.dao.GenericDao">
    
<property name="sessionFactory">
        
<ref bean="sessionFactory" />
    
</property>
</bean>
<bean id="userDao" class="com.firstssh.dao.impl.UserDao" parent="genericDao" />
</beans>


applicationContext-service.xml内容:

 

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN 2.0//EN" "http://www.springframework.org/dtd/spring-beans-2.0.dtd">
<beans>
<bean id="userService" class="com.firstssh.service.impl.UserService">
    
<property name="userDao">
        
<ref bean="userDao"/>
    
</property>
</bean>
<bean id="validateName" class="com.firstssh.common.Bean.ValidateName">
    
<property name="userService">
        
<ref local="userService"/>
    
</property>
</bean>
</beans>


action-servlet.xml内容:

 

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN 2.0//EN" "http://www.springframework.org/dtd/spring-beans-2.0.dtd">
<beans>

    
<bean id="LoginAction" class="com.firstssh.action.LoginAction"
        scope
="prototype">
        
<property name="userService" ref="userService" />
    
</bean>
    
<bean id="RegistAction" class="com.firstssh.action.RegistAction"
        scope
="prototype">
        
<property name="userService" ref="userService" />
    
</bean>
</beans>


以上几个xml文件的内容暂且不要理会,继续往下看,你就自动明白的,不用我解释。
4)日志部分:log4j.properties 、commons-logging.properties
log4j.properties内容:

 

# For JBoss: Avoid to setup Log4J outside $JBOSS_HOME/server/default/deploy/log4j.xml!
# For all other servers: Comment out the Log4J listener in web.xml to activate Log4J.
log4j.rootLogger
=INFO, stdout, logfile

log4j.appender.stdout
=org.apache.log4j.ConsoleAppender
log4j.appender.stdout.layout
=org.apache.log4j.PatternLayout
log4j.appender.stdout.layout.ConversionPattern
=%d %p [%c] - %m%n

log4j.appender.logfile
=org.apache.log4j.RollingFileAppender
log4j.appender.logfile.File
=${firstssh.root}/WEB-INF/logs/firstssh.log
log4j.appender.logfile.MaxFileSize
=512KB
# Keep three backup files.
log4j.appender.logfile.MaxBackupIndex
=3
# Pattern to output: date priority 
[category] - message
log4j.appender.logfile.layout
=org.apache.log4j.PatternLayout
log4j.appender.logfile.layout.ConversionPattern
=%d %p [%c] - %m%n
# OpenSymphony Stuff
log4j.logger.com.opensymphony
=INFO
log4j.logger.org.apache.struts2
=INFO
# Spring Stuff
log4j.logger.org.springframework
=INFO
# Hibernate Stuff
log4j.logger.org.hiberante
=INFO

commons-logging.properties
内容:

org.apache.commons.logging.Log=org.apache.commons.logging.impl.Log4JLogger


5)web.xml

 

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://java.sun.com/xml/ns/j2ee" 
 xmlns:xsi
="http://www.w3.org/2001/XMLSchema-instance" 
 xsi:schemaLocation
="http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd" 
 version
="2.4">
 
<display-name>firstssh</display-name>
 
<description>this is a simple example</description>
 
<context-param>
  
<param-name>webAppRootKey</param-name>
  
<param-value>firstssh.root</param-value>
 
</context-param>
 
 
<context-param>
  
<param-name>contextConfigLocation</param-name>
  
<param-value>/WEB-INF/applicationContext-*.xml,/WEB-INF/action-servlet.xml</param-value>
 
</context-param>
 
<context-param>
  
<param-name>log4jConfigLocation</param-name>
  
<param-value>/WEB-INF/log4j.properties</param-value>
 
</context-param>
 
<listener>
  
<listener-class>org.springframework.web.util.Log4jConfigListener</listener-class>
 
</listener>
 
<!-- 用于初始化Spring容器的Listener -->
    
<listener>
        
<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
    
</listener>
 
 
 
<!-- 定义整合SiteMesh必须的ActionContextCleanUp Filter 
 <filter>
  <filter-name>struts-cleanup</filter-name>
  <filter-class>org.apache.struts2.dispatcher.ActionContextCleanUp</filter-class>
 </filter>
-->
 
<!-- 定义Struts2的FilterDispathcer的Filter -->