本文介绍了springmvc的DispatcherServlet,分享给大家,具体如下:
一、程序
(一)web.xml文件中的内容
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
|
<!-- 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中的内容
1
2
3
4
5
6
|
<!-- 扫描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中的内容
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
|
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
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
|
<%@ 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的执行顺序
1
2
3
4
5
6
7
8
9
|
< 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)精确匹配
1
2
3
4
|
< 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)扩展名匹配
1
2
3
4
|
< servlet-mapping > < servlet-name >springmvcServlet</ servlet-name > < url-pattern >*.html</ url-pattern > </ servlet-mapping > |
这种写法,可以匹配所有后缀名为html的请求
(3)默认匹配
1
2
3
4
|
< servlet-mapping > < servlet-name >springmvcServlet</ servlet-name > < url-pattern >/</ url-pattern > </ servlet-mapping > |
注意,下面这种写法是错误的
1
2
3
4
|
< 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所对应的方法,这个方法是没有的,所以会报错。
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持服务器之家。
原文链接:http://www.jianshu.com/p/a99846ce2fab?utm_source=tuicool&utm_medium=referral