servlet的匹配问题
这个问题。。。整整折磨了我两天。。。
终于把它搞明白了!
在我的web.xml下,如果代码是:
<?xml version="1.0" encoding="UTF-8"?> <web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd" version="3.1"> <servlet> <servlet-name>Ch1Servlet</servlet-name> <servlet-class>demo.Ch1Servlet</servlet-class> </servlet> <servlet-mapping> <servlet-name>Ch1Servlet</servlet-name> <url-pattern>/Ch1Servlet</url-pattern> </servlet-mapping> </web-app>
上面的配置信息,其中<servlet>标签首先配置声明一个servlet,包括servlet的名字和对应的Java类名。
其中<servlet-mapping>标签声明了与该servlet相应的匹配规则,每个<url-pattern>标签代表1个匹配规则。
当浏览器发起一个url请求后,该请求发送到servlet容器的时候,容器先会将请求的url减去当前应用上下文的路径作为servlet的映射url,比如url是http://localhost:8080/demo/Ch1Servlet,其应用上下文是demo,容器会将http://10.43.11.143/demo去掉,剩下的Ch1Servlet部分拿来做servlet的映射匹配。这个映射匹配过程是有优先顺序的(具体的优先顺序规则后面介绍),而且当有一个servlet匹配成功以后,就不会去理会剩下的servlet了。
精确匹配:
<servlet-mapping> <servlet-name>MyServlet</servlet-name> <url-pattern>/kata/detail.html</url-pattern> <url-pattern>/demo.html</url-pattern> <url-pattern>/table</url-pattern> </servlet-mapping>
当在浏览器中输入如下几种url时,都会被匹配到该servlet
http://10.43.11.143/myapp/kata/detail.htmlhttp://10.43.11.143/myapp/demo.html
http://10.43.11.143/myapp/table
注意:
http://10.43.11.143/myapp/table/ 是非法的url,不会被当作http://10.43.11.143/myapp/table识别
另外上述url后面可以跟任意的查询条件,都会被匹配,如
http://10.43.11.143/myapp/table?hello 这个请求就会被匹配到MyServlet。
扩展名匹配:
<servlet-mapping> <servlet-name>MyServlet</servlet-name> <url-pattern>*.jsp</url-pattern> </servlet-mapping>
则任何扩展名为jsp(文件名和路径任意)的url请求都会匹配,比如下面的url都会被匹配
http://10.43.11.143/myapp/demo.jsphttp://10.43.11.143/myapp/test.jsp
<servlet-mapping> <servlet-name>MyServlet</servlet-name> <url-pattern>/kata/*</url-pattern> </servlet-mapping>
则请求的ulr只要前面(myapp之后)的路径是/kata,而后面的路径可以任意。比如下面的url都会被匹配。
http://10.43.11.143/myapp/kata/demo.html
http://10.43.11.143/myapp/kata/test.jsp
http://10.43.11.143/myapp/kata/test/detail.html
http://10.43.11.143/myapp/kata/action
http://10.43.11.143/myapp/kata/action/
注意:路径和扩展名匹配无法同时设置,比如下面的三个<url-pattern>都是非法的,如果设置,启动tomcat服务器会报错。
<url-pattern>/kata/*.jsp</url-pattern>
<url-pattern>/*.jsp</url-pattern>
<url-pattern>he*.jsp</url-pattern>
另外注意:<url-pattern>/aa/*/bb</url-pattern>
这个是精确匹配,url必须是 /aa/*/bb,这里的*不是通配的含义
任意url匹配:
如果<url-pattern>配置成如下两种的任意一种
<url-pattern>/</url-pattern>
<url-pattern>/*</url-pattern>
则所有的url都可以被匹配上。其中/*是路径匹配,只是路径就是/。
下一篇: C实现链表形式的栈
推荐阅读
-
关于mysql查询字符集不匹配问题的解决方法
-
python正则表达式中的括号匹配问题
-
jsp和servlet操作mysql中文乱码问题的解决办法
-
解决cannot be cast to javax.servlet.Filter 报错的问题
-
jsp传参 servlet接收中文乱码问题的解决方法
-
解决webpack dev-server不能匹配post请求的问题
-
PHP的preg_match匹配字符串长度问题解决方法
-
浅谈Python采集网页时正则表达式匹配换行符的问题
-
XPath匹配标签使用text()判断获取结果失败/为空的问题及解决方法
-
PHP中preg_match函数正则匹配的字符串长度问题