您当前的位置: 首页 > 慢生活 > 程序人生 网站首页程序人生
15-urlPattern配置(WebServlet注解配置各种url访问路由)
发布时间:2024-11-26 22:55:27编辑:雪饮阅读()
-
urlPatterns其实就是WebServlet注解的第一个参数名,如果只有一个url,则可以忽略不写,但urlPatterns支持多个参数的匹配。
例如
package com;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
@WebServlet(urlPatterns = {"/url1","/url2"})
public class HttpServlet1 extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
System.out.println("doGet 1");
}
}
那么此时访问http://localhost:8080/servlet01/url1和访问localhost:8080/servlet01/url2都是会输出doGet 1于控制台中的。
urlPatterns还支持精确匹配,如
@WebServlet("/url1/url2")
那么访问如
localhost:8080/servlet01/url1/url2
其实我这里觉得上面的urlPatterns的多个参数示例里面都算是精确匹配了。
精确匹配就是访问的path里面从当前项目后的相对路径必须和urlPatterns的参数值一样。
urlPatterns还支持目录匹配,如
@WebServlet("/url1/*")
那么可以访问如
localhost:8080/servlet01/url1/url3
目录匹配就是*部分可以是任意合法url字符都将匹配到当前servlet。
当然精确匹配的优先级是大于目录匹配的,例如访问如
localhost:8080/servlet01/url1/url2
则会是上面精确匹配的结果,虽然目录匹配也是满足的。
urlPatterns还支持扩展名匹配
扩展名匹配,不能以斜杠开头,例如
@WebServlet("/*.do")
这样就会导致tomcat都启动不了,报错于控制台如
Failed to execute goal org.apache.tomcat.maven:tomcat7-maven-plugin:2.2:run (default-cli) on project servlet01: Could not start Tomcat
即便是这样@WebServlet("/url1/*.do")
也是不可以的。必须如@WebServlet("*.do")
这样的才可以,那么访问则可以如
localhost:8080/servlet01/r.do
这里*号部分可以匹配任何合法url字符。
urlPatterns还支持任意匹配,如@WebServlet("/")
任意匹配的优先级低于扩展名匹配。那么这里访问如localhost:8080/servlet01/r.do还是会进入上面的扩展名匹配的示例中的。但如果你这样访问localhost:8080/servlet01/r.do1就又回到了任意匹配中了。
这任意匹配的/会覆盖掉tomcat中的DefaultServlet,当其他的url-pattern都匹配不上时都会走这个Servlet,这个默认的Servlet位于tomcat的conf\web.xml中的配置如:
<servlet>
<servlet-name>default</servlet-name>
<servlet-class>org.apache.catalina.servlets.DefaultServlet</servlet-class>
<init-param>
<param-name>debug</param-name>
<param-value>0</param-value>
</init-param>
<init-param>
<param-name>listings</param-name>
<param-value>false</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
</servlet>
这里,那么其对应的urlPatterns配置又在同文件中的如
<servlet-mapping>
<servlet-name>default</servlet-name>
<url-pattern>/</url-pattern>
</servlet-mapping>
这里可以看到默认配置路径其实就是/
那么也就是说会阻止默认的url访问如
http://localhost:8080/servlet01/
这里本来应该是如果你的webapp里面有个index.html
则会将index.html渲染出来做为响应的。
那么匹配了/后就只会以当前servlet进行响应。
那么urlPatterns还有第二种任意匹配的写法,如
@WebServlet("/*")
这样写则访问可以如localhost:8080/servlet01/index.html
那么你会发现这里仍旧也是可以覆盖默认的静态文件的响应,而是以当前servlet进行响应。
并且同时可以发现/*的优先级是高于/的。
这里总结一下urlPatterns的目前这些匹配模式的优先级。
精确路径>目录路径>扩展名路径>/*>/
实际上看起来这么多urlPatterns,但实际上项目中不能这些都用的,一般我觉得吧应该也就是1-2种。
关键字词:urlPattern,WebServlet,url
上一篇:14-Servlet方法介绍
相关文章
- unipush推送008云函数url化的入参(get)
- unipush推送007云函数url化(服务对外访问)
- 03_Servlet_urlpartten配置
- 12_Servlet_执行原理(url访问路由按项目前缀)
- uniapp系列之webview加载html 动态创建webview 非url
- android studio關於gradle的版本更換及distributionUr
- webman-路由-url生成
- webman-請求-獲取請求url、請求全url、請求協議版本、
- 【第19章:Java网络编程】_URLEncoder与URLDecoder
- 【第19章:Java网络编程】_URL与URLConnection