struts与spring mvc

当今比较流行的Java Web开发开源框架:

  • 关注数据流程的MVC框架 Struts1/2, WebWork, Spring MVC……)
  • 关注数据关系的容器框架 Spring, GUICE……)
  • 关注数据操作的持久层框架(HibernateIBatis……)

当前主流的两种MVC框架Struts 2和Spring MVC,两者在web.xml的配置如下:

<!---------文件名: Struts 2  web.xml------------->
<?xml version="1.0" encoding="GB2312"?>
<web-app xmlns=http://java.sun.com/xml/ns/j2ee
xmlns:xsi=http://www.w3.org/2001/XMLSchema-instance version="2.4"
xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee
http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd">
  <filter>
    <!--过滤器名字  -->
    <filter-name>struts2</filter-name>
    <!-- 过滤器支持的struts2类  -->
    <filter-class>org.apache.struts2.dispatcher.FilterDispatcher</filter-class>
  </filter>
 
  <filter-mapping>
    <!--过滤器拦截名字  -->
    <filter-name>struts2</filter-name>
    <!--过滤器拦截文件路径名字  -->
    <url-pattern>/*</url-pattern>
  </filter-mapping>
    <welcome-file-list>
      <welcome-file>index.jsp</welcome-file>
    </welcome-file-list>
</web-app>
<!---------文件名: springMVC  web.xml------------->
<?xml version="1.0" encoding="UTF-8"?>
<web-app version="2.5" xmlns="http://java.sun.com/xml/ns/javaee"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://java.sun.com/xml/ns/javaee
    http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd">
    <display-name>Lrtech_framework</display-name>
    <servlet>
        <servlet-name>springMVC</servlet-name>
        <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
        <init-param>
            <param-name>contextConfigLocation</param-name>
            <param-value>classpath*:conf/springdemo-servlet.xml</param-value>
        </init-param>
        <load-on-startup>1</load-on-startup>
    </servlet>
    <servlet-mapping>
        <servlet-name>springMVC</servlet-name>
        <url-pattern>/</url-pattern>
    </servlet-mapping>
</web-app>
 
 

虽然两者都是mvc流程控制框架,但从他们两者在web.xml的配置,我们可以发现两者的一个不同:Struts 2是通过过滤器来实现url路径跟action的映射等控制流转功能,而spring mvc则是通过传统的servlet来实现的。一个请求在Struts2框架中的处理大概分为以下几个步骤:

    1、客户端初始化一个指向Servlet容器(例如Tomcat)的请求

    2、这个请求经过一系列的过滤器(Filter)(这些过滤器中有一个叫做ActionContextCleanUp的可选过滤器,这个过滤器对于Struts2和其他框架的集成很有帮助,例如:SiteMesh Plugin) 

    3、接着FilterDispatcher被调用,FilterDispatcher询问ActionMapper来决定这个请是否需要调用某个Action,FilterDispatcher是控制器的核心,就是mvc中c控制层的核心。

一个请求在spring mvc框架中的处理大概分为以下几个步骤:

1. 客户端请求提交到DispatcherServlet

2. 由DispatcherServlet控制器查询一个或多个HandlerMapping,找到处理请求的Controller

3. DispatcherServlet将请求提交到Controller

4. Controller调用业务逻辑处理后,返回ModelAndView

5. DispatcherServlet查询一个或多个ViewResoler视图解析器,找到ModelAndView指定的视图

6. 视图负责将结果显示到客户端

DispatcherServlet是整个Spring MVC的核心。它负责接收HTTP请求组织协调Spring MVC的各个组成部分。其主要工作有以下三项:

       1. 截获符合特定格式的URL请求。
       2. 初始化DispatcherServlet上下文对应的WebApplicationContext,并将其与业务层、持久化层的     WebApplicationContext建立关联。
       3. 初始化Spring MVC的各个组成组件,并装配到DispatcherServlet中。



        在不使用Struts或者SpringMVC等web层框架时,一直是由Servlet完成业务逻辑的实现,但是,随着Servlet的增多,web.xml的配置会不断的膨胀,从而变得难以维护。针对这一问题,web框架提出的方案是:提炼一个核心的Servlet覆盖对所有http请求的处理。Spring MVC中是DispatcherServlet,Struts2是一个FilterDispatcher。 这样,web.xml中只需要对核心控制器进行配置就可以了,代码变得简洁且固定了。

  提炼出了核心控制器,还需要考虑后面的事情,就是怎样将不同的http请求分发到不同的action/controller对象上去进行业务处理,怎样将对应的处理结果返回到客户端。这一系列的逻辑流程由谁控制,又由谁负责具体实现,这些实现又如何关联到一起?

      我们使用框架就是为了不再自己控制这些公共的问题,而将更多的精力放在业务的处理上,那么,这些事情自然是由框架来完成了。

      以SpringMVC为例,核心控制器DispatcherServlet将从http请求开始到输出返回结果这期间的每一个处理步骤分派到不同的组件中进行处理,HandlerMaping负责将一个url指定到一个对应的controller上,HandlerMapping负责指定执行 controller中的哪个方法,ViewResolver根据controller中返回的viewName,结合配置文件信息,创建出合适类型的 view对象,而DispatcherServlet这个类本身负责初始化需要的组件以及对组件方法的调用。可以理解为核心控制器规范处理流程,各个组件实现处理流程。

      Struts和SpringMVC框架还给我们提供了收集表单数据,完成数据类型转换,表单验证、异常处理等功能,这这细节也为开发人员提供了很大的便利。


总结与摘抄部分structs的好文章

1.Struts与Servlet对比 http://blog.csdn.net/conanswp/article/details/12853525

2.J2EE学习笔记 http://blog.csdn.net/conanswp/article/details/37834089

3.iBatis简单入门 http://www.cnblogs.com/ycxyyzw/archive/2012/10/13/2722567.html

4.JavaScript事件总结 http://www.cnblogs.com/tugenhua0707/p/4501843.html

5.JSTL和EL表达式http://blog.csdn.net/u010096526/article/details/50038365

6.MVC三层架构在各框架中的特征

7.Spring 并发访问的线程安全性问题(文章以线程安全的角度分析了两者的区别)




你可能感兴趣的:(spring,struts)