Tomcat&Servlet(4)https://developer.aliyun.com/article/1530544
4.7 urlPattern配置
Servlet类编写好后,要想被访问到,就需要配置其访问路径(urlPattern)
[[Tomcat&Servlet#4.4 生命周期]]
- 一个Servlet,可以配置多个urlPattern
package com.itheima.web; import javax.servlet.ServletRequest; import javax.servlet.ServletResponse; import javax.servlet.annotation.WebServlet; /** * urlPattern: 一个Servlet可以配置多个访问路径 */ @WebServlet(urlPatterns = {"/demo7","/demo8"}) public class ServletDemo7 extends MyHttpServlet { @Override protected void doGet(ServletRequest req, ServletResponse res) { System.out.println("demo7 get..."); } @Override protected void doPost(ServletRequest req, ServletResponse res) { } }
在浏览器上输入http://localhost:8080/web-demo/demo7
,http://localhost:8080/web-demo/demo8
这两个地址都能访问到ServletDemo7的doGet方法。
urlPattern配置规则
- 精确匹配
/** * UrlPattern: * * 精确匹配 */ @WebServlet(urlPatterns = "/user/select") public class ServletDemo8 extends MyHttpServlet { @Override protected void doGet(ServletRequest req, ServletResponse res) { System.out.println("demo8 get..."); } @Override protected void doPost(ServletRequest req, ServletResponse res) { } }
^8f0i07
访问路径http://localhost:8080/web-demo/user/select
- 目录匹配
package com.itheima.web; import javax.servlet.ServletRequest; import javax.servlet.ServletResponse; import javax.servlet.annotation.WebServlet; /** * UrlPattern: * * 目录匹配: /user/* */ @WebServlet(urlPatterns = "/user/*") public class ServletDemo9 extends MyHttpServlet { @Override protected void doGet(ServletRequest req, ServletResponse res) { System.out.println("demo9 get..."); } @Override protected void doPost(ServletRequest req, ServletResponse res) { } }
访问路径http://localhost:8080/web-demo/user/任意
思考:
- 访问路径
http://localhost:8080/web-demo/user
是否能访问到demo9的doGet方法? - 访问路径
http://localhost:8080/web-demo/user/a/b
是否能访问到demo9的doGet方法? - 访问路径
http://localhost:8080/web-demo/user/select
是否能访问到demo9还是demo8的doGet方法?
答案是: 能、能、demo8,进而我们可以得到的结论是/user/*
中的/*
代表的是零或多个层级访问目录同时精确匹配优先级要高于目录匹配。
- 扩展名匹配
package com.itheima.web; import javax.servlet.ServletRequest; import javax.servlet.ServletResponse; import javax.servlet.annotation.WebServlet; /** * UrlPattern: * * 扩展名匹配: *.do */ @WebServlet(urlPatterns = "*.do") public class ServletDemo10 extends MyHttpServlet { @Override protected void doGet(ServletRequest req, ServletResponse res) { System.out.println("demo10 get..."); } @Override protected void doPost(ServletRequest req, ServletResponse res) { } } 访问路径`http://localhost:8080/web-demo/任意.do` 注意: 1. 如果路径配置的不是扩展名,那么在路径的前面就必须要加`/`否则会报错 ![\[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-bdGmm4XG-1686574478597)(h\]](https://ucc.alicdn.com/images/user-upload-01/69a09263070c4bc1bcf6654707afde76.png) 2. 如果路径配置的是`*.do`,那么在*.do的前面不能加`/`,否则会报错 ![162727a4368245](https://ucc.alicdn.com/images/user-upload-01/img_convert/102a6b370fc32ddcd1f67050d78103b2.png)
- 任意匹配
/*
的优先级更高
package com.itheima.web; import javax.servlet.ServletRequest; import javax.servlet.ServletResponse; import javax.servlet.annotation.WebServlet; /** * UrlPattern: * * 任意匹配: / */ @WebServlet(urlPatterns = "/") public class ServletDemo11 extends MyHttpServlet { @Override protected void doGet(ServletRequest req, ServletResponse res) { System.out.println("demo11 get..."); } @Override protected void doPost(ServletRequest req, ServletResponse res) { } } 访问路径`http://localhost:8080/demo-web/任意` ```java package com.itheima.web; import javax.servlet.ServletRequest; import javax.servlet.ServletResponse; import javax.servlet.annotation.WebServlet; /** * UrlPattern: * * 任意匹配: /* */ @WebServlet(urlPatterns = "/*") public class ServletDemo12 extends MyHttpServlet { @Override protected void doGet(ServletRequest req, ServletResponse res) { System.out.println("demo12 get..."); } @Override protected void doPost(ServletRequest req, ServletResponse res) { } } 访问路径`[http://localhost:8080/demo-web/](http://localhost:8080/demo-web/)任意 注意:`/`和`/*`的区别? 1. 当我们的项目中的Servlet配置了 "/",会覆盖掉tomcat中的**DefaultServlet**,当其他的url-pattern都匹配不上时都会走这个Servlet 2. 当我们的项目中配置了`"/*"`,意味着匹配任意访问路径 3. DefaultServlet是用来处理==静态资源==(也就是网页),如果配置了"/"会把默认的覆盖掉,就会引发请求静态资源的时候没有走默认的而是走了自定义的Servlet类,最终导致静态资源不能被访问 ![image.png](https://ucc.alicdn.com/images/user-upload-01/img_convert/6cde3436a73b1492f562840f74d0d068.png)
4.8 XML配置
前面对应Servlet的配置,我们都使用的是@WebServlet,这个是Servlet从3.0版本后开始支持注解配置,3.0版本前只支持XML配置文件的配置方法。
对于XML的配置步骤有两步:
- 编写Servlet类
package com.itheima.web; import javax.servlet.ServletException; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import java.io.IOException; public class ServletDemo3 extends HttpServlet { @Override protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { System.out.println("demo4..."); } @Override protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { } }
- 在web.xml中配置该Servlet
<!DOCTYPE web-app PUBLIC "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN" "http://java.sun.com/dtd/web-app_2_3.dtd" > <web-app> <display-name>Archetype Created Web Application</display-name> <!-- servlet全类名--> <servlet> <!-- servlet的名称,名字任意--> <servlet-name>demo4</servlet-name> <!--servlet的类全名--> <servlet-class>com.itheima.web.ServletDemo3</servlet-class> </servlet> <!-- servlet访问路径--> <servlet-mapping> <!-- servlet的名称,要和上面的名称一致--> <servlet-name>demo4</servlet-name> <!-- servlet的访问路径-- <url-pattern>/demo4</url-pattern> </servlet-mapping> </web-app>
配置完即可访问
这种配置方式和注解比起来,确认麻烦很多,所以建议使用注解来开发。但是要认识上面这种配置方式,因为并不是所有的项目都是基于注解开发的。