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>

配置完即可访问

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

相关文章
|
8月前
|
前端开发 应用服务中间件 C++
使用Servlet实现表白墙网站(前后端互联)小项目,Mac的M1(没有setting)在哪里找到Setting页面,下载smart tomcat及smart tomcat的配置。(二)
使用Servlet实现表白墙网站(前后端互联)小项目,Mac的M1(没有setting)在哪里找到Setting页面,下载smart tomcat及smart tomcat的配置。
使用Servlet实现表白墙网站(前后端互联)小项目,Mac的M1(没有setting)在哪里找到Setting页面,下载smart tomcat及smart tomcat的配置。(二)
|
22天前
|
前端开发 应用服务中间件
|
1月前
|
JSON Java 应用服务中间件
|
22天前
|
XML Java 应用服务中间件
|
22天前
|
Java 应用服务中间件 Maven
|
22天前
|
前端开发 Java 应用服务中间件
|
1月前
|
XML 前端开发 Java
Tomcat和Servlet
Tomcat和Servlet
16 0
|
1月前
|
前端开发 Java 应用服务中间件
HTTP&Tomcat&Servlet
HTTP&Tomcat&Servlet
65 0
|
8月前
|
Java 应用服务中间件 Linux
HTTPS && Tomcat && Servlet && 博客系统 && 软件测试的概念 && Linux
HTTPS && Tomcat && Servlet && 博客系统 && 软件测试的概念 && Linux
38 0
|
5天前
|
自然语言处理 前端开发 Java
Servlet与JSP:Java Web开发的基石技术详解
【6月更文挑战第23天】Java Web的Servlet与JSP是动态网页的核心。Servlet是服务器端的Java应用,处理HTTP请求并响应;JSP则是结合HTML与Java代码的页面,用于动态内容生成。Servlet通过生命周期方法如`init()`、`service()`和`destroy()`工作,而JSP在执行时编译成Servlet。两者在MVC架构中分工,Servlet处理逻辑,JSP展示数据。尽管有Spring MVC等框架,Servlet和JSP仍是理解Web开发基础的关键。