浅谈springmvc的DispatcherServlet分析

 更新时间:2017年09月30日 10:32:38   作者:关注翡翠森林Z  
本篇文章主要介绍了浅谈springmvc的DispatcherServlet分析,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧

本文介绍了springmvc的DispatcherServlet,分享给大家,具体如下:

一、程序

(一)web.xml文件中的内容

  <!-- springMVC核心配置 -->
  <servlet>
    <servlet-name>springmvcServlet</servlet-name>
    <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
    <init-param>
      <param-name>contextConfigLocation</param-name>
      
<!--spingMVC的配置路径 -->
      <param-value>classpath:springmvc/spring-mvc.xml</param-value>
    </init-param>
    <load-on-startup>1</load-on-startup>
  </servlet>

  <servlet-mapping>
    <servlet-name>springmvcServlet</servlet-name>
    <url-pattern>*.html</url-pattern>
  </servlet-mapping>

(二)src/main/resource/springmvc/spring-mvc.xml中的内容

   <!-- 扫描controller(controller层注入) -->
   <context:component-scan base-package="com.z.controller"/> 
   
   <!-- 对模型视图添加前后缀 -->
   <bean id="viewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver"
   p:prefix="/WEB-INF/view/" p:suffix=".jsp"/>

(三)src/main/java/com/z/controller/IndexController.java中的内容

package com.z.controller;

import javax.servlet.http.HttpServletRequest;

import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.servlet.ModelAndView;

@Controller
public class IndexController {
  @RequestMapping("/index.html")
  public ModelAndView getIndex(HttpServletRequest request) throws Exception {
    ModelAndView mav = new ModelAndView("index");
    return mav;
  }
}

(四)src/main/webapp/WEB-INF/view/index.jsp

<%@ page language="java" import="java.util.*" pageEncoding="ISO-8859-1"%>
<%
String path = request.getContextPath();
String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
%>

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
 <head>
  <base href="<%=basePath%>" rel="external nofollow" >
  
  <title>My JSP 'index.jsp' starting page</title>

 </head>
 
 <body>
  This is my JSP page. <br>
 </body>
</html>

(五)运行结果:正常显示index.jsp中的内容

二、DispatchServlet流程

DispatcherServlet是前端控制器设计模式的实现,提供Spring Web MVC的集中访问点,而且负责职责的分派,而且与Spring IoC容器无缝集成,从而可以获得Spring的所有好处。
其主要职责如下:

1、文件上传解析,如果请求类型是multipart将通过MultipartResolver进行文件上传解析;
2、通过HandlerMapping,将请求映射到处理器(返回一个HandlerExecutionChain,它包括一个处理器、多个HandlerInterceptor拦截器);
3、通过HandlerAdapter支持多种类型的处理器(HandlerExecutionChain中的处理器);
4、通过ViewResolver解析逻辑视图名到具体视图实现;
5、本地化解析;
6、渲染具体的视图等;
7、如果执行过程中遇到异常将交给HandlerExceptionResolver来解析。

从以上我们可以看出DispatcherServlet主要负责流程的控制。

三、web.xml中servlet的执行顺序

  <servlet>
    <servlet-name>springmvcServlet</servlet-name>          (1)
    <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>    (2)
  </servlet>

  <servlet-mapping>
    <servlet-name>springmvcServlet</servlet-name>          (3)
    <url-pattern>*.html</url-pattern>                  (4)
  </servlet-mapping>

Tomcat服务器首先读取(4)中url-pattern,然后获取(3)中的servlet-name。再读取(1)中的servlet-name,最后查找(2)中的DispatcherServlet类。

所以,读取顺序为(4)-->(3)-->(1)-->(2)

注意,(3)中的servlet-name要和(1)中的servlet-name完全一样。

四、Sevlet的匹配方式和url-pattern的写法

Servlet的匹配顺序

1:精确(Exact)匹配,比如index.html
2:前缀(Prefix)匹配,比如/*
3:扩展名(Extension)匹配,比如*.html
4:默认(Default)匹配

这样的话,本程序中web.xml的url-pattern有三种写法:

(1)精确匹配

  <servlet-mapping>
    <servlet-name>springmvcServlet</servlet-name>          
    <url-pattern>index.html</url-pattern>                
  </servlet-mapping>

表示所有以index.html为结尾的请求可以匹配。比如:http://localhost:8080/项目名/index.html

这种方式有很大的局限性,比如有好多个html请求,比如index.html, login.html, abc.html等,就得添加很多个url-pattern。

(2)扩展名匹配

  <servlet-mapping>
    <servlet-name>springmvcServlet</servlet-name>          
    <url-pattern>*.html</url-pattern>                
  </servlet-mapping>

这种写法,可以匹配所有后缀名为html的请求

(3)默认匹配

  <servlet-mapping>
    <servlet-name>springmvcServlet</servlet-name>          
    <url-pattern>/</url-pattern>                
  </servlet-mapping>

注意,下面这种写法是错误的

  <servlet-mapping>
    <servlet-name>springmvcServlet</servlet-name>          
    <url-pattern>/*</url-pattern>                
  </servlet-mapping>

这是因为,找到的jsp文件会再次DispatcherServlet拦截。

以本文中的程序为例,通过controller中的/index.html找到的方法为getIndex(),返回的ModalAndView为/WEB-INF/view/index.jsp,再次被DispatcherServlet拦截后就会在controller中寻找/WEB-INF/view/index.jsp所对应的方法,这个方法是没有的,所以会报错。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持脚本之家。

相关文章

  • springboot多环境(dev、test、prod)配置详解

    springboot多环境(dev、test、prod)配置详解

    这篇文章主要介绍了springboot多环境(dev、test、prod)配置详解,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2019-04-04
  • SpringBoot整合Lettuce redis过程解析

    SpringBoot整合Lettuce redis过程解析

    这篇文章主要介绍了SpringBoot整合Lettuce redis过程解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2019-10-10
  • 在实践中了解Java反射机制应用

    在实践中了解Java反射机制应用

    当程序运行时,允许改变程序结构或变量类型,这种语言称为动态语言。我们认为java并不是动态语言,但是它却有一个非常突出的动态相关机制,俗称:反射。下面我们来简单学习一下吧
    2019-05-05
  • Java利用反射动态设置对象字段值的实现

    Java利用反射动态设置对象字段值的实现

    桥梁信息维护需要做到字段级别的权限控制,本文主要介绍了Java利用反射动态设置对象字段值的实现,具有一定的参考价值,感兴趣的可以了解一下
    2024-01-01
  • nacos中的配置使用@Value注解获取不到值的原因及解决方案

    nacos中的配置使用@Value注解获取不到值的原因及解决方案

    这篇文章主要介绍了nacos中的配置使用@Value注解获取不到值的原因分析,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2023-03-03
  • Java数据结构之AC自动机算法的实现

    Java数据结构之AC自动机算法的实现

    AC自动机算法常被认为是Trie树+KMP算法的结合体,它是一个多模式匹配算法,在模式匹配领域被广泛应用。本文将详细为大家介绍AC自动机的原理与实现方法,感兴趣的可以了解一下
    2022-12-12
  • SpringBoot中各种Controller的写法

    SpringBoot中各种Controller的写法

    这篇文章主要介绍了SpringBoot中各种Controller的写法,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2023-07-07
  • springboot集成redis实现简单秒杀系统

    springboot集成redis实现简单秒杀系统

    这篇文章主要为大家详细介绍了springboot集成redis实现简单秒杀系统,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2019-12-12
  • Java编程中避免equals方法的隐藏陷阱介绍

    Java编程中避免equals方法的隐藏陷阱介绍

    这篇文章主要介绍了Java编程中避免equals方法的隐藏陷阱介绍,具有一定参考价值,需要的朋友可以了解下。
    2017-11-11
  • Java设计模式之备忘录模式(Memento模式)介绍

    Java设计模式之备忘录模式(Memento模式)介绍

    这篇文章主要介绍了Java设计模式之备忘录模式(Memento模式)介绍,memento是一个保存另外一个对象内部状态拷贝的对象,这样以后就可以将该对象恢复到原先保存的状态,需要的朋友可以参考下
    2015-03-03

最新评论