張生工作室

          一切皆有可能

            BlogJava :: 首頁(yè) :: 新隨筆 :: 聯(lián)系 :: 聚合  :: 管理 ::
            24 隨筆 :: 3 文章 :: 11 評(píng)論 :: 0 Trackbacks

          Struts2+spring2+hibernate3整合方案
          最近閑來(lái)無(wú)事可做,于是開(kāi)始學(xué)習(xí)struts2。Struts2和struts1、webwork2有什么區(qū)別我也不說(shuō)了,網(wǎng)上有很多這方面的資料。以前在項(xiàng)目中從未使用過(guò)struts,一直使用spring+hibernate,現(xiàn)在既然學(xué)習(xí)了Struts,也不能浪費(fèi),于是乎開(kāi)始琢磨著怎么整合這3個(gè)框架。整合原理以spring為容器,管理hibernate的DAO和Struts2的Action。
          一、 準(zhǔn)備工作
          Struts2.06+spring2.5+hibernate3.2+jdk6.0+myeclipse6.0+tomcat5.5+mysql5.0
          以上是整合的原料。下面以一個(gè)注冊(cè)登陸的例子來(lái)開(kāi)始我們的整合過(guò)程。
          這個(gè)例子很簡(jiǎn)單,下面是它的sql腳本內(nèi)容:
          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;
          二、 開(kāi)始行動(dòng)
          包結(jié)構(gòu)可以參考下圖
           
          圖一

           圖二

          圖三
          1) Struts部分:建立struts.xml和struts.properties
          Struts.xml內(nèi)容如下:

          <?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>
                      
          <!-- 下面定義的結(jié)果對(duì)所有的Action都有效 -->
                      
          <result name="exception">/error.jsp</result>
                  
          </global-results>

                  
          <global-exception-mappings>
                      
          <!-- 指Action拋出Exception異常時(shí),轉(zhuǎn)入名為exception的結(jié)果。 -->
                      
          <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內(nèi)容如下:

          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內(nèi)容如下:

          /** 
           * 
           * 
          @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內(nèi)容:

          <?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內(nèi)容如下:

          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內(nèi)容:

          <?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>
          <!-- 配置事務(wù)管理器bean,使用HibernateTransactionManager事務(wù)管理器 -->
          <bean id="transactionManager"
              class
          ="org.springframework.orm.hibernate3.HibernateTransactionManager">
                  
          <!-- 為事務(wù)管理器注入sessionFactory" -->
                  
          <property name="sessionFactory" ref="sessionFactory"/>
          </bean>
          <!-- 配置事務(wù)攔截器Bean -->
          <bean id="transactionInterceptor"
              class
          ="org.springframework.transaction.interceptor.TransactionInterceptor">
              
          <!-- 為事務(wù)攔截器bean注入一個(gè)事物管理器 -->
              
          <property name="transactionManager" ref="transactionManager"></property>
              
          <property name="transactionAttributes">
              
          <!-- 定義事務(wù)傳播屬性 -->
                  
          <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自動(dòng)生成業(yè)務(wù)代理 -->
              
          <property name="beanNames">
              
          <!-- 需要自動(dòng)創(chuàng)建事務(wù)代理的bean -->
                  
          <list>
                      
          <value>userService</value>
                  
          </list>
                  
          <!-- 其它需要自動(dòng)創(chuàng)建事務(wù)代理的bean -->
              
          </property>
              
          <property name="interceptorNames">
                  
          <list>
                      
          <value>transactionInterceptor</value>
                      
          <!-- 可增加其它的interceptor -->
                  
          </list>
              
          </property>
          </bean>
          </beans>


          applicationContext-dao.xml內(nèi)容:

          <?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內(nèi)容:

          <?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內(nèi)容:

          <?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>


          以上幾個(gè)xml文件的內(nèi)容暫且不要理會(huì),繼續(xù)往下看,你就自動(dòng)明白的,不用我解釋。
          4)日志部分:log4j.properties 、commons-logging.properties
          log4j.properties內(nèi)容:

          # 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
          內(nèi)容:

          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 -->
              
          <filter>
                  
          <filter-name>struts2</filter-name>
                  
          <filter-class>org.apache.struts2.dispatcher.FilterDispatcher</filter-class>
              
          </filter>

             
          <!--   <filter-mapping>
                  <filter-name>struts-cleanup</filter-name>
                  <url-pattern>/*</url-pattern>
              </filter-mapping>
          -->
           
          <!-- FilterDispatcher用來(lái)初始化struts2并且處理所有的WEB請(qǐng)求。 -->
              
          <filter-mapping>
                  
          <filter-name>struts2</filter-name>
                  
          <url-pattern>/*</url-pattern>
              
          </filter-mapping>
              
             
          <!-- 這是一個(gè)產(chǎn)生驗(yàn)證碼的servlet -->
              
          <servlet>
                  
          <servlet-name>img</servlet-name>
                  
          <servlet-class>com.firstssh.servlet.AuthImg</servlet-class>
              
          </servlet>
            
              
          <servlet-mapping>
                  
          <servlet-name>img</servlet-name>
               
          <url-pattern>/authImg</url-pattern>
              
          </servlet-mapping>
              
          <filter>   
                  
          <filter-name>encodingFilter</filter-name>   
                  
          <filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>   
                  
          <init-param>   
                      
          <param-name>encoding</param-name>   
                      
          <param-value>utf-8</param-value>   
                  
          </init-param>   
              
          </filter>   
              
          <filter-mapping>   
                  
          <filter-name>encodingFilter</filter-name>   
                  
          <url-pattern>*.action</url-pattern>   
              
          </filter-mapping>   
              
          <filter-mapping>   
                  
          <filter-name>encodingFilter</filter-name>   
                  
          <url-pattern>*.jsp</url-pattern>   
              
          </filter-mapping>
              
          <filter>   
                  
          <filter-name>hibernateFilter</filter-name>   
                  
          <filter-class>org.springframework.orm.hibernate3.support.OpenSessionInViewFilter</filter-class>   
              
          </filter> 
              
          <filter-mapping>   
                  
          <filter-name>hibernateFilter</filter-name>   
                  
          <url-pattern>*.action</url-pattern>   
              
          </filter-mapping> 
              
              
          <!-- DWR Servlet-->
            
          <servlet>
              
          <servlet-name>dwr-invoker</servlet-name>
              
          <servlet-class>org.directwebremoting.servlet.DwrServlet</servlet-class>
              
          <init-param>
                
          <param-name>debug</param-name>
                
          <param-value>true</param-value>
              
          </init-param>
            
          </servlet>

            
          <servlet-mapping>
              
          <servlet-name>dwr-invoker</servlet-name>
              
          <url-pattern>/dwr/*</url-pattern>
            
          </servlet-mapping>
            
              
          <session-config>   
                  
          <session-timeout>10</session-timeout>   
              
          </session-config> 
              
            
          <welcome-file-list>
              
          <welcome-file>index.jsp</welcome-file>
            
          </welcome-file-list>
            
          <error-page>
              
          <error-code>401</error-code>
              
          <location>/401.htm</location>
            
          </error-page>
            
          <error-page>
              
          <error-code>403</error-code>
              
          <location>/403.htm</location>
            
          </error-page>
            
          <error-page>
              
          <error-code>404</error-code>
              
          <location>/404.htm</location>
            
          </error-page>
            
          <error-page>
              
          <error-code>500</error-code>
              
          <location>/500.htm</location>
            
          </error-page>
          </web-app>


           

          6)dwr.xml

          <?xml version="1.0" encoding="UTF-8"?>
          <!DOCTYPE dwr PUBLIC "-//GetAhead Limited//DTD Direct Web Remoting 2.0//EN" "http://getahead.org/dwr/dwr20.dtd">

          <dwr>
              
          <!-- 檢查用戶(hù)名是否存在 ValidateName的映射文件-->
              
          <allow>
                
          <create  creator="spring" javascript="ValidateName" >
                    
          <param name="beanName" value="validateName"/>
                    
          <include method="valid"/>
                
          </create>
               
          </allow>
          </dwr>



          三、 開(kāi)始編碼:
          以下是DAO部分的核心代碼:
          IGenericDao.java內(nèi)容如下:

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

          package com.firstssh.common.dao;

          import java.io.Serializable;
          import java.util.Collection;
          import java.util.List;

          import org.hibernate.LockMode;
          import org.hibernate.criterion.DetachedCriteria;
          import org.springframework.dao.DataAccessException;
          import com.firstssh.common.util.PaginationSupport;

          public interface IGenericDao<T, ID extends Serializable> {
              
          public T load(ID id) throws DataAccessException;

              
          public T get(ID id)throws DataAccessException;

              
          public boolean contains(T t) throws DataAccessException;

              
          public void refresh(T t, LockMode lockMode) throws DataAccessException;

              
          public void refresh(T t) throws DataAccessException;

              
          public Serializable save(T t) throws DataAccessException;

              
          public void saveOrUpdate(T t) throws DataAccessException;

              
          public void saveOrUpdateAll(Collection<T> entities)
                      
          throws DataAccessException;

              
          public void update(T t, LockMode lockMode) throws DataAccessException;

              
          public void update(T t) throws DataAccessException;

              
          public void delete(T t, LockMode lockMode) throws DataAccessException;

              
          public void delete(T t) throws DataAccessException;

              
          public void deleteAll(Collection<T> entities) throws DataAccessException;

              
          public List<T> find(String queryString, Object value)
                      
          throws DataAccessException;

              
          public List<T> find(String queryString, Object[] values)
                      
          throws DataAccessException;

              
          public List<T> find(String queryString) throws DataAccessException;

              
          public List<T> list()throws DataAccessException;
              
              
          public List<T> findByNamedQuery(String queryName)throws DataAccessException ;
              
                  
          public List<T> findByNamedQuery(String queryName, Object value)throws DataAccessException ;
              
                  
          public List<T> findByNamedQuery(String queryName, Object[] values)throws DataAccessException ;
              

              
          public PaginationSupport findPageByCriteria(
                      
          final DetachedCriteria detachedCriteria, final int pageSize,
                      
          final int startIndex);

              
          public PaginationSupport findPageByQuery(final String hsql,
                      
          final int pageSize, final int startIndex);

          }


          GenericDao.java內(nèi)容如下:

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

          package com.firstssh.common.dao;

          import java.io.Serializable;
          import java.lang.reflect.ParameterizedType;
          import java.sql.SQLException;
          import java.util.Collection;
          import java.util.List;

          import org.apache.commons.logging.Log;
          import org.apache.commons.logging.LogFactory;
          import org.hibernate.Criteria;
          import org.hibernate.HibernateException;
          import org.hibernate.LockMode;
          import org.hibernate.Query;
          import org.hibernate.Session;
          import org.hibernate.criterion.DetachedCriteria;
          import org.hibernate.criterion.Projections;
          import org.springframework.dao.DataAccessException;
          import org.springframework.orm.hibernate3.HibernateCallback;
          import org.springframework.orm.hibernate3.support.HibernateDaoSupport;
          import com.firstssh.common.util.PaginationSupport;

          @SuppressWarnings(
          "unchecked")
          public class GenericDao<T, ID extends Serializable> extends HibernateDaoSupport
                  
          implements IGenericDao<T, ID> {
              
          private Log logger = LogFactory.getLog(getClass());

              
          protected Class<T> entityClass;

              
          public GenericDao() {

              }


              
          protected Class getEntityClass() {
                  
          if (entityClass == null{
                      entityClass 
          = (Class<T>) ((ParameterizedType) getClass()
                              .getGenericSuperclass()).getActualTypeArguments()[
          0];
                      logger.debug(
          "T class = " + entityClass.getName());
                  }

                  
          return entityClass;
              }


              
          public void saveOrUpdate(T t) throws DataAccessException {
                  
          this.getHibernateTemplate().saveOrUpdate(t);
              }


              
          public T load(ID id) throws DataAccessException {
                  T load 
          = (T) getHibernateTemplate().load(getEntityClass(), id);
                  
          return load;
              }


              
          public T get(ID id) throws DataAccessException {
                  T load 
          = (T) getHibernateTemplate().get(getEntityClass(), id);
                  
          return load;
              }


              
          public boolean contains(T t) throws DataAccessException {
                  
          return getHibernateTemplate().contains(t);
              }


              
          public void delete(T t, LockMode lockMode) throws DataAccessException {
                  getHibernateTemplate().delete(t, lockMode);
              }


              
          public void delete(T t) throws DataAccessException {
                  getHibernateTemplate().delete(t);
              }


              
          public void deleteAll(Collection<T> entities) throws DataAccessException {
                  getHibernateTemplate().deleteAll(entities);
              }


              
          public List<T> find(String queryString, Object value)
                      
          throws DataAccessException {
                  List
          <T> find = (List<T>) getHibernateTemplate()
                          .find(queryString, value);
                  
          return find;
              }


              
          public List<T> find(String queryString, Object[] values)
                      
          throws DataAccessException {
                  List
          <T> find = (List<T>) getHibernateTemplate().find(queryString,
                          values);
                  
          return find;
              }


              
          public List<T> find(String queryString) throws DataAccessException {
                  
          return (List<T>) getHibernateTemplate().find(queryString);
              }


              
          public void refresh(T t, LockMode lockMode) throws DataAccessException {
                  getHibernateTemplate().refresh(t, lockMode);
              }


              
          public void refresh(T t) throws DataAccessException {
                  getHibernateTemplate().refresh(t);
              }


              
          public Serializable save(T t) throws DataAccessException {
                  
          return getHibernateTemplate().save(t);
              }


              
          public void saveOrUpdateAll(Collection<T> entities)
                      
          throws DataAccessException {
                  getHibernateTemplate().saveOrUpdateAll(entities);
              }


              
          public void update(T t, LockMode lockMode) throws DataAccessException {
                  getHibernateTemplate().update(t, lockMode);
              }


              
          public void update(T t) throws DataAccessException {
                  getHibernateTemplate().update(t);
              }



              
          public List<T> list() throws DataAccessException {
                  
          return getHibernateTemplate().loadAll(getEntityClass());

              }


              
          public List<T> findByNamedQuery(String queryName)
                      
          throws DataAccessException {
                  
          return getHibernateTemplate().findByNamedQuery(queryName);
              }


              
          public List<T> findByNamedQuery(String queryName, Object value)
                      
          throws DataAccessException {
                  
          return getHibernateTemplate().findByNamedQuery(queryName, value);
              }


              
          public List<T> findByNamedQuery(String queryName, Object[] values)
                      
          throws DataAccessException {
                  
          return getHibernateTemplate().findByNamedQuery(queryName, values);
              }


              
          public PaginationSupport findPageByCriteria(
                      
          final DetachedCriteria detachedCriteria, final int pageSize,
                      
          final int startIndex) {
                  
          return (PaginationSupport) getHibernateTemplate().execute(
                          
          new HibernateCallback() {
                              
          public Object doInHibernate(Session session)
                                      
          throws HibernateException {
                                  Criteria criteria 
          = detachedCriteria
                                          .getExecutableCriteria(session);
                                  
          int totalCount = ((Integer) criteria.setProjection(
                                          Projections.rowCount()).uniqueResult())
                                          .intValue();
                                  criteria.setProjection(
          null);
                                  List items 
          = criteria.setFirstResult(startIndex)
                                          .setMaxResults(pageSize).list();
                                  PaginationSupport ps 
          = new PaginationSupport(items,
                                          totalCount, pageSize, startIndex);
                                  
          return ps;
                              }

                          }
          true);
              }


              
          public PaginationSupport findPageByQuery(final String hsql,
                      
          final int pageSize, final int startIndex) {
                  
          return (PaginationSupport) getHibernateTemplate().execute(
                          
          new HibernateCallback() {
                              
          public Object doInHibernate(Session session)
                                      
          throws HibernateException, SQLException {
                                  Query query 
          = session.createQuery(hsql);
                                  
          int totalCount = query.list().size();
                                  query.setFirstResult(startIndex);
                                  query.setMaxResults(pageSize);
                                  List items 
          = query.list();
                                  PaginationSupport ps 
          = new PaginationSupport(items,
                                          totalCount, pageSize, startIndex);
                                  
          return ps;

                              }

                          }
          true);
              }


          }


          呵呵,使用了泛型,以后每建立一個(gè)Dao都要建立相應(yīng)的dao接口和實(shí)現(xiàn)類(lèi),如本例中的IUserDao和UserDao。

          /** 
           *
           * 
          @author <a href="mailto:flustar2008@163.com">flustar</a>
           * 
          @version 1.0 
           * Creation date: Dec 24, 2007 12:47:57 AM
           
          */

          package com.firstssh.dao;

          import java.util.List;

          import com.firstssh.common.dao.IGenericDao;
          import com.firstssh.model.User;

          public interface IUserDao extends IGenericDao<User, Integer> {
              
              
          public User getUserByName(String username);

              
          public List<User> findAllUser();

              
          public User findUserByNameAndPass(String username, String password);
          }
           
          /** 
           *
           * 
          @author <a href="mailto:flustar2008@163.com">flustar</a>
           * 
          @version 1.0 
           * Creation date: Dec 24, 2007 12:38:48 AM
           
          */

          package com.firstssh.dao.impl;

          import java.util.List;

          import com.firstssh.common.dao.GenericDao;
          import com.firstssh.dao.IUserDao;
          import com.firstssh.model.User;

          public class UserDao extends GenericDao<User,Integer> implements IUserDao{

              
          public List<User> findAllUser() {
                  
                  
          return (List<User>)find("from User");
              }


              
          public User findUserByNameAndPass(String username, String password) {
                  Object[] params
          =new Object[]{username,password};
                  List
          <User> userList=find("from User as user where user.username=? and user.password=? ",params);
                  
          if(userList!=null&&userList.size()>=1){
                      
          return userList.get(0);
                  }

                  
          return null;
              }



              
          public User getUserByName(String username) {
                  List
          <User> userList=find("from User as user where user.username=?",username);
                  
          if(userList!=null&&userList.size()>=1){
                      
          return userList.get(0);
                  }

                  
          return null;
              }


          }


          還有好多文件的代碼沒(méi)有貼出來(lái),我實(shí)在不忍心再?gòu)?fù)制、粘貼下去了(浪費(fèi)大家那么多時(shí)間),有興趣的可以下載這個(gè)例子的源代碼(由于這個(gè)例子牽涉的jar包比較大我就不把它們放進(jìn)去了),我想以上這些文件的內(nèi)容我就不用解釋了,因?yàn)榇蠹叶紝W(xué)過(guò)SSH。本人初次整合它們,并沒(méi)有使用這個(gè)整合方案做過(guò)項(xiàng)目,一定還有某些方面考慮的還不是太成熟,哪位大俠看了,還請(qǐng)多多批評(píng)指正,也希望誰(shuí)有更好的整合方案,也共享一下,大家共同進(jìn)步,共同提高!~^_^



          張生工作室
          posted on 2008-05-13 12:20 張生工作室 閱讀(320) 評(píng)論(0)  編輯  收藏

          只有注冊(cè)用戶(hù)登錄后才能發(fā)表評(píng)論。


          網(wǎng)站導(dǎo)航:
           
          主站蜘蛛池模板: 霞浦县| 高邑县| 英德市| 邹城市| 商丘市| 固阳县| 巴楚县| 德钦县| 松阳县| 惠州市| 天津市| 龙泉市| 湖南省| 临潭县| 冀州市| 信丰县| 新丰县| 凯里市| 松潘县| 钟山县| 枞阳县| 中阳县| 紫阳县| 许昌市| 三门县| 鹤庆县| 全椒县| 巨鹿县| 巴东县| 缙云县| 正安县| 乌拉特后旗| 庄河市| 项城市| 白朗县| 新绛县| 新昌县| 呼和浩特市| 道孚县| 衡阳县| 沙洋县|