大家好,这里是X,今天带来一期我本人之前“稍微”有点卡的问题,那就是关于Servlet-mapping部署路径问题,当然了这个也是在Servlet中非常重要的一个点🚨🚨🚨,所以不说废话啦,让我们开始吧🚄
文章目录
- x💤
- 规则
- 精确匹配(一个servlet指定一个路径)
- 一个servlet匹配多个路径
- 一个Servlet请求可以指定通用映射路径
- /*的操作
- 可以自己指定后缀规则
- 注意
-
- /和/*含义相同吗?
-
- 举几个小栗子吧
x💤
就我个人而言,这玩意儿很恶心,而且很容易混乱,特别是servlet的url-pattern匹配规则,以及一些“优先级”的问题,所以这篇博客也是拖的比较久,希望自己能够整理的好一些
ppp:所以这也是一期“拖延超久”的博客🤧🤧🤧
规则
-有关Servlet容器的匹配规则不是什么正则表达式,也不是简单的通配,它是有特定规则的所以望大家不要用通配符或者正则表达式的匹配规则去看待servlet的url-paddern,不然容易混淆,当然了,这也分为几种情况:
前提:
<servlet>
<servlet-name>hello</servlet-name>
<servlet-class>com.xmonster.HelloServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>hello</servlet-name>
<url-pattern>/hello</url-pattern>
</servlet-mapping>
精确匹配(一个servlet指定一个路径)
直接就是你项目的路径+‘/你想要的域名’
就比如上面已经列举的一个:
<servlet>
<servlet-name>hello</servlet-name>
<servlet-class>com.xmonster.HelloServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>hello</servlet-name>
<url-pattern>/hello</url-pattern>
</servlet-mapping>
访问一下:
就直接访问就行了,非常简单
一个servlet匹配多个路径
就是多个不同的路径可以访问同一个页面,同一个java文件的意思:
<servlet>
<servlet-name>url</servlet-name>
<servlet-class>com.xmonster.HelloServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>url</servlet-name>
<url-pattern>/url1</url-pattern>
</servlet-mapping>
<servlet-mapping>
<servlet-name>url</servlet-name>
<url-pattern>/url2</url-pattern>
</servlet-mapping>
<servlet-mapping>
<servlet-name>url</servlet-name>
<url-pattern>/url3</url-pattern>
</servlet-mapping>
<servlet-mapping>
<servlet-name>url</servlet-name>
<url-pattern>/url4</url-pattern>
</servlet-mapping>
效果:
一个Servlet请求可以指定通用映射路径
以“/”字符开头,并以“/*”结尾的字符串用于路径匹配,也就是/*的这个 * 可以是任意的
<servlet>
<servlet-name>url</servlet-name>
<servlet-class>com.xmonster.HelloServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>url</servlet-name>
<url-pattern>/url/*</url-pattern>
</servlet-mapping>
效果:
后面就算什么都不加都可以的,效果一样
/*的操作
<servlet>
<servlet-name>url</servlet-name>
<servlet-class>com.xmonster.HelloServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>url</servlet-name>
<url-pattern>/*</url-pattern>
</servlet-mapping>
index.jsp页面:
可见,将index.jsp页面覆盖了,由此也可以看出它的优先级比Index.jsp高,这种匹配规则我们是不太建议使用的,因为会把首页干掉
可以自己指定后缀规则
以“*.”开头的字符串被用于扩展名匹配
<servlet>
<servlet-name>url</servlet-name>
<servlet-class>com.xmonster.HelloServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>url</servlet-name>
<url-pattern>*.xmonster</url-pattern>
</servlet-mapping>
这个后缀你想加什么都可以的我这里只是举个例子
同样也是先进入index.jsp页面
效果:
只要最后的是.xmonster就行了,就是这么简单
除了/*的这种会把首页干掉,其他的都不会
注意
路径匹配和扩展名是无法同时配置的
从上面的4种情况可以总结:
- 路径匹配:也就是/开头或者/*结尾的情况
- 扩展名匹配:以*.开头
- 精确匹配
这三种情况不能够组合
/和/*含义相同吗?
答案当然是不同的嘛
优先级匹配顺序
前面讲到了一个“优先级”的问题,具体的排序:
什么都不写(就是直接一个/的情况)------>扩展名匹配------>路径匹配------>精确匹配
解释
“/*”属于路径匹配,优先级低于精确匹配,所以“/ *”会覆盖“/”的情况
“/”是servlet中特殊的匹配模式,切该模式有且仅有一个实例,优先级最低,不会覆盖其他任何url-pattern,只是会替换servlet容器的内建default servlet ,该模式同样会匹配所有request。
制定了固有的Mapping映射路径,优先级最高,如果找不到,就会走默认的处理请求
杂七杂八
总结经验就是:优先去看优先级顺序
“/*”和“/”均会拦截静态资源的加载,需要特别注意
举几个小栗子吧
快结束啦,举几个小栗子,相信大家很快就明白啦
URL | 对应的Servlet |
---|
/hello | s1 |
/hello/s/* | s2 |
/hello/* | s3 |
*.xmonster | s4 |
/ | s5 |
去请求试试~~
请求的URL | 实际请求的Servlet |
---|
/hello | s1 |
/hello/s/xmonster | s2 |
/hello/s/index.html | s2 |
/hello/xmonster | s3 |
/hello/index.html | s3 |
/index.xmonster | s4 |
/xmonster/index.xmonster | s4 |
/hello/index.jsp | s5 |
/login | s5 |
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)