• 从实际项目中浅谈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>

    (未完待续)

     

  • 相关阅读:
    【Teradata】DSA服务器tdactivemq重启清理消息队列步骤
    什么是5G
    【时序数据库】十分钟系列
    16_Android的数据存储_ SharedPreference、XML和JSON
    15_Android文件读写操作
    14_TTS
    13_拍照、录像和音频
    12_Sensor简单实例
    11_SurfaceView绘图
    10_多点触摸交互处理
  • 原文地址:https://www.cnblogs.com/hainange/p/6153643.html
Copyright © 2020-2023  润新知