三点:
1. 请求URI = context path + servlet path + path info。
2. context path和servlet path都以'/'开头但不以'/'结尾。
3. HttpServletRequest提供了三个方法:getContextPath(), getServletPath() and getPathInfo()来分别从request中获取context path 、servlet path 和path info。
策略:
1.容器试图在web.xml中寻找匹配的请求URI。如果找到了,完整的请求URI(除去context路径)
即servlet路径。这时HttpServletRequest.getPathInfo()为null。
2.使用/作为分隔符,将请求URI转化为目录树,并通过递归匹配web.xml中URL-PATTERN,获得
3.如果请求URI的最后一个节点包含一个扩展名(如:.jsp),servlet容器会将它和处理这个种特定的
4.如果容器仍然不能匹配请求路径, 它会将请求forward到默认的servlet.如果没有默认的servlet,
它会发送一条说明服务器没有找到,指定文件未找到的错误信息(404)。
最长的匹配路径.匹配部分即servlet path,其余为path info。
扩展名servlet匹配.这时, 完整的请求URI, 减去context path即servlet path, 并path info为null.
<servlet-mapping>
<servlet-name>RedServlet</servlet-name>
<url-pattern>/red/*</url-pattern>
</servlet-mapping>
<servlet-mapping>
<servlet-name>RedServlet</servlet-name>
<url-pattern>/red/red/*</url-pattern>
</servlet-mapping>
<servlet-mapping>
<servlet-name>RedBlueServlet</servlet-name>
<url-pattern>/red/blue/*</url-pattern>
</servlet-mapping>
<servlet-mapping>
<servlet-name>BlueServlet</servlet-name>
<url-pattern>/blue/</url-pattern>
</servlet-mapping>
<servlet-mapping>
<servlet-name>GreenServlet</servlet-name>
<url-pattern>/green</url-pattern>
</servlet-mapping>
<servlet-mapping>
<servlet-name>ColorServlet</servlet-name>
<url-pattern>*.col</url-pattern>
</servlet-mapping>
Request URI Servlet Used Servlet Path Path Info
/colorapp/red RedServlet /red null
/colorapp/red/ RedServlet /red /
/colorapp/red/aaa RedServlet /red /aaa
/colorapp/red/blue/aa RedBlueServlet /red/blue /aa
/colorapp/red/red/aaa RedServlet /red/red /aaa
/colorapp/aa.col ColorServlet /aa.col null
/colorapp/hello/aa.col ColorServlet /hello/aa.col null
/colorapp/red/aa.col RedServlet /red /aa.col
/colorapp/blue NONE(Error message)
/colorapp/hello/blue/ NONE(Error message)
/colorapp/blue/mydir NONE(Error message)
/colorapp/blue/dir/aa.col ColorServlet /blue/dir/aa.col null
/colorapp/green GreenServlet /green null
[Servlet 规范中描述]
映射请求到Servlet
接收到一个请求后,WEB容器要确定转到哪一个WEB应用程序。被选择的应用程序的最长的上下文路径必须和请求的URL开始部分匹配。URL匹配的部分是映射到Servlet的上下文路径。
WEB容器下一步必须按照下面的程序定位处理请求的Servlet。
用来映射到Servlet的路径是请求对象的URL减去上下文的路径。下面的URL路径映射规则按顺序执行,容器选择第一个成功的匹配并且不在进行下一个匹配:
Ø 容器试着对请求的路径和Servlet的路径进行精确匹配,如果匹配成功则选择这个Servlet。
Ø 容器会循环的去试着匹配最长的路径前缀:把’/’当作路径分隔符,按照路径树逐级递减的完成,选择最长匹配的Servlet。
Ø 如果这个URL路径的最后有扩展名(比如.jsp),Servlet容器会试着匹配处理这个扩展名的Servlet。
Ø 如果前面的没有与前面三条规则相匹配的Servlet,容器会试着为资源请求提供适当的资源,如果有“默认”的Servlet定义给这个应用程序,那么这个Servlet会被使用。
容器必须使用一个大小写敏感的匹配方式。
在部署描述符中,用下面的语法定义映射:
Ø 一个以’/’开始并且以’/*’结束的字符串用来映射路径。
Ø 一个以’*.’为前缀的字符串用来映射扩展名。
Ø 一个只包含’/’的字符串指示着这个应用程序“默认”的Servlet,在这种情况下,servlet的路径是请求的URI减去上下文路径,并且这个路径是null。
Ø 所有其他的字符只用来精确匹配。
如果容器内置JSP容器,那么*.jsp被映射到这个容器,并允许JSP页面在需要的时候被执行。这种映射叫做隐含映射。如果WEB应用程序中定义了*.jsp的映射,那么这个映射有比隐含映射高的优先级。
WEB容器允许显式的声明隐含映射以获得优先级,例如,*.shtml的隐含映射可以在服务器上被映射为包含功能。
原文:
Remember the following three points:
1. Request URI = context path + servlet path + path info.
2. Context paths and servlet paths start with a / but do not end with it.
3. HttpServletRequest provides three methods getContextPath(), getServletPath() and getPathInfo() to retrieve the context path, the servlet path, and the path info, respectively, associated with a request.
Identifying the servlet path To match a request URI with a servlet, the servlet container follows a simple algorithm. Once it identifies the context path, if any, it evaluates the remaining part of the request URI with the servlet mappings specified in the deployment descriptor, in the following order. If it finds a match at any step, it does not take the next step.
1) The container tries to match the request URI to a servlet mapping. If it finds a match, the complete request URI (except the context path) is the servlet path. In this case, the path info is null.
2) It tries to recursively match the longest path by stepping down the request URI path tree a directory at a time, using the / character as a path separator, and determining if there is a match with a servlet. If there is a match, the matching part of the request URI is the servlet path and the remaining part is the path info.
3) If the last node of the request URI contains an extension (.jsp, for example), the servlet container tries to match it to a servlet that handles requests for the specified extension. In this case, the complete request URI is the servlet path and the path info is null.
4) If the container is still unable to find a match, it will forward the request to the default servlet. If there is no default servlet, it will send an error message indicating the servlet was not found.
分享到:
相关推荐
3. 默认Servlet映射:`/`作为`url-pattern`时,它被用作默认Servlet,处理所有未被其他Servlet或Filter映射的请求。 4. 详细定义:你可以自定义更复杂的`url-pattern`,如`/path/*`,这将匹配所有以`/path/`开头的...
### 虚拟目录与Servlet测试详解 在深入解析虚拟目录及Servlet测试的过程之前,我们首先需要理解几个关键概念:虚拟目录、Servlet以及Tomcat服务器的配置方式。 #### 虚拟目录的理解 虚拟目录是Web服务器的一个...
正则表达式(Regular Expression)在Servlet中主要用于URL映射,过滤请求以及数据验证。本文将深入探讨Servlet与正则表达式如何结合使用,以实现更灵活、强大的Web服务。 1. **URL映射中的正则表达式** 在Servlet ...
- 修改`WEB-INF/web.xml`配置文件,声明Servlet及其映射路径。例如: ```xml <servlet> <servlet-name>MyServlet</servlet-name> <servlet-class>com.example.MyServlet</servlet-class> </servlet> <servlet...
在其中,我们需要定义Servlet的别名(`<servlet-name>`)、Servlet类的全限定名(`<servlet-class>`)以及Servlet的URL映射(`<url-pattern>`)。例如: ```xml <servlet> <servlet-name>SimpleServlet</servlet...
`web.xml`是应用的部署描述符,用于定义Servlet和它们的映射。 在`web.xml`中,你需要配置Servlet,例如: ```xml <servlet> <servlet-name>HelloWorldServlet</servlet-name> <servlet-class>...
5. **运行与测试**: - 将Servlet项目部署到支持Servlet的Web服务器(如Tomcat)。 - 访问`http://localhost:8080/your-app-context-path/simple`,其中`your-app-context-path`是你的应用上下文路径。 - 如果...
5. **Servlet配置**:熟悉`web.xml`文件的配置方法,包括Servlet的声明和URL映射。 6. **安全性和性能优化**:考虑安全性措施,如防止路径遍历攻击;同时优化文件传输过程,提高下载速度。 通过上述代码示例及解析...
从提供的文件内容中,我们可以提取出关于Tomcat开发JSP与Servlet的关键知识点。下面将对这些知识点进行详细说明: 1. Tomcat服务器简介: - Apache Tomcat是一个开源的Servlet容器,它实现了Java Servlet和Java...
在功能上,Servlet与CGI、NSAPI有点类似,但是,与他们不同的是:Servlet具有平台无关性。 JavaServlet概论 Servlet与其他普通的server扩展机制有以下进步: 因为它采用了不同的进程处理模式,所以它比CGI更快。 它...
1. **Servlet 3.0特性**: Servlet 3.0引入了注解配置,可以直接在Servlet类上使用`@WebServlet`注解声明URL映射,不再需要web.xml配置文件。 2. **异步处理**: Servlet 3.0允许开发者编写异步Servlet,通过`...
Servlet 3.1增强了静态资源的处理能力,通过配置`<resource>`元素,可以设置静态资源的缓存策略,提高服务端对图片、CSS、JavaScript等文件的响应速度。此外,还提供了过滤器链来处理静态资源,减少了Servlet调用,...
配置包括指定 Servlet 的名称、类名以及 URL 映射等信息。 示例配置如下: ```xml <servlet> <servlet-name>FileDownload</servlet-name> <servlet-class>com.fastunit.test.FileDownload</servlet-class> </...
此外,为了处理文件上传,还需要在Web应用的部署描述符`web.xml`中配置Servlet,指定URL映射和Servlet类。例如: ```xml <servlet> <servlet-name>FileUploadServlet</servlet-name> <servlet-class>...
总结来说,将Servlet集成到OSGi的Karaf容器中发布REST接口涉及到创建OSGi Bundle、注册Servlet服务、配置Jetty、部署Bundle、设置URL映射等多个环节。这样的模块化方式使得开发、测试和维护更加灵活高效,同时也为...