Spring3+Hibernate3+Struts1流程总结

SSH结束之后,NOVA团队就基于SSH实现了NOVA音乐视频网站,通过在这里进行说明一下全程的开发流程,也许是上学期就应该进行总结的,
但是上学期一直没有一直没有完善与Ajax的结合.现在实现了.也保存一下自己对SSH架设的基本思想.对后面有警示的作用!
建议先懂Struts,hibernate,Spring的基础后看此帖子有效!
1.主要说明SSH各部分的作用:
1>Struts,Struts总的来说就是两个字--"动作"
全程通过struts-config.xml进行配置动作,配置表单,配置动作以及转发:主要有ActionForm,Action的书写(Action我建议用Struts的DispathAction,后面在Spring的配置的时候大大减少配置量)和struts-config.xml的配置!
2>hibernate,hibernate总的来说就是三个字--"持久层"
主要负责持久层:通过hibernate.cfg.xml配置数据库的连接,配置javabean的数据库映射xml文件,书写持久层,这里的持久层Manager,通过spring注入的DAO数据库的实现完成一些方法,其中hibernate 的DAO要通过Spring提供的HibernateDaoSupport类,进行方法的实现与数据库的增删改,更新等操作.
3>spring,spring总的来说就是两个字--"管理",管理整个流程,
对事务的管理,对hibernate的管理(创建数据库的连接),对Struts的管理(管理Struts全部的动作),管理hibernate的Manager和Dao(主要是对Manager中的dao进行对象的注入).

2.主要的配置和代码:
1>.总的配置web.xml
web.xml是J2EE web方向的心脏,配置如下:

<web-app>
    <!--配置struts-->
    <servlet>
        <servlet-name>action</servlet-name>
        <servlet-class>org.apache.struts.action.ActionServlet</servlet-class>
        <init-param>
            <param-name>config</param-name>
            <param-value>/WEB-INF/struts-config.xml</param-value>
        </init-param>
        <init-param>
            <param-name>debug</param-name>
            <param-value>3</param-value>
        </init-param>
        <init-param>
            <param-name>detail</param-name>
            <param-value>3</param-value>
        </init-param>
        <load-on-startup>0</load-on-startup>
    </servlet>
    <servlet-mapping>
        <servlet-name>action</servlet-name>
        <url-pattern>*.do</url-pattern>
    </servlet-mapping>

    <!-- 配置spring -->
    <context-param>
        <param-name>contextConfigLocation</param-name>
        <param-value>classpath*:applicationContext-*.xml</param-value>
        <!--这里有三个spring的配置文件applicationContext-actions,applicationContext-beans,applicationContext-commons-->
    </context-param>
    <listener>
        <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
    </listener>
    <!-- 这是Spring中的一个编码过滤器-->
    <filter>
        <filter-name>Spring character encoding filter</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>Spring character encoding filter</filter-name>
        <url-pattern>/*</url-pattern>
    </filter-mapping>

    <!-- 这个过滤器是用在一个页面请求时,打来Session,生成完页面生关闭Session,这样就可以解决laze -->
    <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>/*</url-pattern>
    </filter-mapping>
    <!--spring来对hibernate的应用-->
</web-app>

 web.xml主要配置基本的动作转发交给struts-config.xml,Spring的监听器listener:org.springframework.web.filter.CharacterEncodingFilter
,乱码的处理UTF-8,和hibernate的小配置org.springframework.orm.hibernate3.support.OpenSessionInViewFilter.

2>Struts的配置:
Struts-config配置(主要介绍Action的配置,这里的Action为DispathAction)
   

<action-mappings>
        <!--这个进行User的全部操作,一般为这种款式的链接/User.do?Action=login-->
        <action path="/User"
            type="org.springframework.web.struts.DelegatingActionProxy"
            name="UserActionForm"
            parameter="Action"
            scope="request"
            validate="false">
            <!-- 登陆转发页面 -->
            <forward name="Login_Success" path="/user/ShowMessage.jsp"/>
            <forward name="Login_Failed" path="/login_f.jsp" />
        </action>

 Action 由 操作业务层要用到Spring的注入(构造/设置)的Manager,我代码:

XXXAction extemds DispathAction{
private VideoManager videoManager;
//设置注入
public void setVideoManager(VideoManager videoManager) {
        this.videoManager = videoManager;
    }

//后面就可以直接用videoManager去操作业务层了,

}

 //这里为什么能注入videoManager,是因为这里的XXXAction由Spring管理,而Struts的Action只是通过org.springframework.web.struts.DelegatingActionProxy让Spring来管理,当产生这个动作,Spring就set注入videoManager到XXXAction的类中.所以这里videoManager有值!!!
3>hibernate的配置
主要的hibernate.cfg.xml和javabean的映射,DAO的书写问题
hibernate.cfg.xml和javabean的映射没有什么变化(单用hibernate的经验就ok),主要是DAO的实现问题:
这里可以用Spring提供的类HibernateDaoSupport,很好很强大,这样就不必担心事务(Spring会自动处理),而只是写简短的代码,简化操作,这又体现Spring的管理!!!
简短代码展示:

XXXDAOImp extends HibernateDaoSupport implements XXXDAO {
public void AddMusic(MusicTO music) throws Exception {
        getHibernateTemplate().save(music);
    }

//这就是添加音乐的代码

}

 这里的XXXDAOImp也要纳入到Spring的管理之中(见后面的Spring配置,主要对Manager里面的DAO进行注入)

4>Spring的配置
a.applicationContext-actions.xml主要对Struts的动作进行配置(管理全部的Struts动作)

    <!-- 对user的全部的Action进行处理,这里用到了DispatchAction,链接形如:NovaMedia/User.do?Action=Login-->
    <bean name="/User" class="greatwqs.struts.action.UserAction">
        <property name="userManager" ref="userManager"></property>
        <property name="musicManager" ref="musicManager"></property>
    </bean>

 b.applicationContext-beans.xml

主要对hibernate里面的DAO和Manager进行全部的配置(管理hibernate)
   

<!-- GREATWQS说明:这个只是配置一切的DAO和Manager的配置和联系 -->
    <bean id="adminDAO" class="greatwqs.hibernate.dao.imp.AdminDAOImp">
        <property name="sessionFactory" ref="sessionFactory"></property>    </bean>
    <bean id="adminManager" class="greatwqs.spring.service.imp.AdminManagerImp">
        <property name="adminDAO" ref="adminDAO"/>
    </bean>
    <!--配置管理员的DAO和Manager完毕-->

 c.applicationContext-commons.xml主要配置(Spring的基本配置)

<beans>
    <!--GREATWQS说明:这个配置文件是针对spring的常用的功能进行的配置:sessionFactory,事务,AOP等的配置-->
    <!-- 配置SessionFactory -->
    <bean id="sessionFactory" class="org.springframework.orm.hibernate3.LocalSessionFactoryBean">
        <property name="configLocation">
            <value>classpath:hibernate.cfg.xml</value>
        </property>
    </bean>

<!-- 配置事务管理 -->
    <bean id="TxManager" class="org.springframework.orm.hibernate3.HibernateTransactionManager">
        <property name="sessionFactory" ref="sessionFactory"></property>
    </bean>

<!-- 配置事务的传播性 -->
    <tx:advice id="txAdvice" transaction-manager="TxManager">
        <tx:attributes>
            <!--propagation="REQUIRED"有事务则直接用,无事务则直接开启-->
            <tx:method name="Add*" propagation="REQUIRED"/>
            <tx:method name="Delete*" propagation="REQUIRED"/>
            <tx:method name="Modify*" propagation="REQUIRED"/>
            <tx:method name="*" read-only="true"/>
        </tx:attributes>
    </tx:advice>

<!-- 配置那些类的那些方法参与事务 -->
    <aop:config>
        <aop:pointcut id="pointcut" expression="execution(* greatwqs.hibernate.dao.imp.*.*(..))"/>
        <aop:advisor advice-ref="txAdvice" pointcut-ref="pointcut"/>
        <!--这里进行应用上面的配置属性,失误的传播属性等方案-->
    </aop:config>
</beans>

 
3.后面的Ajax思考:
原来写Ajax的代码都是new的对象,再去全部进行的数据库的操作,用了Spring就模糊了,对象不能new了,但是最后还是由Spring的全局管理给我了答案(既然动作都是由Spring管理,我的Ajax的传值也用动作再附加参数,再通过这个动作再进行Spring的注入获得数据库的连接,最后生成jsp的xml文件)成功的利用起了.



 
也给我一个启示:Spring的管理,管理全局
以前在网上查询的ssh架设,利用Ajax很多都用到了jquery,也很好很强大!!
SSH架构,在这里进行记录一下.没有事情的时候翻翻....

猜你喜欢

转载自greatwqs.iteye.com/blog/1044283