web容器将客户端请求映射到servlet,必须按照这节描述映射servlet技术 ( 在2.5版本只是建议,可以自己设计映射servlet)
12.1、使用URL路径
- 收到客户请求后,web容器确定将其转发到web应用程序。所选的web应用程序必须具有与请求URL的开头匹配的最长上下文路径。URL的匹配部分是映射到servlet的上下文路径。
- web容器接下来必须使用下面描述的路径映射过程定位servlet来处理请求
- 用于映射到servlet的路径是来自请求减去上下文路径和路径参数,以下URL路径映射规则按顺序使用。使用第一个成功的匹配,不尝试其他匹配:
- 容器将尝试查找请求路径与Servlet路径的精确匹配,成功匹配将选择servlet
- 容器将递归地尝试匹配最长的路径前缀,这是通过使用"/"字符作为路径分隔符,一次将路径树下移动到一个目录来完成的,满足最长匹配的servlet将会被选择
- 如果网址路径中的最后一段包含扩展名(例如.jsp),则servlet容器将尝试匹配处理改扩展名请求的servlet,扩展名定义为最后一个"." 字符后的最后一部分
- 如果前三个规则均未匹配到servlet,则容器将尝试提供适合于所请求资源的内容。如果为应用程序定义了默认servlet,则将使用它,许多容器提供隐式默认servlet来提供内容。
12.2、映射的规范
- 在web应用程序部署描述符中,以下语法用于定义映射:
- 路径映射使用以"/“字符开头并以”/*"后缀结尾的字符串
- 以“*.”前缀开头的字符串用作扩展名映射(例如 *.jsp)
- 空字符串("")是一种特殊的URL模式,它精确地映射到应用程序的上下文根,即http://host:port//形式的请求,在这种情况下,路径信息为"/",而servlet路径和上下文路径为空字符串("")
- 仅包含"/"字符的字符串表示应用程序的默认servlet,在这种情况下,servlet路径是请求uri减去上下文路径,并且路径信息为null
- 所有其他字符串仅用于完全匹配。
- 如果有效的web.xml(合并来自web-segement.xml和注解mapping信息)包含映射到多个servlet的任何url模式,则部署必须失败。
12.2.1、隐式映射(扩展名映射)
- 如果容器具有内部JSP容器,则*.jsp扩展名将映射到该容器,从而允许按需执行JSP页面,该映射被称为隐式映射,如果web应用程序定义了*.jsp映射,则其映射优先于隐式映射。
- 只有显式映射优先,就可以允许servlet容器进行其他隐式映射,例如,可以将*.shtml的隐式映射为包括服务器上其他自定义的功能。
12.2.2、映射示例列表
-
servlet配置path
-
路径格式 Servlet /foo/bar/* servlet1 /baz/* servlet2 /catalog servlet3 *.bop servlet4
-
-
以下是实际请求(应该到那个servlet)
-
请求url路径 对于servlet处理器 /foo/bar/index.html servlet1 /foo/bar/index.bop servlet1 /baz servlet2 /baz/index.html servlet2 /catalog servlet3 /catalog/index.html “默认” servlet /catalog/racecar.bop servlet4 /index.bop servlet4 注意: 在/catalog/index.html和/catalog/racecar.bop的情况下,由于匹配不完全,因此不使用映射到"/catalog"的servlet
-
优先级:先匹配路径,后匹配扩展名
-