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严格匹配相等才执行。如,配置的内容如下:

 
  1. <servlet>
  2.     <servlet-name>someServlet</servlet-name>
  3.     <servlet-class>test.MyServlet</servlet-class>
  4. </servlet>
  5. <servlet-mapping>
  6.     <servlet-name>someServlet</servlet-name>
  7.     <url-pattern>/abc.html</url-pattern>
  8. </servlet-mapping>

则在地址栏中输入 http://ip:port/appName/abc.html 时,服务器就会去执行test.MyServlet这个组件,就算是在应用的根目录下的确有abc.html这个文件,也不会执行。

通配符匹配

使用“*”这个符号来匹配0个或多个字符,已达到路径的批量匹配的效果。

如配置文件中的节点为如下代码所示:

  1. <servlet>
  2.     <servlet-name>someServlet</servlet-name>
  3.     <servlet-class>test.MyServlet</servlet-class>
  4. </servlet>
  5. <servlet-mapping>
  6.     <servlet-name>someServlet</servlet-name>
  7.     <url-pattern>/*</url-pattern>
  8. </servlet-mapping>

则,在地址栏中输入以下任何地址时都是匹配成功的。

 
  1. http://ip:port/appName/abc.html
  2. http://ip:port/appName/abc/def/ghi.html

后缀匹配

在配置url-pattern节点时,不使用斜杠开头,用“*.”开头来匹配任意多个字符的模式叫做后缀匹配。

如配置文件中的节点为如下代码所示:

  1. <servlet>
  2.     <servlet-name>someServlet</servlet-name>
  3.     <servlet-class>test.MyServlet</servlet-class>
  4. </servlet>
  5. <servlet-mapping>
  6.     <servlet-name>someServlet</servlet-name>
  7.     <url-pattern>*.do</url-pattern>
  8. </servlet-mapping>

则,在地址栏中输入以下任何地址时都是匹配成功的。

  1. http://ip:port/appName/abc.do
  2. http://ip:port/appName/abc/def/ghi.do

在这三种匹配方式中,优先级最高的是精确匹配。如果容器在使用以上原则都不能找到相匹配的资源来执行时,就按照地址到应用中查找对应的文件。此时如果找到文件则返回,找不到资源来执行就返回404错误。

posted @ 2017-08-16 22:38  wwqqnn  阅读(942)  评论(0编辑  收藏  举报