Servlet 容器如何处理请求资源路径
1. 什么是请求资源路径
在浏览器地址栏输入:http://ip:port/appName/xxx.html
其中 /appName/xxx.html 就是请求资源路径
容器默认认为访问的是一个servlet,所以,会查看web.xml配置,看有没有匹配的servlet
2. Web服务器对请求路径的处理过程
在浏览器地址栏输入:http://ip:port/appName/xxx.html
- 浏览器依据ip,port建立与Servlet容器之间的连接,然后将请求资源路径/appName/xxx.html 发送过去给容器
- 容器依据应用名“/appName”找到应用所在的文件夹,容器会默认请求的是一个Servlet,查找web.xml文件中所有的Servlet配置“”,看是否有匹配的<url-pattern>
- 找到匹配的值之后再按照<servlet-name>完成对应关系的查找,进而找到要执行的Servlet
- 如果没有查找匹配的servlet,容器会查找对应位置的文件
- 如果没有找到对应位置的文件就会返回404错误
3. 匹配servlet的规则
-
精准匹配
具体资源名称与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>
-
通配符匹配
使用"*"匹配一个或者多个任意的字符
<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>
-
后缀匹配
在配置url-pattern节点时,不使用斜杠开头,用“*.”开头来匹配任意多个字符
<servlet> <servlet-name>someServlet</servlet-name> <servlet-class>test.MyServlet</servlet-class> </servlet> <servlet-mapping> <servlet-name>someServlet</servlet-name> <!-- 会匹配所有以.do结尾的请求 --> <url-pattern>*.do</url-pattern> </servlet-mapping>
优先级最高的是 精确匹配
4. 如何让一个Servlet处理多种请求
-
采用后缀匹配
<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>
-
分析请求资源路径,进行相应的处理