最近在看Servlet 2.4的规范,SRV11 Mapping Requests to Servlets里头讲怎么把HTTP 请求映射给Servlet,主要依据的是web.xml里头的url-pattern。原文其实也很短,就两页,就不摘录了,有兴趣的可以去看原文。网上也有中文版的,但是翻译得很一般,还是直接看英文的好。
看得时候可以略微倒过来,先看语法:
- / 开头 /* 结尾的是路径匹配。
- *.开头的是扩展名匹配。
- /代表默认的servlet。
- 其他的都被用于完全匹配。
匹配的规则按优先级:
- 先完全匹配
- 再进行路径匹配,选择路径最长的servlet
- 再进行扩展名匹配
- 如果前面都没有匹配上,而且有默认的servlet的话,则交给默认的servlet处理
这里头我觉得有两个地方需要注意:
1、默认的servlet的url-pattern是 /,而不是/*。除非是为了拦截请求等特殊需要,不要把某一个servlet的url-pattern写成 /*。/*属于路径匹配,而且优先级较高,他会匹配走所有的请求。
2、HttpServletRequest接口里有一个getPathInfo方法,API描述有点拗口,其实返回的就是URI里头去掉url-pattern匹配上的那部分之后的内容。比如你有一个处理用户信息的servlet,url-pattern是/user/*,那么当用户访问/user/list时,getPathInfo返回的就是/list。这个在编程是其实也挺管用的。比如对于用户信息,可能会有增删改查等多种操作,你又不想每一种操作都做成一个servlet,这时候你其实只需要user一个servlet,处理的时候只要根据PathInfo就能知道该进行什么样的操作。