本文适用于那些知道如何搭建 Web 应用,知道如何分别配置 Struts2、Spring 和 Hibernate 的读者。
一个标准的 S2SH 环境的搭建分为以下几部分
1、WEB-INF/lib 目录下面要有以下 jar 包(如果文件名带版本号,我这里去掉了):
hsqldb.jar
asm.jar
ognl.jar
spring-webmvc.jar
freemarker.jar
commons-io.jar
commons-fileupload.jar
spring.jar
struts2-spring-plugin.jar
commons-logging.jar
hibernate.jar
hibernate-annotations.jar
dom4j.jar
ejb3-persistence.jar
xwork.jar
jta.jar
antlr.jar
commons-collections.jar
struts2-core.jar
cglib.jar
2、Hibernate/Spring 配置文件:
首先是把 Hibernate 和 Spring 的配置都写到 src 目录下的 applicationContext.xml 中(红色部分自行调整):
<bean id="sessionFactory"
class="org.springframework.orm.hibernate3.annotation.AnnotationSessionFactoryBean">
<property name="configurationClass" value="org.hibernate.cfg.AnnotationConfiguration"/>
<property name="hibernateProperties">
<props>
<prop key="hibernate.connection.url">jdbc:mysql://localhost/test</prop>
<prop key="hibernate.connection.driver_class">com.mysql.jdbc.Driver</prop>
<prop key="hibernate.connection.username">user</prop>
<prop key="hibernate.connection.password">user</prop>
<prop key="hibernate.connection.pool_size">3</prop>
<prop key="hibernate.dialect">org.hibernate.dialect.MySQL5InnoDBDialect</prop>
<prop key="show_sql">true</prop>
</props>
</property>
<property name="annotatedClasses">
<list>
<value>com.hyd.wallets.account.Account</value>
<value>com.hyd.wallets.wallet.Wallet</value>
</list>
</property>
</bean>
3、web.xml 内容如下:
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>WEB-INF/classes/applicationContext.xml</param-value>
</context-param>
<filter>
<filter-name>struts2</filter-name>
<filter-class>org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>struts2</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
<listener>
<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>
4、Struts 配置文件这里就略去了。不需要特殊配置。
5、实现通用持久化接口(具体用法请 Google "hibernate spring GenericDAO"):
public interface GenericDao<T, PK extends Serializable> {
/**
* 将对象持久化
*
* @param newInstance 要持久化的对象
*
* @return 持久化之后的主键值
*/
PK create(T newInstance);
/**
* 根据主键值获取持久化的对象
*
* @param id 主键值
*
* @return 持久化的对象
*/
T read(PK id);
/**
* 将游离对象更新持久化的对象
*
* @param transientObject 用来更新的游离对象
*/
void update(T transientObject);
/**
* 将持久化对象删除
*
* @param persistentObject 要删除的持久化对象
*/
void delete(T persistentObject);
}
------------------------------------------------------------------------------------
public class GenericDaoHibernateImpl<T, PK extends Serializable> implements GenericDao<T, PK> {
private static ThreadLocal<Session> session = new ThreadLocal<Session>();
private Class<T> type;
private SessionFactory sessionFactory;
public void setSessionFactory(SessionFactory sessionFactory) {
this.sessionFactory = sessionFactory;
}
public GenericDaoHibernateImpl(Class<T> type) {
this.type = type;
}
public PK create(T o) {
return (PK) getSession().save(o);
}
private Session getSession() {
if (session.get() == null || !session.get().isOpen()) {
session.set(sessionFactory.openSession());
}
return session.get();
}
public T read(PK id) {
return (T) getSession().get(type, id);
}
public void update(T o) {
getSession().update(o);
}
public void delete(T o) {
getSession().delete(o);
}
}
至此,就可以在这个框架中通过 IoC(Spring) 将 DAO(Hibernate) 传给 Action(Struts) 了,编写代码会方便不少。