Tomcat&Servlet(5)

简介: Tomcat&Servlet

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/任意

思考:

  1. 访问路径http://localhost:8080/web-demo/user是否能访问到demo9的doGet方法?
  2. 访问路径http://localhost:8080/web-demo/user/a/b是否能访问到demo9的doGet方法?
  3. 访问路径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>

配置完即可访问

这种配置方式和注解比起来,确认麻烦很多,所以建议使用注解来开发。但是要认识上面这种配置方式,因为并不是所有的项目都是基于注解开发的。

相关文章
|
7月前
|
Java 应用服务中间件 API
Servlet开发流程 (里面有Idea项目添加Tomcat依赖详细教程)
本文详细介绍了Servlet的开发流程,包括在IntelliJ IDEA中添加Tomcat依赖的详细教程。通过上述步骤,开发者可以快速搭建并运行一个基本的Servlet应用,理解并掌握Servlet的开发流程对于Java Web开发至关重要。希望本文能够帮助开发者顺利进行Servlet开发,提高工作效率。
576 78
|
Java 应用服务中间件 Maven
IDEA创建一个Servlet项目(tomcat10)
IDEA创建一个Servlet项目(tomcat10)
781 1
|
Java 应用服务中间件 Maven
JavaWeb基础5——HTTP,Tomcat&Servlet
JavaWeb技术栈、HTTP、get和post区别、响应状态码、请求响应格数据式、IDEA使用Tomcat、报错解决、Servlet的体系结构、IDEA使用模板创建Servlet
JavaWeb基础5——HTTP,Tomcat&Servlet
|
Java 应用服务中间件 Maven
Tomcat&Servlet(2)
Tomcat&Servlet
114 0
|
前端开发 应用服务中间件
|
JSON Java 应用服务中间件
|
XML Java 应用服务中间件
|
前端开发 Java 应用服务中间件
|
XML 前端开发 Java
Tomcat和Servlet
Tomcat和Servlet
94 0
|
前端开发 Java 应用服务中间件
HTTP&Tomcat&Servlet
HTTP&Tomcat&Servlet
122 0