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.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.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内容:
<! 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内容:
<! 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内容:
<! 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 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
内容:
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
<! 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 hsql,
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 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);
}
}
呵呵,使用了泛型,以后每建立一个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, In
teger>
{
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。本人初次整合它们,并没有使用这个整合方案做过项目,一定还有某些方面考虑的还不是太成熟,哪位大侠看了,还请多多批评指正,也希望谁有更好的整合方案,也共享一下,大家共同进步,共同提高!~^_^
293



被折叠的 条评论
为什么被折叠?



