從實際項目中淺談SSH框架中MVC分層思想的應用與優缺點(一)

         最近研究了一下SpringMVC框架感覺功能很強大,所以想把使用後的感想寫出來。本人也不算什麼牛人,所以寫的理論性不是很強,之前開發了一個基於SSH框架的室內環境監測系統的客戶端,說實話結構現在看起來有點亂,尤其是後期功能不斷添加之後,更是有點力不從心,在此,爲了給一些和我一樣在框架裏剛剛起步的同學們一點點鄙陋的建議,我把我當時的設計思想和現在一點點感悟寫出來,分享給大家。我將從兩部分來談一下我對於SSH框架中MVC分層思想的應用,首先在這一部分,我將把我之前應用SSH框架並採用 MVC分層思想設計的系統整體架構寫出來,有不合理的地方希望大家共同改進。

(一)項目文件佈局

        

         這個是我當時系統構建的第一個版本。

         項目搭建平臺:Resin3.0.21

         項目開發軟件:MyEclipse7.5

         整體架構符合MVC分層方式,分爲展現層,即WebRoot下面的js、jsp等等,和後臺部分,即業務邏輯層和持久層。

         業務邏輯層(Actions)採用Structs ActionServlet來處理,持久層(persistence)採用工廠模式進行設計。其中model相當於vo,manager包裏面包含dao接口和實現類。目前看來,當時的業務邏輯層的forms完全沒有什麼用,有點繁瑣,個人認爲Structs的action完全可以用servlet來代替,所以目前看來structs的mvc結構用着不是很爽

(二)MVC分層思想在SSH框架中的體現

          

        

          通過以上兩幅圖的結合,多餘的文字我就不過多贅述,希望可以給他家帶來一個清晰直觀的認識。

         

         下面一步步逐層講解一下我開始的設計思路,首先先理解一下web.xml設計。

         首先註明一下web.xml的加載順序:web.xml 的加載順序是:ServletContext-> context-param ->listener -> filter -> servlet。首先在容器啓動時,服務器會創建一個ServletContext,然後創建context-param,用於向 ServletContext提供鍵值對,即應用程序上下文信息。然後是listener、filter,最後是servlet,servlet執行是有順序的,即<load-on-startup>

          PS:以上只是沒看懂的請看http://blog.csdn.net/hongshan50/article/details/7335443

        

附本次項目我的web.xml文件:

<?xmlversion="1.0"encoding="UTF-8"?>

<web-appxmlns="http://java.sun.com/xml/ns/j2ee"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"version="2.5"xsi:schemaLocation="http://java.sun.com/xml/ns/javaee  http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd">

<!—加載Structs-->

<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>2</param-value>

  </init-param>

  <init-param>

    <param-name>detail</param-name>

    <param-value>2</param-value>

  </init-param>

  <load-on-startup>2</load-on-startup>

</servlet>

<!—Structs映射 -->

<servlet-mapping>

  <servlet-name>action</servlet-name>

  <url-pattern>*.do</url-pattern>

</servlet-mapping>

<!—Spring配置詳解-->

<!—context-param是全局的,一旦配置在servletcontext中都可以得到下面的參數,比如contextConfigLocation,這個名字是固定的,Spring通過這個參數可以加載下面的文件生成beanfactory,且只初始化一次-->

<context-param>

 <param-name>contextConfigLocation</param-name>

<param-value>classpath:applicationContext-actions.xml,

classpath:applicationContext-beans.xml,

classpath:applicationContext-common.xml</param-value>

</context-param>

<!-- listener負責讀取我們context-param的配置文件-->

<listener>

<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>

</listener>

<!—解決SpringHibernate的解碼問題-->

<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>GBK</param-value>

  </init-param>

</filter>

<filter-mapping>

  <filter-name>Spring character encoding filter</filter-name>

  <url-pattern>/*</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>/*</url-pattern>

</filter-mapping>

</web-app>

下面分別列舉一下我的structs-config.xmlHibernate.cfg.xmlApplicationContext-*.xml文件中的一些主要代碼:

(1)     Hibernate.cfg.xml

<!DOCTYPEhibernate-configuration PUBLIC

    "-//Hibernate/Hibernate Configuration DTD 3.0//EN"

    "http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd">

 

<hibernate-configuration>

<session-factory>

<property name="connection.url">jdbc:oracle:thin:@localhost:1521:orcl</property>

<property name="connection.driver_class">oracle.jdbc.driver.OracleDriver</property>

<property name="connection.username">SRMS</property>

<property name="connection.password">srms</property>

<property name="dialect">org.hibernate.dialect.OracleDialect</property>

<property name="hibernate.show_sql">false</property>

<property name="cache.use_second_level_cache">false</property>

<property name="jdbc.batch_size">50</property>

<property name="current_session_context_class">thread</property>

<property name="hibernate.query.factory_class">

org.hibernate.hql.classic.ClassicQueryTranslatorFactory

</property>

<mapping resource="com/env/persistence/model/User.hbm.xml"/>

</session-factory>

</hibernate-configuration>

(2)     structs-config.xml

<?xmlversion="1.0"encoding="ISO-8859-1"?>

<!DOCTYPEstruts-config PUBLIC

          "-//Apache Software Foundation//DTD Struts Configuration 1.2//EN"

          "http://jakarta.apache.org/struts/dtds/struts-config_1_2.dtd">

<struts-config>

<form-beans>

    <form-beanname="userForm"type="com.env.business.forms.UserForm"/>

</form-beans>

 <action-mappings>

<!—直接跳轉-->

<actionpath="/login"forward="/WEB-INF/jsp/login.jsp"></action>

<!—通過Spring注入跳轉-->

<actionpath="/usermanager"

        name="userForm"

        type="org.springframework.web.struts.DelegatingActionProxy"

        parameter="command"

        >

        <forwardname="add"path="/WEB-INF/jsp/center/usermanager/add.jsp"/>

        <forwardname="success"path="/WEB-INF/jsp/center/usermanager/main.jsp"/>

        <forwardname="modify"path="/WEB-INF/jsp/center/usermanager/modify.jsp"/>

</action> 

</action-mappings>

</struts-config>

(3)     Spring配置文件我分成三個文件,分別是

applicationContext-actions.xml,applicationContext-beans.xml,applicationContext-common.xml

文件頭,即命名空間都是一樣的,如下:

<?xmlversion="1.0"encoding="UTF-8"?>

<beansxmlns="http://www.springframework.org/schema/beans"

         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"

         xmlns:aop="http://www.springframework.org/schema/aop"

         xmlns:tx="http://www.springframework.org/schema/tx"

         xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.0.xsd

           http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-2.0.xsd

           http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-2.0.xsd">

其中applicationContext-beans.xml

<beanid="userManager"class="com.env.persistence.manager.UserManagerImpl">

    <propertyname="sessionFactory"ref="sessionFactory"/>

</bean>

其中applicationContext-actions.xml

<beanname="/usermanager"class="com.env.business.actions.UserManagerAction">

    <propertyname="userManager"ref="userManager"/>

</bean>

比較主要的是applicationContext-common.xml

<!-- 配置sessionFactory -->

<beanid="sessionFactory"class="org.springframework.orm.hibernate3.LocalSessionFactoryBean">

    <propertyname="configLocation">

        <value>classpath:hibernate.cfg.xml</value>

    </property>

</bean>          

<!-- Hibernate配置事務管理器-->

<beanid="transactionManager"class="org.springframework.orm.hibernate3.HibernateTransactionManager">

    <propertyname="sessionFactory">

        <refbean="sessionFactory"/>

    </property>

    <propertyname="dataSource"ref="dataSource"/> 

</bean>

<!-- JDBC配置事務管理器 

<bean id="transactionManager"

 class="org.springframework.jdbc.datasource.DataSourceTransactionManager"> 

      <property name="dataSource"ref="dataSource"/> 

</bean>  

 -->

<!-- 配置事務的傳播特性 -->

<tx:adviceid="txAdvice"transaction-manager="transactionManager">

    <tx:attributes>

        <tx:methodname="add*"propagation="REQUIRED"/>

        <tx:methodname="del*"propagation="REQUIRED"/>

        <tx:methodname="find*"read-only="true"/>

        <tx:methodname="modify*"propagation="REQUIRED"/>

    </tx:attributes>

    </tx:advice>

<!--那些類的哪些方法參與事務 -->

<aop:config>

    <aop:pointcutid="allManagerMethod"expression="execution(* com.env.persistence.manager.*.*(..))"/>

    <aop:advisorpointcut-ref="allManagerMethod"advice-ref="txAdvice"/>

</aop:config>

<!-- 以下配置的是對JDBC的支持 -->

<beanid="dataSource"class="org.apache.commons.dbcp.BasicDataSource">

   <propertyname="driverClassName">

      <value>oracle.jdbc.driver.OracleDriver</value>

    </property>

    <propertyname="url">

      <value>jdbc:oracle:thin:@localhost:1521:orcl</value>

    </property>

    <propertyname="username">

      <value>SRMS</value>

    </property>

    <propertyname="password">  

      <value>SRMS</value>

    </property>

    <propertyname="defaultAutoCommit">

      <value>false</value>

    </property>

  </bean>

</beans>

(未完待續)

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章