Servlet映射
转载自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错误。
- tomcat容器中会默认注册了一个名称为
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映射的更多相关文章
- servlet映射路径
1 访问映射过程 问题:访问URL:http://localhost:8080/day10/first ,服务器如何相应的? 前提: tomcat服务器启动时,首先加载webapps中的每个web应 ...
- jsp 表单提交,服务器跳转方法 浏览器重定向 及 servlet映射时 路径问题
在jsp页面中,等提交表单数据时,最好用觉得路径. 写法如下: <form action ="<%=request.getContextPath()%>/do_login. ...
- Servlet映射规范和隐式映射
问题描述: web.xml中配置了缺省路径"/"后,原先在webapp下的静态页面(html)无法通过URL访问了,为什么? 过程尝试: 1. 将html后缀改为.jsp后可以正常 ...
- Servlet映射的过程
1.首先通过上图 locolhost:8080/login.html 访问到这个登录的html页 2 通过html页的 action="LoginServlet" 进行映射,所以填 ...
- Servlet映射细节
Servlet的映射细节: 1):一个Servlet程序(Web组件),可以配置多个<url-pattern>,表示一个Servlet有多个资源名称. <servlet-mappin ...
- Maven关于web.xml中Servlet和Servlet映射的问题
在配置Servlet时,有两个地方需要配置. 一个是<servlet>,另一个是<servlet-Mapping>,这两个一个是配置Servlet,一个是配置其映射信息. &l ...
- idea建立web项目servlet映射的地址/jsp访问不到
用IntelliJ IDEA 2017新建了一个web项目,成功运行后servlet mapping的地址一直访问不到 原因:在配置tomcat的时候Server中Open browser选项勾选之后 ...
- servlet映射路径匹配解析
开头 servlet是javaweb用来处理请求和响应的重要对象,本文将从源码的角度分析tomcat内部是如何根据请求路径匹配得到处理请求的servlet的 假设有一个request请求路径为/tex ...
- JavaWeb学习之Servlet(三)----Servlet的映射匹配问题、线程安全问题
[声明] 欢迎转载,但请保留文章原始出处→_→ 文章来源:http://www.cnblogs.com/smyhvae/p/4140529.html 一.Servlet映射匹配问题: 在第一篇文章中的 ...
随机推荐
- 开源虚拟化KVM(二)管理虚拟存储
五,管理虚拟存储 5.1 虚拟磁盘概述 5.1.1 虚拟化项目中存储的注意事项 [x] 存储的性能几乎总是虚拟化的瓶颈 [x] 通过多个硬盘驱动以分布磁盘I/O来实现存储解决方案 [x] 考虑部署集中 ...
- Selenium Grid和IE /Firefox各种填坑
使用selenium grid的步骤 1.确保hub和node都安装并且配置好了java jdk. 2.在hub上运行以下命令. java -jar C:\Software\selenium\sele ...
- Java框架spring 学习笔记(三):Bean 的生命周期
当一个 bean 被实例化时,它可能需要执行一些初始化使它转换成可用状态.当bean不再需要,并且从容器中移除时,需要做一些清除工作.为了定义安装和拆卸一个 bean,我们只要声明init-metho ...
- 线性筛素数和理解 洛谷P3383
题目链接:https://www.luogu.org/problemnew/show/P3383 线性筛法筛素数的特点是每一个数字只被遍历一次,即时间复杂度为O(n),所以说他是线性的,并且所有的非素 ...
- 微信小程序日历面板插件
创建日历面板组件,在components目录下创建calendar文件夹 1.calendar.js // components/calendar/calendar.js var util = req ...
- Python基础-python流程控制之顺序结构和分支结构(五)
流程控制 流程:计算机执行代码的顺序,就是流程 流程控制:对计算机代码执行顺序的控制,就是流程控制 流程分类:顺序结构.选择结构(分支结构).循环结构 顺序结构 一种代码自上而下执行的结构,是pyth ...
- java_26 缓冲流
1.缓冲流: 读取数据大量的文件时,读取的速度慢, java提供了一套缓冲流,提高IO流的效率.分为字节缓冲流和字符缓冲流. 字节缓冲流: 缓冲输出流:BufferedOutputStream 缓冲输 ...
- Linux 内存占用大排查
用命令 top 查看发现内存使用很高,可用内存很少,导致有些服务无法正常启动. 这时,可以用下面的命令查看占用内存前10的进程,改变 10 的数字,可以调整前几的个数. ps -aux | sort ...
- VNC 分辨率修改
正确的: vncserver -geometry 1280x1024 错误的: vncserver -geometry 1280*1024
- composer 镜像地址
composer config -g repo.packagist composer https://packagist.composer-proxy.orgcomposer config -g re ...