转载自https://blog.csdn.net/xinluke/article/details/51449594

映射请求到Servlet

                        |-- Context Path --|-- Servlet Path -|--Path Info--|
http://www.myserver.com /mywebapp /helloServlet /hello
|-------- Request URI ----------------------------|

引导servlet服务请求的请求路径由许多重要部分组成。以下元素从请求URI路径得到,并通过request对象公开: 
- Context Path:与ServletContext相关联的路径前缀是这个servlet的一部分。如果这个上下文是基于Web服务器的URL命名空间基础上的“默认”上下文,那么这个路径将是一个空字符串。否则,如果上下文不是基于服务器的命名空间,那么这个路径以/字符开始,但不以/字符结束。 
- Servlet Path:路径部分直接与激活请求的映射对应。这个路径以“/”字符开头,如果请求与“/ *”或“”模式匹配,在这种情况下,它是一个空字符串。 
- PathInfo:请求路径的一部分,不属于Context Path或Servlet Path。如果没有额外的路径,它要么是null,要么是以’/’开头的字符串。 
使用HttpServletRequest接口中的下面方法来访问这些信息: 
- getContextPath 
- getServletPath 
- getPathInfo 
重要的是要注意,除了请求URI和路径部分的URL编码差异外,下面的等式永远为真: 
requestURI = contextPath + servletPath + pathInfo

在web.xml中设置下述的Servlet映射规则

Context Path /catalog Servlet
Servlet Mapping Pattern: /lawn/* LawnServlet
Servlet Mapping Pattern: /garden/* GardenServlet
Servlet Mapping Pattern: *.jsp JSPServlet

得到的结果为

请求路径 ContextPath ServletPath PathInfo
/catalog/lawn/index.html /catalog /lawn /index.html
/catalog/garden/implements/ /catalog /garden /implements/
/catalog/help/feedback.jsp /catalog /help/feedback.jsp null

servlet容器的url-pattern映射规范

在web应用部署描述符中,以下语法用于定义映射: 
- 以‘/’字符开始、以‘/*’后缀结尾的字符串用于路径匹配。 
- 以‘*.’开始的字符串用于扩展名映射。 
- 只包含“/”字符的字符串用于default servlet映射。 
- 其他字符串仅用于精确匹配。

如果一个url-pattern设定的映射即属于路径映射,也属于扩展映射(如:/*.action),导致容器无法判断,那么部署将报错。

default Servlet(缺省Servlet)详解

  • web.xml中如果某个Servlet的映射路径仅仅为一个正斜杠(/),那么这个Servlet就成为当前Web应用程序的缺省Servlet。
  • 凡是在web.xml文件中找不到匹配的<servlet-mapping>元素的URL,它们的访问请求都将交给缺省Servlet处理,也就是说,缺省Servlet用于处理所有其他Servlet都不处理的访问请求。
  • 如果在web.xml中未设置一个default Servlet的时候,容器会设置一个容器自带的Servlet。

    • tomcat容器中会默认注册了一个名称为org.apache.catalina.servlets.DefaultServlet的Servlet
    • 当访问Tomcat服务器中的某个静态HTML文件和图片时,实际上是在访问这个缺省Servlet,由DefaultServlet类寻找,当寻找到了请求的html或图片时,则返回资源,如果没有寻找到则报出404错误。

servlet容器对url的匹配过程

在收到客户端请求时,web容器确定转发到哪一个Web应用。选择的Web应用必须具有最长的上下文路径匹配请求URL的开始。当映射到Servlet时,URL匹配的一部分是上下文。 
Web容器接下来必须用下面描述的路径匹配步骤找出servlet来处理请求。 
用于映射到Servlet的路径是请求对象的请求URL减去上下文和路径参数部分。下面的URL路径映射规则按顺序使用。使用第一个匹配成功的且不会进一步尝试匹配: 
- 容器将尝试找到一个请求路径到servlet路径的精确路径匹配。成功匹配则选择该servlet。 
- 容器将递归地尝试最长路径匹配。这是通过一次一个目录的遍历路径树完成的,使用‘/’字符作为路径分隔符。最长匹配确定选择的servlet。 
- 如果URL最后一部分包含一个扩展名(如 .jsp),servlet容器尝试扩展匹配,将视图匹配为扩展名处理请求的Servlet。扩展名定义在最后一部分的最后一个‘.’字符之后。 
- 如果前三个规则都没有产生一个servlet匹配,容器将试图为请求资源提供相关的内容。如果应用中定义了一个“default”servlet,它将被使用。许多容器提供了一种隐式的default servlet用于提供内容。 
容器使用区分大小写字符串比较匹配。

示例映射集合

Path Pattern Servlet 匹配模式
/foo/bar/* servlet1 最长路径匹配
/baz/* servlet2 最长路径匹配
/catalog servlet3 精确路径匹配
*.bop servlet4 扩展匹配

注意,精确路径匹配是全字符串匹配,最长路径匹配是带正则表达式的字符串匹配。 
将产生以下结果:

Incoming Path Servlet Handling Request
/foo/bar/index.html servlet1
/foo/bar/index.bop servlet1
/baz servlet2
/baz/index.html servlet2
/catalog servlet3
/catalog/index.html “default” servlet
/catalog/racecar.bop servlet4
/index.bop servlet4

注意,在/catalog/index.html和/catalog/racecar.bop的情况下,不使用映射到“/catalog”的servlet,因为不是精确匹配的。

Servlet映射的更多相关文章

  1. servlet映射路径

    1 访问映射过程 问题:访问URL:http://localhost:8080/day10/first  ,服务器如何相应的? 前提: tomcat服务器启动时,首先加载webapps中的每个web应 ...

  2. jsp 表单提交,服务器跳转方法 浏览器重定向 及 servlet映射时 路径问题

    在jsp页面中,等提交表单数据时,最好用觉得路径. 写法如下: <form action ="<%=request.getContextPath()%>/do_login. ...

  3. Servlet映射规范和隐式映射

    问题描述: web.xml中配置了缺省路径"/"后,原先在webapp下的静态页面(html)无法通过URL访问了,为什么? 过程尝试: 1. 将html后缀改为.jsp后可以正常 ...

  4. Servlet映射的过程

    1.首先通过上图 locolhost:8080/login.html 访问到这个登录的html页 2 通过html页的 action="LoginServlet" 进行映射,所以填 ...

  5. Servlet映射细节

    Servlet的映射细节: 1):一个Servlet程序(Web组件),可以配置多个<url-pattern>,表示一个Servlet有多个资源名称. <servlet-mappin ...

  6. Maven关于web.xml中Servlet和Servlet映射的问题

    在配置Servlet时,有两个地方需要配置. 一个是<servlet>,另一个是<servlet-Mapping>,这两个一个是配置Servlet,一个是配置其映射信息. &l ...

  7. idea建立web项目servlet映射的地址/jsp访问不到

    用IntelliJ IDEA 2017新建了一个web项目,成功运行后servlet mapping的地址一直访问不到 原因:在配置tomcat的时候Server中Open browser选项勾选之后 ...

  8. servlet映射路径匹配解析

    开头 servlet是javaweb用来处理请求和响应的重要对象,本文将从源码的角度分析tomcat内部是如何根据请求路径匹配得到处理请求的servlet的 假设有一个request请求路径为/tex ...

  9. JavaWeb学习之Servlet(三)----Servlet的映射匹配问题、线程安全问题

    [声明] 欢迎转载,但请保留文章原始出处→_→ 文章来源:http://www.cnblogs.com/smyhvae/p/4140529.html 一.Servlet映射匹配问题: 在第一篇文章中的 ...

随机推荐

  1. 微信小程序:request合法域名检验出错,https://apis.map.qq.com 不在以下 request 合法域名列表中

    设置域名 登录微信小程序后台, 设置→开发设置→服务器设置 必须设置域名,微信小程序才能进行网络通讯,不然会报错 如果没有设置合法域名,在开发阶段是可以不设置合法域名的 详情 -项目设置 好了,完美解 ...

  2. ES中的分词器

    基本概念: 全文搜索引擎会用某种算法对要建索引的文档进行分析, 从文档中提取出若干Token(词元), 这些算法称为Tokenizer(分词器), 这些Token会被进一步处理, 比如转成小写等, 这 ...

  3. kettle学习笔记及实践

    转自萤火的萤 最近在用kettle迁移数据,从对kettle一点不会到比较熟悉,对于期间的一些问题和坑做了记录和总结,内容涵盖了使用的经验和技巧,踩到的坑.最佳实践和优化前后结果对比. 常用转换组件 ...

  4. zip 格式解析

    1.格式 https://pkware.cachefly.net/webdocs/APPNOTE/APPNOTE-6.2.0.txt 官方文档 https://blog.csdn.net/hp9103 ...

  5. java 诊断工具——Arthas

    该说不说!小编做的这些功能,最讨厌的就是优化!某些前辈大佬写的代码小辈我实在不敢恭维!那逻辑!那sql! 接下来!今天的主角就登场了,阿里巴巴最近开源出来的一个针对 java 的工具,主要是针对 ja ...

  6. wayne生产环境部署(360的容器发布平台-开源)

    参考文档 http://360yun.org/wayne/dev/develop-flow.html 使用rke部署k8s,详细过程见前面 文章,同时部署好kubectl 安装go yum insta ...

  7. Mariadb主从复制

    前戏: mysql的基本命令复习 .启动mysql systemctl start mariadb .linux客户端连接自己 mysql -uroot -p -h 127.0.0.1 .远程链接my ...

  8. commandjs、AMD、CMD之间的故事

    commandjs:同步加载,只运行一次,后面使用第一次加载时运行的结果(存于缓存中),用于服务器 AMD:define(id ?,dependencies ?,factory) 异步加载,用于浏览器 ...

  9. spark 线性回归算法(scala)

    构建Maven项目,托管jar包 数据格式 //0.fp_nid,1.nsr_id,2.gf_id,2.hydm,3.djzclx_dm,4.kydjrq,5.xgrq,6.je,7.se,8.jsh ...

  10. Python并发解决方案

    一.subprocess模块 call():执行命令,返回程序返回码(int) import subprocess print(subprocess.call("mspaint") ...