快速搭建 S2SH 指南

来源:互联网 发布:小米网络助手 编辑:程序博客网 时间:2024/05/18 05:19

本文适用于那些知道如何搭建 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) 了,编写代码会方便不少。

原创粉丝点击