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

SpringMVC的原理:


关于上图的一个说明:
1、首先,Http请求:将客户端请求提交到DispatcherServlet这个Servlet。
2、然后,找到处理器:由DispatcherServlet控制器查询出一个或多个HandlerMapping,并且找到处理请求的Controller(控制器类)。
3、然后,调用处理器:DispatcherServlet将请求提交到Controller(控制器类)。
4、5、然后,调用业务处理和返回结果:Controller调用业务逻辑处理后,返回了ModelAndView。
6、7、然后,处理视图映射并返回模型: DispatcherServlet查询到一个或多个ViewResoler视图解析器后,找到ModelAndView指定的视图(页面)。
8、最后,就是Http响应了:视图负责将结果显示到客户端页面上。

StringMVC中重用的几个bean,如下图所示:


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

1.Struts与Servlet对比

2.J2EE学习笔记

3.JSTL和EL表达式

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

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




  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值