一文了解Servlet

简介: Servlet是用于开发基于Java的Web应用程序的Java类。Servlet在Web服务器上运行,接收来自客户端(通常是Web浏览器)的请求并生成响应。Servlet提供了一种动态生成网页内容的方法。它可以接收HTTP请求,读取请求参数,与数据库进行交互,生成动态内容,并返回响应给客户端。Servlet通常被部署在Java Web容器(如Apache Tomcat)中。

[TOC]

1、什么是Servlet

  • Servlet是Java提供的一门动态web资源开发技术
  • Servlet是JavaEE规范之一,其实就是一个接口,将来我们需要定义Servlet接口,并由web服务器运行Servlet

2、Servlet快速入门

创建web项目,导入Servlet依赖坐标

<dependencies>
    <dependency>
        <groupId>javax.servlet</groupId>
        <artifactId>javax.servlet-api</artifactId>
        <version>3.1.0</version>
        <scope>provided</scope>
    </dependency>
</dependencies>

创建:定义一个类,实现Servlet接口,并重写接口中的所有方法,并在service方法中输入一句话

public class Demo01 implements Servlet {
   
   
    @Override
    public void init(ServletConfig servletConfig) throws ServletException {
   
   

    }
    @Override
    public ServletConfig getServletConfig() {
   
   
        return null;
    }
    @Override
    public void service(ServletRequest servletRequest, ServletResponse servletResponse) throws ServletException, IOException {
   
   
        System.out.println("hello");
    }
    @Override
    public String getServletInfo() {
   
   
        return null;
    }
    @Override
    public void destroy() {
   
   
    }
}

配置:在类上实用@WebServlet注解,配置该Servlet的访问路径

@WebServlet("/demo01")

访问:启动Tomcat,浏览器输入URL 访问该Servlet

image-20240118094411934

image-20240118094440749

3、Servlet生命周期

Servlet生命周期就是Servlet从创建到销毁的过程

image-20240118095753717

测试

@WebServlet("/demo01")
public class Demo01 implements Servlet {
   
   

    @Override
    public void init(ServletConfig servletConfig) throws ServletException {
   
   
        System.out.println("初始化方法");
    }

    @Override
    public void service(ServletRequest servletRequest, ServletResponse servletResponse) throws ServletException, IOException {
   
   
        System.out.println("hello");
    }

    @Override
    public void destroy() {
   
   
        System.out.println("销毁方法");
    }

​ 分别在init方法、service方法、destroy方法输出语句,运行时发现init方法调用一次,之后通过不断刷新,会重复调用service方法,直至关掉服务器调用destroy方法

image-20240118100310640

这样我们发现,只有访问网页,Servlet才会进行初始化,那如何在服务器启动的时候就加载Servlet

解决方法:为注解添加参数

@WebServlet(value = "/demo01",loadOnStartup = 1)
  1. 负整数:第一次访问时创建Servlet对象
  2. 0或正整数:服务器启动时创建Servlet对象,数字越小优先级越高

4、Servlet体系结构

image-20240118101805102

大部分开发B/S架构的web项目,都是针对HTTP协议,所以我们自定义Servlet,会继承HttpServlet

@WebServlet("/demo03")
public class Demo3 extends HttpServlet {
   
   
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
   
   
        System.out.println("这是demo3,doGet");
    }
    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
   
   
        System.out.println("demo3 doPost");
    }
}
  • 要想发送一个GET请求,请求该Servlet,只需要通过浏览器发送http://localhost:8080/web-demo/demo4,就能看到doGet方法被执行了
  • 要想发送一个POST请求,请求该Servlet,单单通过浏览器是无法实现的,这个时候就需要编写一个form表单来发送请求,在webapp下创建一个a.html页面,内容如下:
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>get & post</title>
</head>
<body>
    <h1>GET</h1>
    <form action="login" method="get">
        用户:<input type="text" name="username"><br>
        密码:<input type="password" name="password"><br>
        <input type="submit" value="登录">
    </form>

    <form action="login" method="post">
        用户:<input type="text" name="username"><br>
        密码:<input type="password" name="password"><br>
        <input type="submit" value="登录">
    </form>
</body>
</html>

启动测试,即可看到doPost方法被执行了。

5、urlPatern配置

Servlet类编写好后,要想被访问到,就需要配置其访问路径(urlPattern)

其实就是前面的value,两个属于等价关系,但是不能同时存在

@WebServlet(value = "/demo01",loadOnStartup = 1)

一个Servlet,可以配置多个urlPattern

urlPattern配置规则:

1、精确匹配

/**
配置路径
*/
@WebServlet(value = "/order/demo04")

访问路径:localhost:9999/Tomcat_war_exploded/order/demo04

2、目录匹配

/**
配置路径
*/
@WebServlet(value = "/order/*")

访问路径:localhost:9999/Tomcat_war_exploded/order/任意

表示order目录下的所有路径都能够访问

3、扩展名匹配

/**
配置路径
*/
@WebServlet(value = "*.do")

访问路径:localhost:9999/Tomcat_war_exploded/order/任意.do

4、任意匹配

/**
配置路径
*/
@WebServlet(value = "/*")

访问路径:localhost:9999/Tomcat_war_exploded/任意

访问优先级问题

  1. 前缀匹配高于后缀匹配
  2. 匹配原则:最佳匹配原则,哪个接近就访问哪个
  3. 优先级顺序:精确匹配>目录匹配>任意匹配>后缀匹配

6、XML编写Servlet

Servlet从3.0版本后开始支持使用注解配置,3.0版本前只支持XML配置文件的配置方法

步骤:

  1. 编写Servlet类
  2. 在web.xml中配置该Servlet

演示

编写Servlet类

public class demo5 extends HttpServlet {
   
   
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
   
   
        System.out.println("这是demo5,doGet");
    }


    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
   
   
        System.out.println("这是demo5, doPost");
    }
}

在web.xml中配置该Servlet

<!--给serlvet取名字-->
<servlet>
    <servlet-name>demo5</servlet-name>
    <servlet-class>org.example.servlet.demo5</servlet-class>
</servlet>
<!--根据servlet名字配置路径-->
<servlet-mapping>
    <servlet-name>demo5</servlet-name>
    <url-pattern>/demo5</url-pattern>
</servlet-mapping>

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

相关文章
|
存储 开发框架 JSON
区块链开发必备的9个Rust包
Rust是新一代的潜力巨大的开发语言。本文编辑整理了9个主流的用于以太坊、比特币、tendermint、eosio、polkadot等区块链开发的Rust包,可用于区块链应用的快速开发。
2358 0
|
Docker 容器
docker设置国内镜像源
docker设置国内镜像源
33976 5
|
JavaScript Java 测试技术
基于Java的宠物服务平台的设计与实现(源码+lw+部署文档+讲解等)
基于Java的宠物服务平台的设计与实现(源码+lw+部署文档+讲解等)
152 1
|
存储 弹性计算 NoSQL
阿里云服务器实例规格是什么?阿里云服务器实例常见问题及解答
本文介绍了阿里云服务器实例是什么、有什么作用、什么是企业级实例、什么是共享型实例、企业级实例与共享型实例有什么本质区别、如何选择适合我业务的ECS实例、在什么业务场景下,需要购买企业级实例等关于阿里云服务器实例的常见问题及解答,可供新手用户了解实例知识,从而选择适合自己业务场景的实例规格。
916 0
阿里云服务器实例规格是什么?阿里云服务器实例常见问题及解答
|
数据可视化 Python
Py之seaborn:数据可视化seaborn库(三)的矩阵图可视化之jointplot函数、JointGrid函数、pairplot函数、PairGrid函数、FacetGrid函数的简介、使用方法
Py之seaborn:数据可视化seaborn库(三)的矩阵图可视化之jointplot函数、JointGrid函数、pairplot函数、PairGrid函数、FacetGrid函数的简介、使用方法
Py之seaborn:数据可视化seaborn库(三)的矩阵图可视化之jointplot函数、JointGrid函数、pairplot函数、PairGrid函数、FacetGrid函数的简介、使用方法
|
编解码 Android开发
【Flutter】Android、Flutter 折叠屏适配 ( 展开大屏 | 折叠主屏 | 折叠副屏 | 静态展示 | 动态热切换适配 | 拉伸布局 | X 轴自适应适配 | 布局重构 )(一)
【Flutter】Android、Flutter 折叠屏适配 ( 展开大屏 | 折叠主屏 | 折叠副屏 | 静态展示 | 动态热切换适配 | 拉伸布局 | X 轴自适应适配 | 布局重构 )(一)
694 0
【Flutter】Android、Flutter 折叠屏适配 ( 展开大屏 | 折叠主屏 | 折叠副屏 | 静态展示 | 动态热切换适配 | 拉伸布局 | X 轴自适应适配 | 布局重构 )(一)
|
监控 算法 Java
行业场景限流方案
前言    行业中许多三方服务上线支付宝后,ISV对自身的业务系统没有任何的流量保护,往往会被瞬间的流量,高并发导致系统承载力出现瓶颈,甚至被打垮的挑战。面对行业场景业务的稳定性痛点,我们往往采取限流熔断的机制来保障ISV自身系统在承诺容量下的稳定运行。
2957 1
|
存储 缓存 分布式计算
性能估算-汇总【转】
假期重新把之前在新浪博客里面的文字梳理了下,搬到这里。
857 0
|
SQL 存储 NoSQL
王者荣耀背后的实时大数据平台用了什么黑科技?
实时方面主要是补足我们对游戏运营的体验,比如说在游戏里玩完一局或者做完一个任务后,立马就能得到相应的奖励,或者下一步的玩法指引。对用户来说,这种及时的刺激和干预,对于他们玩游戏的体验会更好。其实不单单是游戏,其他方面也是一样的,所以我们在做这套系统的时候,就是离线+实时结合着用,但主要还是往实时方面去靠拢,未来大数据的方向也是,尽量会往实时方向去走。
王者荣耀背后的实时大数据平台用了什么黑科技?