浅谈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所对应的方法,这个方法是没有的,所以会报错。

以上是 浅谈springmvc的DispatcherServlet分析 的全部内容, 来源链接: utcz.com/p/215754.html

回到顶部