Servlet path与映射策略

 

三点:

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.

 

你可能感兴趣的:(servlet)