Struts2+spring2+hibernate3整合方案

Posted on 2007-12-26 01:11 flustar 阅读(33783) 评论(44)  编辑  收藏 所属分类: 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 -->
    
<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用来初始化struts2并且处理所有的WEB请求。 -->
    
<filter-mapping>
        
<filter-name>struts2</filter-name>
        
<url-pattern>/*</url-pattern>
    
</filter-mapping>
    
   
<!-- 这是一个产生验证码的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>
    
<!-- 检查用户名是否存在 ValidateName的映射文件-->
    
<allow>
      
<create  creator="spring" javascript="ValidateName" >
          
<param name="beanName" value="validateName"/>
          
<include method="valid"/>
      
</create>
     
</allow>
</dwr>



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

 

/** 
 *
 * 
@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 hql,
            
final String countHql, final int pageSize, final int startIndex);

}


GenericDao.java内容如下:

/** 
 *
 * 
@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 hql, final String countHql,final int pageSize,final int startIndex)
         
return (PaginationSupport)getHibernateTemplate().execute( 
         
new  HibernateCallback() 
           
public  Object doInHibernate(Session session)  throws  HibernateException, SQLException 
               
int totalCount=((Integer) session.createQuery(countHql).iterate().next()).intValue(); 
               Query query  
=  session.createQuery(hql);
                 query.setFirstResult(startIndex); 
                 query.setMaxResults(pageSize); 
                 List items  
= query.list();
              PaginationSupport ps 
= new PaginationSupport(items,
           totalCount, pageSize, startIndex);
              
return ps;
                 
                 }
 
           }
,true); 
      }


}


呵呵,使用了泛型,以后每建立一个Dao都要建立相应的dao接口和实现类,如本例中的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;
    }


}


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

Feedback

# re: Struts2+spring2+hibernate3整合方案  回复  更多评论   

2007-12-26 02:10 by JavaUser
好像没有源码的下载地址 :) 是不是忘记Update了?

# re: Struts2+spring2+hibernate3整合方案  回复  更多评论   

2007-12-26 08:24 by anone
没有看到任何代码,不明其意。。。

# re: Struts2+spring2+hibernate3整合方案[未登录]  回复  更多评论   

2007-12-26 09:11 by paul
god

# re: Struts2+spring2+hibernate3整合方案  回复  更多评论   

2007-12-26 11:54 by flustar
真的很抱歉,由于本人初次使用blogjava的插入代码功能,一不小心,粘贴的东西一个都没显示出来,现在终于搞好了。。。

# re: Struts2+spring2+hibernate3整合方案  回复  更多评论   

2007-12-26 13:57 by BeanSoft
不要显示行号。。。晕

# re: Struts2+spring2+hibernate3整合方案[未登录]  回复  更多评论   

2007-12-26 14:59 by yang
给出lib目录好不???

# re: Struts2+spring2+hibernate3整合方案  回复  更多评论   

2007-12-26 19:28 by 々上善若水々
好像是太阳老师的架构

# re: Struts2+spring2+hibernate3整合方案[未登录]  回复  更多评论   

2007-12-26 20:40 by 开源爱好者
好东西,顶!框架基本上都是最新的版本。

# re: Struts2+spring2+hibernate3整合方案  回复  更多评论   

2007-12-27 11:07 by huluhulu88
不错,好东西啊.我还想要源码,如果可以发到我的邮箱huluhulu88@163.com
先谢谢

# re: Struts2+spring2+hibernate3整合方案  回复  更多评论   

2007-12-27 22:06 by 龙江
不错,好东西啊.我还想要源码,如果可以发到我的邮箱longjiang@timesnet.cn
先谢谢

# re: Struts2+spring2+hibernate3整合方案[未登录]  回复  更多评论   

2007-12-28 23:51 by flustar
@龙江

@huluhulu88
这个例子只是我随手写的,并没有什么太大的价值,我主要做的是怎么整合这三个框架,源代码你可以下载啊 ,最后一段不是有红色的"源代码" 三个字吗,等我以后有时间写一个比较完整的例子,再发给你们!~

# re: Struts2+spring2+hibernate3整合方案  回复  更多评论   

2008-01-02 11:58 by liuyu
Spring 并是2.0 还是1.x的版本,过时了

# re: Struts2+spring2+hibernate3整合方案  回复  更多评论   

2008-01-02 11:58 by liuyu
Spring 并不是2.0 ,还是1.x的版本,有点过时了

# re: Struts2+spring2+hibernate3整合方案  回复  更多评论   

2008-03-10 10:43 by newhuman28
liuyu
Spring 并是2.0 还是1.x的版本,过时了

# re: Struts2+spring2+hibernate3整合方案[未登录]  回复  更多评论   

2008-03-10 16:33 by flustar
@newhuman28
@liuyu

我晕,你们是从哪里看出spring是1.x的版本,还请指教!!!
拜托,你们把spring的版本换个最新的试试,看看可行?!
肯定行的!!!

# re: Struts2+spring2+hibernate3整合方案  回复  更多评论   

2008-03-18 10:04 by langwolf
相当不错.以前一直用struts1.3+spring2.0+hibernate3...正想搞个Struts2.0的例子看看....
多谢共享

# re: Struts2+spring2+hibernate3整合方案  回复  更多评论   

2008-05-09 17:26 by QQ 530981086
我觉得 有点不太好的 使用了泛型,以后每建立一个Dao都要建立相应的dao接口和实现类,如本例中的IUserDao和UserDao。
那不是要很繁琐 ~~~有没有通用的DAO 又是泛型的

# re: Struts2+spring2+hibernate3整合方案  回复  更多评论   

2008-05-17 17:14 by 冰风
不错,楼主辛苦了!

# re: Struts2+spring2+hibernate3整合方案  回复  更多评论   

2008-05-30 16:36 by 陳小松
辛苦了,,

# re: Struts2+spring2+hibernate3整合方案  回复  更多评论   

2008-06-10 09:18 by 111
代码在哪里

# re: Struts2+spring2+hibernate3整合方案[未登录]  回复  更多评论   

2008-07-10 14:12 by 菜鸟
楼主,我在全盘拷贝了你的代码之后,运行登陆个注册页面的时候,那个验证码的图片没有显示,后台提示是对应的action没有定义。。。请问这个怎么解决啊?

# re: Struts2+spring2+hibernate3整合方案  回复  更多评论   

2008-07-19 04:37 by
有缺陷啊!
就是重复出错的时候~错误的信息会停留在同一页面啊
即是说错了多少次~就有多少次错误信息啊

# re: Struts2+spring2+hibernate3整合方案[未登录]  回复  更多评论   

2008-07-21 11:11 by flustar
@菜鸟
是不是你什么地方配置的不对?
@林
建议你用个高版本的struts2试试。

^_^,不好意思,程序只是随便写写的,为了说明怎么组合ssh,对里面的细节没有很关注,很有可能还不是太完善,这段时间比较忙,博客好久都没更新了,等有时间,我再发布个新版本吧。

# re: Struts2+spring2+hibernate3整合方案  回复  更多评论   

2008-07-24 15:09 by 845414
注册时老报错如下:

系统处理过程中发生了一个错误,信息如下:
Could not open Hibernate Session for transaction; nested exception is org.hibernate.exception.GenericJDBCException: Cannot open connection Could not open Hibernate Session for transaction; nested exception is org.hibernate.exception.GenericJDBCException: Cannot open connection

# re: Struts2+spring2+hibernate3整合方案[未登录]  回复  更多评论   

2008-08-04 00:58 by sclsch
<s:form action="/Regist.action" method="post" validate="true">

注册的时候,url 为 :
http://localhost:8080/ssh/Regist.action
页面空白,找不到action.
后台:
There is no Action mapped for namespace / and action name Regist. - [unknown location]

请问怎么回事?为什么Regist.action后面要跟action后缀,哪里设置?

# re: Struts2+spring2+hibernate3整合方案  回复  更多评论   

2008-08-15 16:15 by
写的太好了哈哈,能把全部的发我邮箱去吗,谢谢,yamazakizz526@sogou.com

# re: Struts2+spring2+hibernate3整合方案  回复  更多评论   

2008-08-26 11:07 by zzz
东西不错

# re: Struts2+spring2+hibernate3整合方案  回复  更多评论   

2008-09-30 11:57 by catPan
非常感谢……!!

# re: Struts2+spring2+hibernate3整合方案  回复  更多评论   

2008-12-08 10:18 by big
源文件里面怎么没有Test文件夹?是不是忘传了呀?

# re: Struts2+spring2+hibernate3整合方案  回复  更多评论   

2008-12-22 11:16 by by javab
写的太好了哈哈,能把全部的发我邮箱去吗,谢谢,jonkin.liu@139.com

# re: Struts2+spring2+hibernate3整合方案[未登录]  回复  更多评论   

2009-03-10 16:41 by yan
能发一份给我吗,yanyongqing87@gmail.com

# re: Struts2+spring2+hibernate3整合方案  回复  更多评论   

2009-04-13 14:38 by ctrl2
如何在异常跳转到exception.jsp页面时, 同时将异常记录到log文件中呢?

# re: Struts2+spring2+hibernate3整合方案  回复  更多评论   

2009-04-13 14:38 by ctrl2
如何在异常跳转到exception.jsp页面时, 同时将异常记录到log文件中呢?

# re: Struts2+spring2+hibernate3整合方案  回复  更多评论   

2009-04-13 14:38 by ctrl2
如何在异常跳转到exception.jsp页面时, 同时将异常记录到log文件中呢?

# re: Struts2+spring2+hibernate3整合方案[未登录]  回复  更多评论   

2009-04-15 10:24 by flustar
1、class BusinessException extends Exception{
...........
}

2、在一个现有的拦截器或新建的一个拦截器实现:
public String intercept(ActionInvocation invocation) throws Exception

{

try{

result = invocation.invoke();

}catch(DataAccessException ex){
logger.error(................);
throw new BusinessException("数据库操作失败!");

}catch(NullPointerException ex){
logger.error(................);
throw new BusinessException("调用了未经初始化的对象或者是不存在的对象!");

}catch(.........){
..........
}
...........
}
3、建立exception.jsp 用来输出异常信息
4、﹤global-results﹥

﹤result name="error"﹥/exception.jsp﹤/result﹥

﹤/global-results﹥

﹤global-exception-mappings﹥

﹤exception-mapping result="error" exception="*.BusinessException"﹥﹤/exception-mapping﹥

﹤/global-exception-mappings﹥

# re: Struts2+spring2+hibernate3整合方案  回复  更多评论   

2009-06-20 00:48 by David Palacios

Hi,

I'm new in terms of programming Struts2, Spring2 and Hibernate3, firstssh His example seems to me very interesting and achieves run on my PC. Parks have only one request can u send me an example of Pagination with GenericDAO.

Thank you

Mail:
gorgory3@queretaro.com

# re: Struts2+spring2+hibernate3整合方案  回复  更多评论   

2010-06-23 16:19 by saber
能不能给我个原码啊!菜鸟学习中

# re: Struts2+spring2+hibernate3整合方案  回复  更多评论   

2010-12-16 15:25 by 11
楼主试过没有在action-servlet.xml中要是不去配置,也可以跑起来?但在其他配置bean里面不去配置就不会注入

# re: Struts2+spring2+hibernate3整合方案  回复  更多评论   

2011-01-21 10:18 by 张登博
谢谢,哥们

# re: Struts2+spring2+hibernate3整合方案  回复  更多评论   

2011-02-18 15:19 by 李昌琼
严重: Error configuring application listener of class org.springframework.web.util.Log4jConfigListener
java.lang.ClassNotFoundException: org.springframework.web.util.Log4jConfigListener
at org.apache.catalina.loader.WebappClassLoader.loadClass(WebappClassLoader.java:1387)
at org.apache.catalina.loader.WebappClassLoader.loadClass(WebappClassLoader.java:1233)
at org.apache.catalina.core.StandardContext.listenerStart(StandardContext.java:3786)
at org.apache.catalina.core.StandardContext.start(StandardContext.java:4342)
at org.apache.catalina.core.ContainerBase.addChildInternal(ContainerBase.java:791)
at org.apache.catalina.core.ContainerBase.addChild(ContainerBase.java:771)
at org.apache.catalina.core.StandardHost.addChild(StandardHost.java:525)
at org.apache.catalina.startup.HostConfig.deployDirectory(HostConfig.java:926)
at org.apache.catalina.startup.HostConfig.deployDirectories(HostConfig.java:889)
at org.apache.catalina.startup.HostConfig.deployApps(HostConfig.java:492)
at org.apache.catalina.startup.HostConfig.start(HostConfig.java:1149)
at org.apache.catalina.startup.HostConfig.lifecycleEvent(HostConfig.java:311)
at org.apache.catalina.util.LifecycleSupport.fireLifecycleEvent(LifecycleSupport.java:117)
at org.apache.catalina.core.ContainerBase.start(ContainerBase.java:1053)
at org.apache.catalina.core.StandardHost.start(StandardHost.java:719)
at org.apache.catalina.core.ContainerBase.start(ContainerBase.java:1045)
at org.apache.catalina.core.StandardEngine.start(StandardEngine.java:443)
at org.apache.catalina.core.StandardService.start(StandardService.java:516)
at org.apache.catalina.core.StandardServer.start(StandardServer.java:710)
at org.apache.catalina.startup.Catalina.start(Catalina.java:578)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
at java.lang.reflect.Method.invoke(Method.java:597)
at org.apache.catalina.startup.Bootstrap.start(Bootstrap.java:288)
at org.apache.catalina.startup.Bootstrap.main(Bootstrap.java:413)
2011-2-18 15:11:43 org.apache.catalina.core.StandardContext listenerStart
严重: Error configuring application listener of class org.springframework.web.context.ContextLoaderListener
java.lang.ClassNotFoundException: org.springframework.web.context.ContextLoaderListener
at org.apache.catalina.loader.WebappClassLoader.loadClass(WebappClassLoader.java:1387)
at org.apache.catalina.loader.WebappClassLoader.loadClass(WebappClassLoader.java:1233)
at org.apache.catalina.core.StandardContext.listenerStart(StandardContext.java:3786)
at org.apache.catalina.core.StandardContext.start(StandardContext.java:4342)
at org.apache.catalina.core.ContainerBase.addChildInternal(ContainerBase.java:791)
at org.apache.catalina.core.ContainerBase.addChild(ContainerBase.java:771)
at org.apache.catalina.core.StandardHost.addChild(StandardHost.java:525)
at org.apache.catalina.startup.HostConfig.deployDirectory(HostConfig.java:926)
at org.apache.catalina.startup.HostConfig.deployDirectories(HostConfig.java:889)
at org.apache.catalina.startup.HostConfig.deployApps(HostConfig.java:492)
at org.apache.catalina.startup.HostConfig.start(HostConfig.java:1149)
at org.apache.catalina.startup.HostConfig.lifecycleEvent(HostConfig.java:311)
at org.apache.catalina.util.LifecycleSupport.fireLifecycleEvent(LifecycleSupport.java:117)
at org.apache.catalina.core.ContainerBase.start(ContainerBase.java:1053)
at org.apache.catalina.core.StandardHost.start(StandardHost.java:719)
at org.apache.catalina.core.ContainerBase.start(ContainerBase.java:1045)
at org.apache.catalina.core.StandardEngine.start(StandardEngine.java:443)
at org.apache.catalina.core.StandardService.start(StandardService.java:516)
at org.apache.catalina.core.StandardServer.start(StandardServer.java:710)
at org.apache.catalina.startup.Catalina.start(Catalina.java:578)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
at java.lang.reflect.Method.invoke(Method.java:597)
at org.apache.catalina.startup.Bootstrap.start(Bootstrap.java:288)
at org.apache.catalina.startup.Bootstrap.main(Bootstrap.java:413)

# re: Struts2+spring2+hibernate3整合方案  回复  更多评论   

2011-02-18 15:20 by 李昌琼
这是哪儿的错啊

# re: Struts2+spring2+hibernate3整合方案  回复  更多评论   

2011-02-18 15:22 by 李昌琼
我实在找不到解决的方法!希望哪儿好心人能帮忙解决一下!

# re: Struts2+spring2+hibernate3整合方案  回复  更多评论   

2015-01-05 17:08 by 李浩宇
能不能给我发一份源码,跪求764263599@qq.com 谢谢

# re: Struts2+spring2+hibernate3整合方案[未登录]  回复  更多评论   

2015-12-04 11:09 by
能不能给我个原码啊!菜鸟学习中跪求619562440@qq.com 谢谢

只有注册用户登录后才能发表评论。


网站导航:
 

posts - 146, comments - 143, trackbacks - 0, articles - 0

Copyright © flustar