SSH框架搭建Struts2.06+spring2.5+hibernate3.2整合实例代码教程步骤

原创整理不易,转载请注明出处:ssh框架搭建Struts2.06+spring2.5+hibernate3.2整合实例代码教程步骤

代码下载地址:http://www.zuidaima.com/share/1760074977233920.htm

最近闲来无事可做,于是开始学习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脚本内容:

  1. CREATE TABLE `zuidaima_user` (  
  2.   `userid` int(11) NOT NULL AUTO_INCREMENT,  
  3.   `username` varchar(20) NOT NULL,  
  4.   `passwordvarchar(16) NOT NULL,  
  5.   `email` varchar(30) NOT NULL,  
  6.   PRIMARY KEY (`userid`)  
  7. ) ENGINE=InnoDB DEFAULT CHARSET=utf-8;  


二、 开始行动
包结构可以参考下图
 
图一

 图二

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

  1. <? xml version="1.0" encoding="UTF-8" ?>  
  2. <! DOCTYPE struts PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 2.0//EN" "http://struts.apache.org/dtds/struts-2.0.dtd" >  
  3. <struts>  
  4.     <package  name ="user_curd"  extends ="struts-default"  >  
  5.         <global-results>  
  6.             <!--  下面定义的结果对所有的Action都有效  -->  
  7.             <result  name ="exception"> /error.jsp </result>  
  8.         </global-results>  
  9.   
  10.         <global-exception-mappings>  
  11.             <!--  指Action抛出Exception异常时,转入名为exception的结果。  -->  
  12.             <exception-mapping  exception ="java.lang.Exception"  result ="exception" />  
  13.         </global-exception-mappings>  
  14.   
  15.         <action  name ="Login"  class ="LoginAction">  
  16.             <result  name ="success"> /success.jsp </result>       
  17.             <result  name ="input"> /login.jsp </result>  
  18.         </action>  
  19.         <action  name ="Regist"  class ="RegistAction">  
  20.             <result  name ="success"> /success.jsp </result>       
  21.             <result  name ="input"> /regist.jsp </result>  
  22.         </action>  
  23.     </package>    
  24. </struts>  


Struts.properties内容如下:

  1. struts.devMode = false  
  2. struts.enable.DynamicMethodInvocation = true  
  3. struts.i18n.reload = true  
  4. struts.ui.theme =xhtml  
  5.   
  6. struts.locale = zh_CN  
  7. struts.i18n.encoding = UTF- 8  
  8. struts.objectFactory = spring  
  9. struts.objectFactory.spring.autoWire = name  
  10.   
  11. struts.serve.static.browserCache = false  
  12. struts.url.includeParams = none  


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

[java]  view plain copy print ? 在CODE上查看代码片 派生到我的代码片
  1. /**  
  2.  *  
  3.  * @author <a href="mailto:flustar2008@163.com">flustar</a> 
  4.  * @version 1.0  
  5.  * Creation date: Dec 23, 2007 1:55:28 PM 
  6.  */  
  7. package com.firstssh.model;  
  8.   
  9. import java.io.Serializable;  
  10.   
  11. public class User implements Serializable {  
  12.     private int id;  
  13.     private String username;  
  14.     private String password;  
  15.     private String email;  
  16.   
  17.     public int getId() {  
  18.         return id;  
  19.     }  
  20.   
  21.     public void setId(int id) {  
  22.         this.id = id;  
  23.     }  
  24.   
  25.     public String getUsername() {  
  26.         return username;  
  27.     }  
  28.   
  29.     public void setUsername(String username) {  
  30.         this.username = username;  
  31.     }  
  32.   
  33.     public String getPassword() {  
  34.         return password;  
  35.     }  
  36.   
  37.     public void setPassword(String password) {  
  38.         this.password = password;  
  39.     }  
  40.   
  41.     public String getEmail() {  
  42.         return email;  
  43.     }  
  44.   
  45.     public void setEmail(String email) {  
  46.         this.email = email;  
  47.     }  
  48. }  


User.hbm.xml内容:

  1. <?xml version="1.0"?>  
  2. <!DOCTYPE hibernate-mapping PUBLIC   
  3.     "-//Hibernate/Hibernate Mapping DTD 3.0//EN"  
  4.     "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">  
  5. <hibernate-mapping   
  6.     package="com.firstssh.model">  
  7.   
  8.     <class name="User" table="User">  
  9.         <id name="id" column="userid">  
  10.             <generator class="identity" />  
  11.         </id>      
  12.         <property name="username"  
  13.                   column="username"  
  14.                   not-null="true"  
  15.                   length="20"  
  16.         />  
  17.         <property name="password"  
  18.                   column="password"  
  19.                   not-null="true"  
  20.                   length="16" />  
  21.         <property name="email"  
  22.                   column="email"  
  23.                   not-null="true"  
  24.                   length="30"/>  
  25.     </class>  
  26.       
  27. </hibernate-mapping>  


jdbc.properties内容如下:

  1. datasource.type = mysql  
  2. datasource.driverClassName = com.mysql.jdbc.Driver  
  3. datasource.url = jdbc:mysql://localhost: 3306 /test?useUnicode = true&characterEncoding = UTF- 8  
  4.   
  5. datasource.username = root  
  6. datasource.password = 123456  
  7.   
  8. datasource.maxActive = 10  
  9. datasource.maxIdle = 2  
  10. datasource.maxWait = 120000  
  11. datasource.whenExhaustedAction = 1  
  12. datasource.validationQuery = select  1  from dual  
  13. datasource.testOnBorrow = true  
  14. datasource.testOnReturn = false  
  15.   
  16. c3p0.acquireIncrement = 3  
  17. c3p0.initialPoolSize = 3  
  18. c3p0.idleConnectionTestPeriod = 900  
  19. c3p0.minPoolSize = 2  
  20. c3p0.maxPoolSize = 50  
  21. c3p0.maxStatements = 100  
  22. c3p0.numHelperThreads = 10  
  23. c3p0.maxIdleTime = 600  
  24.   
  25. hibernate.dialect = org.hibernate.dialect.MySQLInnoDBDialect  
  26. #hibernate.dialect = org.hibernate.dialect.MySQLMyISAMDialect  
  27.   
  28. hibernate.jdbc.batch_size = 25  
  29. hibernate.jdbc.fetch_size = 50  
  30. hibernate.show_sql = true  
  31. hibernate.connection.release_mode = after_transaction  


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

  1. <?xml version="1.0" encoding="UTF-8"?>  
  2. <!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN 2.0//EN" "http://www.springframework.org/dtd/spring-beans-2.0.dtd">  
  3. <beans>  
  4. <bean id="propertyConfigurer"  
  5.     class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">  
  6.     <property name="locations">  
  7.         <list>  
  8.             <!--  <value>WEB-INF/mail.properties</value>-->  
  9.             <value>WEB-INF/jdbc.properties</value>  
  10.             <!--  <value>WEB-INF/oscache.properties</value>-->  
  11.         </list>  
  12.     </property>  
  13. </bean>  
  14. <!-- MailSender used by EmailAdvice -->  
  15. <!--  
  16.     <bean id="mailSender" class="org.springframework.mail.javamail.JavaMailSenderImpl">  
  17.     <property name="host" value="${mail.host}"/>  
  18.     </bean>  
  19. -->  
  20. <bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource"  
  21.     destroy-method="close" dependency-check="none">  
  22.     <property name="driverClass">  
  23.         <value>${datasource.driverClassName}</value>  
  24.     </property>  
  25.     <property name="jdbcUrl">  
  26.         <value>${datasource.url}</value>  
  27.     </property>  
  28.     <property name="user">  
  29.         <value>${datasource.username}</value>  
  30.     </property>  
  31.     <property name="password">  
  32.         <value>${datasource.password}</value>  
  33.     </property>  
  34.     <property name="acquireIncrement">  
  35.         <value>${c3p0.acquireIncrement}</value>  
  36.     </property>  
  37.     <property name="initialPoolSize">  
  38.         <value>${c3p0.initialPoolSize}</value>  
  39.     </property>  
  40.     <property name="minPoolSize">  
  41.         <value>${c3p0.minPoolSize}</value>  
  42.     </property>  
  43.     <property name="maxPoolSize">  
  44.         <value>${c3p0.maxPoolSize}</value>  
  45.     </property>  
  46.     <property name="maxIdleTime">  
  47.         <value>${c3p0.maxIdleTime}</value>  
  48.     </property>  
  49.     <property name="idleConnectionTestPeriod">  
  50.         <value>${c3p0.idleConnectionTestPeriod}</value>  
  51.     </property>  
  52.     <property name="maxStatements">  
  53.         <value>${c3p0.maxStatements}</value>  
  54.     </property>  
  55.     <property name="numHelperThreads">  
  56.         <value>${c3p0.numHelperThreads}</value>  
  57.     </property>  
  58. </bean>  
  59. <bean id="sessionFactory"  
  60.     class="org.springframework.orm.hibernate3.LocalSessionFactoryBean">  
  61.     <property name="dataSource">  
  62.         <ref local="dataSource" />  
  63.     </property>  
  64.     <property name="mappingResources">  
  65.         <list>  
  66.             <value>com/firstssh/model/User.hbm.xml</value>  
  67.         </list>  
  68.     </property>  
  69.     <property name="hibernateProperties">  
  70.         <props>  
  71.             <prop key="hibernate.dialect">${hibernate.dialect}</prop>  
  72.             <prop key="hibernate.show_sql">${hibernate.show_sql}</prop>  
  73.             <prop key="hibernate.jdbc.fetch_size">  
  74.                 ${hibernate.jdbc.fetch_size}  
  75.             </prop>  
  76.             <prop key="hibernate.jdbc.batch_size">  
  77.                 ${hibernate.jdbc.batch_size}  
  78.             </prop>  
  79.         </props>  
  80.     </property>  
  81. </bean>  
  82. <!-- 配置事务管理器bean,使用HibernateTransactionManager事务管理器 -->  
  83. <bean id="transactionManager"  
  84.     class="org.springframework.orm.hibernate3.HibernateTransactionManager">  
  85.         <!-- 为事务管理器注入sessionFactory" -->  
  86.         <property name="sessionFactory" ref="sessionFactory"/>  
  87. </bean>  
  88. <!-- 配置事务拦截器Bean -->  
  89. <bean id="transactionInterceptor"  
  90.     class="org.springframework.transaction.interceptor.TransactionInterceptor">  
  91.     <!-- 为事务拦截器bean注入一个事物管理器 -->  
  92.     <property name="transactionManager" ref="transactionManager"></property>  
  93.     <property name="transactionAttributes">  
  94.     <!-- 定义事务传播属性 -->  
  95.         <props>  
  96.                 <prop key="insert*">PROPAGATION_REQUIRED</prop>  
  97.                 <prop key="update*">PROPAGATION_REQUIRED</prop>  
  98.                 <prop key="save*">PROPAGATION_REQUIRED</prop>  
  99.                 <prop key="add*">PROPAGATION_REQUIRED</prop>  
  100.                 <prop key="remove*">PROPAGATION_REQUIRED</prop>  
  101.                 <prop key="delete*">PROPAGATION_REQUIRED</prop>  
  102.                 <prop key="get*">PROPAGATION_REQUIRED,readOnly</prop>  
  103.                 <prop key="find*">PROPAGATION_REQUIRED,readOnly</prop>  
  104.                 <prop key="load*">PROPAGATION_REQUIRED,readOnly</prop>  
  105.                 <prop key="change*">PROPAGATION_REQUIRED</prop>  
  106.                 <prop key="*">PROPAGATION_REQUIRED,readOnly</prop>  
  107.         </props>  
  108.     </property>  
  109. </bean>  
  110. <!-- 定义BeanNameAutoProxyCreator -->  
  111. <bean class="org.springframework.aop.framework.autoproxy.BeanNameAutoProxyCreator">  
  112.     <!-- 指定满足哪些bean自动生成业务代理 -->  
  113.     <property name="beanNames">  
  114.     <!-- 需要自动创建事务代理的bean -->  
  115.         <list>  
  116.             <value>userService</value>  
  117.         </list>  
  118.         <!-- 其它需要自动创建事务代理的bean -->  
  119.     </property>  
  120.     <property name="interceptorNames">  
  121.         <list>  
  122.             <value>transactionInterceptor</value>  
  123.             <!-- 可增加其它的interceptor -->  
  124.         </list>  
  125.     </property>  
  126. </bean>  
  127. </beans>  

applicationContext-dao.xml内容:

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


applicationContext-service.xml内容:

  1. <?xml version="1.0" encoding="UTF-8"?>  
  2. <!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN 2.0//EN" "http://www.springframework.org/dtd/spring-beans-2.0.dtd">  
  3. <beans>  
  4. <bean id="userService" class="com.firstssh.service.impl.UserService">  
  5.     <property name="userDao">  
  6.         <ref bean="userDao"/>  
  7.     </property>  
  8. </bean>  
  9. <bean id="validateName" class="com.firstssh.common.Bean.ValidateName">  
  10.     <property name="userService">  
  11.         <ref local="userService"/>  
  12.     </property>  
  13. </bean>  
  14. </beans>  


action-servlet.xml内容:

  1. <?xml version="1.0" encoding="UTF-8"?>  
  2. <!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN 2.0//EN" "http://www.springframework.org/dtd/spring-beans-2.0.dtd">  
  3. <beans>  
  4.   
  5.     <bean id="LoginAction" class="com.firstssh.action.LoginAction"  
  6.         scope="prototype">  
  7.         <property name="userService" ref="userService" />  
  8.     </bean>  
  9.     <bean id="RegistAction" class="com.firstssh.action.RegistAction"  
  10.         scope="prototype">  
  11.         <property name="userService" ref="userService" />  
  12.     </bean>  
  13. </beans>  


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

  1. # For JBoss: Avoid to setup Log4J outside $JBOSS_HOME/server/default/deploy/log4j.xml!  
  2. # For all other servers: Comment out the Log4J listener in web.xml to activate Log4J.  
  3. log4j.rootLogger=INFO, stdout, logfile  
  4.   
  5. log4j.appender.stdout=org.apache.log4j.ConsoleAppender  
  6. log4j.appender.stdout.layout=org.apache.log4j.PatternLayout  
  7. log4j.appender.stdout.layout.ConversionPattern=%d %p [%c] - %m%n  
  8.   
  9. log4j.appender.logfile=org.apache.log4j.RollingFileAppender  
  10. log4j.appender.logfile.File=${firstssh.root}/WEB-INF/logs/firstssh.log  
  11. log4j.appender.logfile.MaxFileSize=512KB  
  12. # Keep three backup files.  
  13. log4j.appender.logfile.MaxBackupIndex=3  
  14. # Pattern to output: date priority [category] - message  
  15. log4j.appender.logfile.layout=org.apache.log4j.PatternLayout  
  16. log4j.appender.logfile.layout.ConversionPattern=%d %p [%c] - %m%n  
  17. # OpenSymphony Stuff  
  18. log4j.logger.com.opensymphony=INFO  
  19. log4j.logger.org.apache.struts2=INFO  
  20. # Spring Stuff  
  21. log4j.logger.org.springframework=INFO  
  22. # Hibernate Stuff  
  23. log4j.logger.org.hiberante=INFO  

commons-logging.properties
内容:

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


5)web.xml

  1. <?xml version="1.0" encoding="UTF-8"?>  
  2. <web-app xmlns="http://java.sun.com/xml/ns/j2ee"   
  3.  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"   
  4.  xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd"   
  5.  version="2.4">  
  6.  <display-name>firstssh</display-name>  
  7.  <description>this is a simple example</description>  
  8.  <context-param>  
  9.   <param-name>webAppRootKey</param-name>  
  10.   <param-value>firstssh.root</param-value>  
  11.  </context-param>  
  12.    
  13.  <context-param>  
  14.   <param-name>contextConfigLocation</param-name>  
  15.   <param-value>/WEB-INF/applicationContext-*.xml,/WEB-INF/action-servlet.xml</param-value>  
  16.  </context-param>  
  17.  <context-param>  
  18.   <param-name>log4jConfigLocation</param-name>  
  19.   <param-value>/WEB-INF/log4j.properties</param-value>  
  20.  </context-param>  
  21.  <listener>  
  22.   <listener-class>org.springframework.web.util.Log4jConfigListener</listener-class>  
  23.  </listener>  
  24.  <!-- 用于初始化Spring容器的Listener -->  
  25.     <listener>  
  26.         <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>  
  27.     </listener>  
  28.    
  29.    
  30.  <!-- 定义整合SiteMesh必须的ActionContextCleanUp Filter   
  31.  <filter>  
  32.   <filter-name>struts-cleanup</filter-name>  
  33.   <filter-class>org.apache.struts2.dispatcher.ActionContextCleanUp</filter-class>  
  34.  </filter>-->  
  35.  <!-- 定义Struts2的FilterDispathcer的Filter -->  
  36.     <filter>  
  37.         <filter-name>struts2</filter-name>  
  38.         <filter-class>org.apache.struts2.dispatcher.FilterDispatcher</filter-class>  
  39.     </filter>  
  40.   
  41.    <!--   <filter-mapping>  
  42.         <filter-name>struts-cleanup</filter-name>  
  43.         <url-pattern>/*</url-pattern>  
  44.     </filter-mapping>-->  
  45.  <!-- FilterDispatcher用来初始化struts2并且处理所有的WEB请求。 -->  
  46.     <filter-mapping>  
  47.         <filter-name>struts2</filter-name>  
  48.         <url-pattern>/*</url-pattern>  
  49.     </filter-mapping>  
  50.       
  51.    <!-- 这是一个产生验证码的servlet -->  
  52.     <servlet>  
  53.         <servlet-name>img</servlet-name>  
  54.         <servlet-class>com.firstssh.servlet.AuthImg</servlet-class>  
  55.     </servlet>  
  56.     
  57.     <servlet-mapping>  
  58.         <servlet-name>img</servlet-name>  
  59.      <url-pattern>/authImg</url-pattern>  
  60.     </servlet-mapping>  
  61.     <filter>     
  62.         <filter-name>encodingFilter</filter-name>     
  63.         <filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>     
  64.         <init-param>     
  65.             <param-name>encoding</param-name>     
  66.             <param-value>utf-8</param-value>     
  67.         </init-param>     
  68.     </filter>     
  69.     <filter-mapping>     
  70.         <filter-name>encodingFilter</filter-name>     
  71.         <url-pattern>*.action</url-pattern>     
  72.     </filter-mapping>     
  73.     <filter-mapping>     
  74.         <filter-name>encodingFilter</filter-name>     
  75.         <url-pattern>*.jsp</url-pattern>     
  76.     </filter-mapping>  
  77.     <filter>     
  78.         <filter-name>hibernateFilter</filter-name>     
  79.         <filter-class>org.springframework.orm.hibernate3.support.OpenSessionInViewFilter</filter-class>     
  80.     </filter>   
  81.     <filter-mapping>     
  82.         <filter-name>hibernateFilter</filter-name>     
  83.         <url-pattern>*.action</url-pattern>     
  84.     </filter-mapping>   
  85.       
  86.     <!-- DWR Servlet-->  
  87.   <servlet>  
  88.     <servlet-name>dwr-invoker</servlet-name>  
  89.     <servlet-class>org.directwebremoting.servlet.DwrServlet</servlet-class>  
  90.     <init-param>  
  91.       <param-name>debug</param-name>  
  92.       <param-value>true</param-value>  
  93.     </init-param>  
  94.   </servlet>  
  95.   
  96.   <servlet-mapping>  
  97.     <servlet-name>dwr-invoker</servlet-name>  
  98.     <url-pattern>/dwr/*</url-pattern>  
  99.   </servlet-mapping>  
  100.     
  101.     <session-config>     
  102.         <session-timeout>10</session-timeout>     
  103.     </session-config>   
  104.       
  105.   <welcome-file-list>  
  106.     <welcome-file>index.jsp</welcome-file>  
  107.   </welcome-file-list>  
  108.   <error-page>  
  109.     <error-code>401</error-code>  
  110.     <location>/401.htm</location>  
  111.   </error-page>  
  112.   <error-page>  
  113.     <error-code>403</error-code>  
  114.     <location>/403.htm</location>  
  115.   </error-page>  
  116.   <error-page>  
  117.     <error-code>404</error-code>  
  118.     <location>/404.htm</location>  
  119.   </error-page>  
  120.   <error-page>  
  121.     <error-code>500</error-code>  
  122.     <location>/500.htm</location>  
  123.   </error-page>  
  124. </web-app>  

 

6)dwr.xml

  1. <?xml version="1.0" encoding="UTF-8"?>  
  2. <!DOCTYPE dwr PUBLIC "-//GetAhead Limited//DTD Direct Web Remoting 2.0//EN" "http://getahead.org/dwr/dwr20.dtd">  
  3.   
  4. <dwr>  
  5.     <!-- 检查用户名是否存在 ValidateName的映射文件-->  
  6.     <allow>  
  7.       <create  creator="spring" javascript="ValidateName" >  
  8.           <param name="beanName" value="validateName"/>  
  9.           <include method="valid"/>  
  10.       </create>  
  11.      </allow>  
  12. </dwr>  

三、 开始编码:
以下是DAO部分的核心代码:
IGenericDao.java内容如下:

[java]  view plain copy print ? 在CODE上查看代码片 派生到我的代码片
  1. /**  
  2.  * 
  3.  * @author <a href="mailto:flustar2008@163.com">flustar</a> 
  4.  * @version 1.0  
  5.  * Creation date: Dec 23, 2007 6:19:21 PM 
  6.  */  
  7.  package com.firstssh.common.dao;  
  8.   
  9.  import java.io.Serializable;  
  10.  import java.util.Collection;  
  11.  import java.util.List;  
  12.   
  13.  import org.hibernate.LockMode;  
  14.  import org.hibernate.criterion.DetachedCriteria;  
  15.  import org.springframework.dao.DataAccessException;  
  16.  import com.firstssh.common.util.PaginationSupport;  
  17.   
  18.  public interface IGenericDao <T, ID extends Serializable> {  
  19.  public T load(ID id) throws DataAccessException;  
  20.   
  21.  public T get(ID id)throws DataAccessException;  
  22.   
  23.  public boolean contains(T t) throws DataAccessException;  
  24.   
  25.  public void refresh(T t, LockMode lockMode) throws DataAccessException;  
  26.   
  27.  public void refresh(T t) throws DataAccessException;  
  28.   
  29.  public Serializable save(T t) throws DataAccessException;  
  30.   
  31.  public void saveOrUpdate(T t) throws DataAccessException;  
  32.   
  33.  public void saveOrUpdateAll(Collection<T> entities)  
  34.  throws DataAccessException;  
  35.   
  36.  public void update(T t, LockMode lockMode) throws DataAccessException;  
  37.   
  38.  public void update(T t) throws DataAccessException;  
  39.   
  40.  public void delete(T t, LockMode lockMode) throws DataAccessException;  
  41.   
  42.  public void delete(T t) throws DataAccessException;  
  43.   
  44.  public void deleteAll(Collection<T> entities) throws DataAccessException;  
  45.   
  46.  public List<T> find(String queryString, Object value)  
  47.  throws DataAccessException;  
  48.   
  49.  public List<T> find(String queryString, Object[] values)  
  50.  throws DataAccessException;  
  51.   
  52.  public List<T> find(String queryString) throws DataAccessException;  
  53.   
  54.  public List<T> list()throws DataAccessException;  
  55.    
  56.  public List<T> findByNamedQuery(String queryName)throws DataAccessException ;  
  57.    
  58.  public List<T> findByNamedQuery(String queryName, Object value)throws DataAccessException ;  
  59.    
  60.  public List<T> findByNamedQuery(String queryName, Object[] values)throws DataAccessException ;  
  61.    
  62.   
  63.  public PaginationSupport findPageByCriteria(  
  64.  final DetachedCriteria detachedCriteria, final int pageSize,  
  65.  final int startIndex);  
  66.   
  67.  public PaginationSupport findPageByQuery(final String hql,  
  68.  final String countHql, final int pageSize, final int startIndex);  
  69.   
  70. }  


GenericDao.java内容如下:

[java]  view plain copy print ? 在CODE上查看代码片 派生到我的代码片
  1.  /**  
  2.  * 
  3.  * @author <a href="mailto:flustar2008@163.com">flustar</a> 
  4.  * @version 1.0  
  5.  * Creation date: Dec 23, 2007 11:23:56 PM 
  6.  */  
  7.  package com.firstssh.common.dao;  
  8.   
  9.  import java.io.Serializable;  
  10.  import java.lang.reflect.ParameterizedType;  
  11.  import java.sql.SQLException;  
  12.  import java.util.Collection;  
  13.  import java.util.List;  
  14.   
  15.  import org.apache.commons.logging.Log;  
  16.  import org.apache.commons.logging.LogFactory;  
  17.  import org.hibernate.Criteria;  
  18.  import org.hibernate.HibernateException;  
  19.  import org.hibernate.LockMode;  
  20.  import org.hibernate.Query;  
  21.  import org.hibernate.Session;  
  22.  import org.hibernate.criterion.DetachedCriteria;  
  23.  import org.hibernate.criterion.Projections;  
  24.  import org.springframework.dao.DataAccessException;  
  25.  import org.springframework.orm.hibernate3.HibernateCallback;  
  26.  import org.springframework.orm.hibernate3.support.HibernateDaoSupport;  
  27.  import com.firstssh.common.util.PaginationSupport;  
  28.   
  29. @SuppressWarnings" unchecked " )  
  30.  public class GenericDao <T, ID extends Serializable> extends HibernateDaoSupport  
  31.  implements IGenericDao <T, ID> ];  
  32.  logger.debug("T class=" + entityClass.getName());  
  33.  }  
  34.  return entityClass;  
  35.  }  
  36.   
  37.  public void saveOrUpdate(T t) throws DataAccessException {  
  38.  this.getHibernateTemplate().saveOrUpdate(t);  
  39.  }  
  40.   
  41.  public T load(ID id) throws DataAccessException {  
  42.  T load=(T) getHibernateTemplate().load(getEntityClass(), id);  
  43.  return load;  
  44.  }  
  45.   
  46.  public T get(ID id) throws DataAccessException {  
  47.  T load=(T) getHibernateTemplate().get(getEntityClass(), id);  
  48.  return load;  
  49.  }  
  50.   
  51.  public boolean contains(T t) throws DataAccessException {  
  52.  return getHibernateTemplate().contains(t);  
  53.  }  
  54.   
  55.  public void delete(T t, LockMode lockMode) throws DataAccessException {  
  56.  getHibernateTemplate().delete(t, lockMode);  
  57.  }  
  58.   
  59.  public void delete(T t) throws DataAccessException {  
  60.  getHibernateTemplate().delete(t);  
  61.  }  
  62.   
  63.  public void deleteAll(Collection<T> entities) throws DataAccessException {  
  64.  getHibernateTemplate().deleteAll(entities);  
  65.  }  
  66.   
  67.  public List<T> find(String queryString, Object value)  
  68.  throws DataAccessException {  
  69.  List<T> find=(List<T>) getHibernateTemplate()  
  70.  .find(queryString, value);  
  71.  return find;  
  72.  }  
  73.   
  74.  public List<T> find(String queryString, Object[] values)  
  75.  throws DataAccessException {  
  76.  List<T> find=(List<T>) getHibernateTemplate().find(queryString,  
  77.  values);  
  78.  return find;  
  79.  }  
  80.   
  81.  public List<T> find(String queryString) throws DataAccessException {  
  82.  return (List<T>) getHibernateTemplate().find(queryString);  
  83.  }  
  84.   
  85.  public void refresh(T t, LockMode lockMode) throws DataAccessException {  
  86.  getHibernateTemplate().refresh(t, lockMode);  
  87.  }  
  88.   
  89.  public void refresh(T t) throws DataAccessException {  
  90.  getHibernateTemplate().refresh(t);  
  91.  }  
  92.   
  93.  public Serializable save(T t) throws DataAccessException {  
  94.  return getHibernateTemplate().save(t);  
  95.  }  
  96.   
  97.  public void saveOrUpdateAll(Collection<T> entities)  
  98.  throws DataAccessException {  
  99.  getHibernateTemplate().saveOrUpdateAll(entities);  
  100.  }  
  101.   
  102.  public void update(T t, LockMode lockMode) throws DataAccessException {  
  103.  getHibernateTemplate().update(t, lockMode);  
  104.  }  
  105.   
  106.  public void update(T t) throws DataAccessException {  
  107.  getHibernateTemplate().update(t);  
  108.  }  
  109.   
  110.   
  111.  public List<T> list() throws DataAccessException {  
  112.  return getHibernateTemplate().loadAll(getEntityClass());  
  113.   
  114.  }  
  115.   
  116.  public List<T> findByNamedQuery(String queryName)  
  117.  throws DataAccessException {  
  118.  return getHibernateTemplate().findByNamedQuery(queryName);  
  119.  }  
  120.   
  121.  public List<T> findByNamedQuery(String queryName, Object value)  
  122.  throws DataAccessException {  
  123.  return getHibernateTemplate().findByNamedQuery(queryName, value);  
  124.  }  
  125.   
  126.  public List<T> findByNamedQuery(String queryName, Object[] values)  
  127.  throws DataAccessException {  
  128.  return getHibernateTemplate().findByNamedQuery(queryName, values);  
  129.  }  
  130.   
  131.  public PaginationSupport findPageByCriteria(  
  132.  final DetachedCriteria detachedCriteria, final int pageSize,  
  133.  final int startIndex) {  
  134.  return (PaginationSupport) getHibernateTemplate().execute(  
  135.  new HibernateCallback() {  
  136.  public Object doInHibernate(Session session)  
  137.  throws HibernateException {  
  138.  Criteria criteria=detachedCriteria  
  139.  .getExecutableCriteria(session);  
  140.  int totalCount=((Integer) criteria.setProjection(  
  141.  Projections.rowCount()).uniqueResult())  
  142.  .intValue();  
  143.  criteria.setProjection(null);  
  144.  List items=criteria.setFirstResult(startIndex)  
  145.  .setMaxResults(pageSize).list();  
  146.  PaginationSupport ps=new PaginationSupport(items,  
  147.  totalCount, pageSize, startIndex);  
  148.  return ps;  
  149.  }  
  150.  }, true);  
  151.  }  
  152.   
  153.  public PaginationSupport findPageByQuery( final String hql, final String countHql,final int pageSize,final int startIndex){   
  154.  return (PaginationSupport)getHibernateTemplate().execute(   
  155.  new HibernateCallback() {   
  156.  public Object doInHibernate(Session session) throws HibernateException, SQLException {   
  157.  int totalCount=((Integer)session.createQuery(countHql).iterate().next()).intValue();   
  158.  Query query= session.createQuery(hql);  
  159.  query.setFirstResult(startIndex);   
  160.  query.setMaxResults(pageSize);   
  161.  List items=query.list();  
  162.  PaginationSupport ps=new PaginationSupport(items,  
  163.  totalCount, pageSize, startIndex);  
  164.  return ps;  
  165.    
  166.  }   
  167.  },true);   
  168.  }  
  169.   
  170. }  


呵呵,使用了泛型,以后每建立一个Dao都要建立相应的dao接口和实现类,如本例中的IUserDao和UserDao。

[java]  view plain copy print ? 在CODE上查看代码片 派生到我的代码片
  1. /**  
  2.  * 
  3.  * @author <a href="mailto:flustar2008@163.com">flustar</a> 
  4.  * @version 1.0  
  5.  * Creation date: Dec 24, 2007 12:47:57 AM 
  6.  */  
  7. package com.firstssh.dao;  
  8.   
  9. import java.util.List;  
  10.   
  11. import com.firstssh.common.dao.IGenericDao;  
  12. import com.firstssh.model.User;  
  13.   
  14. public interface IUserDao extends IGenericDao<User, Integer> {  
  15.       
  16.     public User getUserByName(String username);  
  17.   
  18.     public List<User> findAllUser();  
  19.   
  20.     public User findUserByNameAndPass(String username, String password);  
  21. }   
[java]  view plain copy print ? 在CODE上查看代码片 派生到我的代码片
  1. /**  
  2.  * 
  3.  * @author <a href="mailto:flustar2008@163.com">flustar</a> 
  4.  * @version 1.0  
  5.  * Creation date: Dec 24, 2007 12:38:48 AM 
  6.  */  
  7. package com.firstssh.dao.impl;  
  8.   
  9. import java.util.List;  
  10.   
  11. import com.firstssh.common.dao.GenericDao;  
  12. import com.firstssh.dao.IUserDao;  
  13. import com.firstssh.model.User;  
  14.   
  15. public class UserDao extends GenericDao<User,Integer> implements IUserDao{  
  16.   
  17.     public List<User> findAllUser() {  
  18.           
  19.         return (List<User>)find("from User");  
  20.     }  
  21.   
  22.     public User findUserByNameAndPass(String username, String password) {  
  23.         Object[] params=new Object[]{username,password};  
  24.         List<User> userList=find("from User as user where user.username=? and user.password=? ",params);  
  25.         if(userList!=null&&userList.size()>=1){  
  26.             return userList.get(0);  
  27.         }  
  28.         return null;  
  29.     }  
  30.   
  31.   
  32.     public User getUserByName(String username) {  
  33.         List<User> userList=find("from User as user where user.username=?",username);  
  34.         if(userList!=null&&userList.size()>=1){  
  35.             return userList.get(0);  
  36.         }  
  37.         return null;  
  38.     }  
  39.   
  40. }  


还有好多文件的代码没有贴出来,我实在不忍心再复制、粘贴下去了(浪费大家那么多时间),有兴趣的可以下载这个例子的源代码(由于这个例子牵涉的jar包比较大我就不把它们放进去了),我想以上这些文件的内容我就不用解释了,因为大家都学过SSH。本人初次整合它们,并没有使用这个整合方案做过项目,一定还有某些方面考虑的还不是太成熟,哪位大侠看了,还请多多批评指正,也希望谁有更好的整合方案,也共享一下,大家共同进步,共同提高!~^_^

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值