Servlet容器如何处理请求资源路径
1.. 什么是请求资源路径
在地址栏中输入的请求地址中,端口号之后的部分都是请求资源路径。紧跟端口号的是部署到Web服务器上的应用名(appName),紧跟应用名的则是具体的应用内的组件路径。
2. Web服务器对请求地址的处理过程
浏览器依据地址中的IP和端口号与Web服务器建立连接,服务器会获取到请求资源路径信息。根据端口号后面的应用名找到服务器上对应的应用。默认情况下容器会认为应用名后面的是一个Servlet,所以回到web.xml文件中所有是否有与该值匹配的<url-pattern>,找到匹配的值之后再按照<servlet-name>完成对应关系的查找,进而找到要执行的Servlet。如果没有找到匹配的资源服务器就会返回404错误。
3. 匹配Servlet的规则
容器在进行url-pattern比对的时候是遵循一定的匹配原则的。这些原则主要有:
精确匹配
即具体资源名称与web.xml文件中的url-pattern严格匹配相等才执行。如,配置的内容如下:
- <servlet>
- <servlet-name>someServlet</servlet-name>
- <servlet-class>test.MyServlet</servlet-class>
- </servlet>
- <servlet-mapping>
- <servlet-name>someServlet</servlet-name>
- <url-pattern>/abc.html</url-pattern>
- </servlet-mapping>
则在地址栏中输入 http://ip:port/appName/abc.html 时,服务器就会去执行test.MyServlet这个组件,就算是在应用的根目录下的确有abc.html这个文件,也不会执行。
通配符匹配
使用“*”这个符号来匹配0个或多个字符,已达到路径的批量匹配的效果。
如配置文件中的节点为如下代码所示:
- <servlet>
- <servlet-name>someServlet</servlet-name>
- <servlet-class>test.MyServlet</servlet-class>
- </servlet>
- <servlet-mapping>
- <servlet-name>someServlet</servlet-name>
- <url-pattern>/*</url-pattern>
- </servlet-mapping>
则,在地址栏中输入以下任何地址时都是匹配成功的。
- http://ip:port/appName/abc.html
- http://ip:port/appName/abc/def/ghi.html
后缀匹配
在配置url-pattern节点时,不使用斜杠开头,用“*.”开头来匹配任意多个字符的模式叫做后缀匹配。
如配置文件中的节点为如下代码所示:
- <servlet>
- <servlet-name>someServlet</servlet-name>
- <servlet-class>test.MyServlet</servlet-class>
- </servlet>
- <servlet-mapping>
- <servlet-name>someServlet</servlet-name>
- <url-pattern>*.do</url-pattern>
- </servlet-mapping>
则,在地址栏中输入以下任何地址时都是匹配成功的。
- http://ip:port/appName/abc.do
- http://ip:port/appName/abc/def/ghi.do
在这三种匹配方式中,优先级最高的是精确匹配。如果容器在使用以上原则都不能找到相匹配的资源来执行时,就按照地址到应用中查找对应的文件。此时如果找到文件则返回,找不到资源来执行就返回404错误。