在使用servlet时需要配置url-pattern的请求路径映射到某个servlet类,映射路径到底怎么配置呢?
书上给出大的分类3种分类我们来分析下:
一.精确匹配,即一层路径,前面没再有路径名。
1.1直接的请求名称,无后缀,如"/test1",输入请求地址如"http://localhost:8080/pro/test1"
即可访问到对应的servlet。
猜想:多个并列的类似"/test1"的请求同时映射到同一servlet类?实验答案:可以的。
如此配置:
<servlet-mapping>
<servlet-name>testServlet</servlet-name>
<url-pattern>/test1</url-pattern>
</servlet-mapping>
<servlet-mapping>
<servlet-name>testServlet</servlet-name>
<url-pattern>/test2</url-pattern>
</servlet-mapping>
或:
<servlet-mapping>
<servlet-name>testServlet</servlet-name>
<url-pattern>/test1</url-pattern>
<url-pattern>/test2</url-pattern>
</servlet-mapping>
亲自运行都可以映射到访问的servlet类。
1.2带后缀的精确单层路径,如"/test1.do",并且多个带后缀的路径对应同一个servlet类的配置。
<servlet-mapping>
<servlet-name>testServlet</servlet-name>
<url-pattern>/test1.do</url-pattern>
</servlet-mapping>
<servlet-mapping>
<servlet-name>testServlet</servlet-name>
<url-pattern>/test2.do</url-pattern>
</servlet-mapping>
或:
<servlet-mapping>
<servlet-name>testServlet</servlet-name>
<url-pattern>/test1.do</url-pattern>
<url-pattern>/test2.do</url-pattern>
</servlet-mapping>
上面亲测可以。
如果带不带后缀的和带后缀的一起映射?
如:
<servlet-mapping>
<servlet-name>testServlet</servlet-name>
<url-pattern>/test1</url-pattern>
</servlet-mapping>
<servlet-mapping>
<servlet-name>testServlet</servlet-name>
<url-pattern>/test2.do</url-pattern>
</servlet-mapping>
或
<servlet-mapping>
<servlet-name>testServlet</servlet-name>
<url-pattern>/test1</url-pattern>
<url-pattern>/test2.do</url-pattern>
</servlet-mapping>
上面可以看到: 1.有没有后缀是不影响的,后缀名不是一定需要的。
2.多个精确的路径可以映射到同一servlet类。
3.必须有"/",没有会404,亲测
二.路径匹配
路径匹配就是请求的上下文路径后面再有至少一层路径的请求匹配。
1.1单路径(后面精确路径带不带后缀都可以)
<url-pattern>/test/test1</url-pattern>
1.2多层路径
(后面精确路径带不带后缀都可以)
<url-pattern>/test/pp/test1</url-pattern>
1.3路径后通配符
<url-pattern>/test/*</url-pattern>
注意:<url-pattern>/test/*.do</url-pattern> 不可以,启动项目报错, 模糊匹配方式不能同时使用(路径模糊匹配和后缀模糊匹配)。前面的"/"也不能少
三. 后缀拓展名匹配。
<url-pattern>*.do</url-pattern>
注意:<url-pattern>/*.do</url-pattern> 不可以,报错
注意:通配符 *,<url-pattern>*</url-pattern> <url-pattern>/*</url-pattern>都不可以,报错
1)url-pattern(请求servlet的映射路径)要么以 / 开头,要么以*开头。 例如, 只写test是非法路径。
2)不能同时使用两种模糊匹配,例如 /test/*.do是非法路径
3)当有输入的URL有多个servlet同时被匹配的情况下:
3.1 精确匹配优先。(长的最像优先被匹配,这里就做不验证了)
3.2 以后缀名结尾的模糊url-pattern优先级最低
4)虽然能够以/开头(/和/*两种写法是等价的),但是不推荐这种写法
部分参考文章地址:http://www.cnblogs.com/fnz0/p/5586019.html