`
zhaohaolin
  • 浏览: 1016231 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

详解Spring Web MVC中的DispatcherServlet类

阅读更多

Spring 的Web MVC框架是围绕DispatcherServlet这个类设计的,DispatcherServlet是FrameworkServlet的子类,不仅完全与Spring的IoC容器紧密集成,而且允许开发人员充分利用Spring的每一种功能特性。

    在一个理想的MVC环境中,通信是单向的。但在实际应用中,当在一个 Web 应用程序中实现 MVC 时,Model、View 和 Controller 通常不会在单一的类中出现,而是被实现为紧密相关的对象群体。每一组对象执行一个特定的MVC 任务。Controller 可能由若干个类组成,它们被组合到一起,用于分析 HTTP或者WAP的 请求/响应并确定应用程序所需的动作。Model 几乎可以确定由多个类组成。而 View 在 Web 应用程序中通常是某种模板系统(例如JSP),而且也很可能由几个对象组成。在这种情况下,把应用程序流程控制集中在一个entry point是非常有意义是设计选择。集中化可以帮助客户了解一个复杂系统是如何运行的,而且它还提供了一个单独的入口,在那里可以插入全局代码,例如在 Spring框架中通过插入某些advice,以AOP的方式实现日志管理、安全认证等具有共性的功能。

    DispatcherServlet本质上便是采用了前端控制器(Front Controller,有关内容可参考http://www.microsoft.com/china/MSDN/library /architecture/patterns/esp/DesFrontController.mspx?mfr=true)这一设计模式对客户请求的 处理进行了封装,对客户端而言,只需面对单一的处理入口,其处理流程如下图所示:

详解Spring Web MVC中的DispatcherServlet类
 DispatcherServlet作为Front Controllers需要将控制委托给Controller,而Controller 模式才是 MVC Controller 的真正核心所在。Controller 的首要职责就是决定应用程序应该如何响应请求。
DispatcherServlet 继承了HttpServlet类,并需要在web.xml文件中声明。经由DispatcherServlet处理的客户端请求也必须在同一个 web.xml中定义URL映射,这是标准的Java EE Servlet配置方式,DispatcherServlet的声明与映射定义示例如下:
<web-app>
<servlet>
<servlet-name>exampleServlet</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<init-param>        
<param-name>contextConfigLocation</param-name>        
<param-value>/WEB-INF/exampleServlet-servlet.xml</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>exampleServlet</servlet-name>
<url-pattern>*.do</url-pattern>
</servlet-mapping>
</web- app> 在上述配置中,名为exampleServlet的DispatcherServlet将处理所以以.do结尾的HTTP请求,而对Controller 和View模板的指派,将在exampleServlet-servlet.xml文件中进行配置。这其中体现了Spring一直倡导的IoC思想。
在 Spring中,每个DispatcherServlet都有自己的WebApplicationContext,并继承了所有在根部 WebApplicationContext中所定义的bean,DispatcherServlet可以覆盖这些继承下来的bean,也可以定义特定 servlet实例自己专用的bean,下图很好地说明了Spring Web MVC框架中的context层次结构:
详解Spring Web MVC中的DispatcherServlet类
 以上面的DispatcherServlet配置文件为例,当exampleServlet被初始化之后,Spring将在指定的WEB-INF目录寻 找exampleServlet-servlet.xml文件,并创建由exampleServlet-servlet.xml定义的所有与MVC相关的 bean。这个配置文件的存放路径当然是可以根据实际需要修改的。 WebApplicationContext在ApplicationContext的基础上增加了对themes解析的支持,同时通过与 ServletContext的链接可以获知具体与哪个servlet相关联。在设计DispatcherServlet时,需亚明确地将 WebApplicationContext与ServletContext绑定在一起,通过RequestContextUtils类的静态方法,可以 在需要时查询WebApplicationContext。 为了处理客户端请求以及确定适当的表现视图,DispatcherServlet需要通过一些特殊的bean来完成。这些bean包含在Spring框架 中,并与其他bean一样在WebApplicationContext中进行配置, 就多数bean而言,Spring已经提供了足够有效的配置信息,通常不必再担心如何去配置它们。这些特殊的bean包括: 1.Controller,无疑这是最重要的一个bean,因为它就是MVC中的“C”。
2.Handler mappings,例如在处理由form提交的HTTP请求时常用的SimpleUrlHandlerMapping。这些bean需要在 controller与URL模板之间实现映射,为特定的URL指派特定的controller进行后续处理,典型的 SimpleUrlHandlerMapping映射配置如下: <bean id="exampleUrlMapping" class="org.springframework.web.servlet.handler.SimpleUrlHandlerMapping"> <property name="mappings">
<props>
        <prop key="/1.do">exampleController1</prop>
        <prop key="/2.do">exampleController2</prop>
        <prop key="/3.do">exampleController3</prop>
</props>
</property>
</bean>
所有的Spring MVC的Handler mapping都实现了org.springframework.web.servlet.HandlerMapping接口: BeanNameUrlHandlerMapping---通过控制器的类名映射到URL. 
SimpleUrlHandlerMapping---通过配置文件定义的属性将控制器映射到URL 
CommonsPathMapHandlerMapping---通过控制器源代码中放置的metadata将控制器映射到URL,示例如下:

<bean id="urlMapping" class="org.springframework.web.servlet.handler.metadata.CommonsPathMapHandlerMapping"/>
/**
*@@org.springframework.web.servlet.handler.commonsattributes.PathMap("/1.do")
*/
public class exampleController1 extends AbstractCommandController
{
//…
}
3.View resolvers,Spring提供了许多View接口的实现,真正做到了与视图层的具体实现无关,视图解析器将视图的名字与实际的视图对应起来。在使用时,需要在配置文件中进行定义,例如:
<bean id="exampleViewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<property name="viewClass">
<value>org.springframework.web.servlet.view.InternalResourceView</value>
</property>
<property name="prefix">
<value>/WEB-INF/jsp/</value>
</property>
<property name="suffix">
<value>.jsp</value>
</property>
</bean>
 4.Locale resolver,这些解析器为需要国际化的视图提供支持
5.Theme resolver,用于解析应用程序可能使用到的主题,以便提供个性化的布局、界面。
6.Multipart file resolver,这个bean专用于处理由HTML页面上传文件请求。
7.Handler exception resolver,顾名思义,这些bean用于将异常信息与视图映射起来,或者实现其他更复杂的异常处理代码。

当一个DispatcherServlet配置完毕,处于工作状态时,它对一个客户端请求的处理过程需要经过如下流程,这在程序设计时需要认真考虑:
1. 搜索到WebApplicationContext,并将其绑定为客户请求的一个属性,以便controller或其他对象可以在处理过程中使用。缺省 地,这将由DispatcherServlet.WEB_APPLICATION_CONTEXT_ATTRIBUTE属性绑定。

2. 将Locale resolver与此客户请求绑定,以便其他对象在处理请求时能够解析相应的国际化特性。当然,即便不使用Locale resolver也关系不大,毕竟很多时候是不需要国际化的。
3. 将Theme resolver与此客户请求绑定,以便视图类确定就是哪个主题。Theme resolver也是一个可选的解析器,若不需要,完全可以不用。
4. 若指定了一个Multipart resolver,则此客户请求将被封装在MultipartHttpServletRequest类。
5. 搜索一个合适的handler。若找到,则执行相应的代码序列(预处理,后处理,和控制器),从而准备获取一个可能发往视图的model。

6. 若返回了一个model,则需要调用一个视图。若没有model返回(比如处于安全考虑),则不需调用视图,而此时,客户请求也已得到响应。

最后需要说明的是,开发人员可以在web.xml定义若干DispatcherServlet的初始化参数,例如 contextConfigLocation。contextConfigLocation用于指定Spring配置文件的位置,在上面的例子我们已经看 到这样的定义:

<init-param>      
<param-name>contextConfigLocation</param-name>      
<param-value>/WEB-INF/exampleServlet-servlet.xml</param-value>
</init-param>

如果有多个配置文件,则可以用逗号分隔开来,例如:
<init-param>      
<param-name>contextConfigLocation</param-name>      

<param-value>/WEB-INF/example1Servlet-servlet.xml,/WEB-INF/example2Servlet-servlet.xml</param-value>

分享到:
评论

相关推荐

    深入浅出学Spring_Web_MVC

    Spring Web MVC 是一个功能强大且灵活的Web框架,它不仅能够帮助开发者构建高质量的Web应用程序,还能够与其他Spring生态系统中的组件无缝集成。通过本教程的学习,你可以系统地掌握Spring Web MVC的核心知识和技术...

    spring MVC配置详解

    Spring MVC 配置详解 Spring MVC 是一个基于 DispatcherServlet 的 MVC 框架,它是当前主流的 Web 框架之一。要想灵活运用 Spring MVC 来应对大多数的 Web 开发,就必须要掌握它的配置及原理。 一、Spring MVC ...

    Spring web MVC和spring 2.0 form tag解说

    **Spring Web MVC与Spring 2.0 Form Tag详解** 在Web开发领域,Spring Web MVC作为一款强大的MVC框架,被广泛应用于构建企业级的Web应用。它提供了模型(model)、视图(view)和控制器(controller)的分离,使得开发者...

    精通Spring_Web_MVC优秀框架.pdf

    - **注解式控制器开发详解**:Spring Web MVC支持注解式的开发方式,通过`@Controller`、`@RequestMapping`等注解简化控制器的编写。了解如何定义控制器类、处理请求映射、REST风格的支持等。 - **数据类型转换**:...

    详解Spring mvc的web.xml配置说明

    下面我们将详细探讨`web.xml`中涉及Spring MVC的主要配置项。 1. **监听器(Listener)** `web.xml`中的监听器允许我们在特定事件发生时执行代码,例如应用程序启动或关闭。在Spring MVC中,`org.springframework....

    spring3.0MVC中文教材

    Spring 3.0 MVC的核心组件是`DispatcherServlet`,需要在`web.xml`中进行配置: ```xml &lt;web-app&gt; &lt;servlet-name&gt;example &lt;servlet-class&gt;org.springframework.web.servlet.DispatcherServlet ...

    毕设 外文文献翻译--Spring的web-MVC-构架模式

    ### Spring的Web MVC架构模式详解 #### 一、Spring架构简介及特点 Spring是一个轻量级的开源Java应用框架,最初由Rod Johnson创建,并由Juergen Hoeller等人继续开发和完善。Spring框架的设计目的是简化企业级应用...

    Spring Framework Reference 4.1.x Web MVC部分 pdf

    ### Spring Framework 4.1.x Web MVC框架知识点详解 #### 一、Spring Web MVC框架概述 **Spring Web MVC**框架是Spring框架中的一个重要组成部分,它主要用于处理基于HTTP协议的请求,构建灵活且易于扩展的Web应用...

    外文翻译Spring的MVC构架模式-CSDN下载

    **Spring MVC架构模式详解** Spring MVC是Spring框架中的一个核心组件,主要用于构建Web应用程序的模型-视图-控制器(Model-View-Controller)架构。它为开发者提供了灵活且强大的工具来处理HTTP请求、数据绑定、...

    spring-webmvc-tiles2.rar

    《Spring Web MVC与Tiles2整合详解》 Spring Web MVC是Spring框架的重要组成部分,它提供了一个用于构建Web应用程序的全面模型视图控制器(MVC)架构。而Tiles2是一个视图框架,它允许开发者将Web页面分解成可重用...

    Spring-MVC-DispatcherServlet-Example:Maven项目

    **Spring MVC DispatcherServlet详解** Spring MVC是Spring框架的一部分,它是一个用于构建Web应用程序的轻量级、模型-视图-控制器(MVC)框架。在本项目中,`Spring-MVC-DispatcherServlet-Example`是一个使用...

    spring mvc的配置文件详解

    在上述示例中,`dispatcherContext` 是 Servlet 的名称,而 `org.springframework.web.servlet.DispatcherServlet` 指定了 Servlet 类。`&lt;load-on-startup&gt;` 标签设置了 Servlet 在应用启动时的加载顺序,值为 1 ...

    Spring3 MVC 深入研究

    Spring3 MVC是Spring框架的重要组成部分,它是一个用于构建Web应用程序的轻量级、模型-视图-控制器(MVC)框架。本篇文章将深入探讨Spring3 MVC的核心概念、工作原理以及如何在实际项目中应用。 一、Spring3 MVC...

    springweb3.0MVC注解(附实例)

    ### Spring Web 3.0 MVC 注解详解及实例 #### 一、概述 Spring Web MVC 是 Spring Framework 的一部分,提供了一种强大而灵活的方式来构建基于 Web 的应用。随着 Spring 3.0 的发布,框架引入了一系列重要的改进,...

    spring-mvc-demo

    在 "spring-mvc-demo" 中,可能包含 `web.xml` 配置文件,用于部署 DispatcherServlet,以及一个或多个 Spring 配置文件,如 `servlet-context.xml`,用于配置 MVC 组件。此外,可能还会有 Java-based 配置,使用 `...

    Spring MVC之DispatcherServlet详解_动力节点Java学院整理

    `&lt;init-param&gt;`可以用来设置DispatcherServlet的初始化参数,如`contextConfigLocation`用于指定Spring MVC的配置文件位置,可以是类路径下的路径(如`classpath:spring-servlet-config.xml`),而不是默认的`/WEB-...

    Spring MVC框架实例

    - **Controller**: 处理业务逻辑,通常是一个实现了 `org.springframework.web.servlet.mvc.Controller` 或者 `org.springframework.web.bind.annotation.ControllerAdvice` 接口的类。 - **Model**: 表示应用程序的...

    SSM框架的配置搭建 spring、 spring mvc、 mybatis 整合详解

    SSM框架,即Spring、Spring MVC和MyBatis的整合,是Java开发中常见的Web应用框架,用于构建高效、灵活的后端服务。本教程将详细介绍如何配置和搭建这一框架,帮助开发者理解其核心概念和操作流程。 首先,我们要...

    Spring mvc 教程

    ### Spring MVC 教程知识点详解 #### Spring Web MVC 框架简介 Spring Web MVC 是 Spring Framework 的一个重要组成部分,主要用于构建基于 Java 的 Web 应用程序。它提供了一个灵活且强大的 MVC 实现,使得开发者...

    Spring+MVC+3.0.5+Spring+3.0.5+MyBatis3.0.4全注解实例详解

    在本教程中,我们将深入探讨如何使用Spring、Spring MVC 3.0.5以及MyBatis 3.0.4这三个流行的Java框架构建一个全注解的Web应用程序。这个实例详解将帮助开发者理解如何有效地集成这三个组件,实现高效的数据访问和...

Global site tag (gtag.js) - Google Analytics