一文了解Servlet

news2024/11/25 18:28:54

文章目录

      • 1、什么是Servlet
      • 2、Servlet快速入门
      • 3、Servlet生命周期
      • 4、Servlet体系结构
      • 5、urlPatern配置
      • 6、XML编写Servlet

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>

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1393631.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

STM32F103标准外设库——RCC时钟(六)

个人名片&#xff1a; &#x1f981;作者简介&#xff1a;一名喜欢分享和记录学习的在校大学生 &#x1f42f;个人主页&#xff1a;妄北y &#x1f427;个人QQ&#xff1a;2061314755 &#x1f43b;个人邮箱&#xff1a;2061314755qq.com &#x1f989;个人WeChat&#xff1a;V…

【昕宝爸爸小模块】深入浅出之POI是如何做大文件的写入的

➡️博客首页 https://blog.csdn.net/Java_Yangxiaoyuan 欢迎优秀的你&#x1f44d;点赞、&#x1f5c2;️收藏、加❤️关注哦。 本文章CSDN首发&#xff0c;欢迎转载&#xff0c;要注明出处哦&#xff01; 先感谢优秀的你能认真的看完本文&…

【JVM】性能调优

一、前言 性能调优&#xff0c;顾名思义&#xff0c;就是对系统或软件的性能进行优化&#xff0c;以提高其运行效率和响应速度。在计算机科学中&#xff0c;性能调优通常涉及到硬件、操作系统、数据库、网络等多个方面。对于Java开发者来说&#xff0c;JVM&#xff08;Java虚拟…

centos7 arm服务器编译升级安装动态库libstdc++.so.6,解决GLIBC和CXXABI版本低的问题

前言 由于centos7内置的libstdc.so.6版本太低&#xff0c;导致安装第三方包的时候&#xff0c;会报“CXXABI_1.3.8”不存在等问题。 自带的打印如下&#xff1a; strings /usr/lib64/libstdc.so.6 | grep GLIBC strings /usr/lib64/libstdc.so.6 | grep CXXABI 如图 升级 注…

RK3399平台入门到精通系列讲解(USB篇)UDC 层 usb_gadget_probe_driver 接口分析

🚀返回总目录 文章目录 一、UDC:usb_gadget_probe_driver函数分析二、usb_gadget_driver 结构详细介绍三、usb_udc 结构详细介绍一、UDC:usb_gadget_probe_driver函数分析 UDC层的一项基本任务是向上层提供usb_gadget_probe_driver()接口函数。 上层调用者为composite.c中…

【征服redis7】谈谈Redis的RDB持久化方式

从现在开始&#xff0c;我们来探讨redis的一个非常重要的问题——集群&#xff0c;要讨论集群&#xff0c;我们需要先理解redis持久化数据的方法&#xff0c;因为集群本质上就是将一个集群的数据同步到其他机器上。 Redis 6的持久化机制主要有两种&#xff1a;RDB&#xff08;…

WordPress回收站自动清空时间?如何关闭回收站或设置自动清理天数?

我们在WordPress后台的文章、页面、评论等页面都可以看到有回收站&#xff0c;意思就是我们不能直接删除某篇文章、页面、评论&#xff0c;而是需要现将它们移至回收站&#xff0c;然后再到回收站永久删除&#xff0c;或等回收站自动清理。 如上图所示&#xff0c;WordPress 6.…

Django笔记(一):环境部署

目录 Python虚拟环境 安装virtualenv 创建环境 激活环境 关闭&#xff1a; 安装Django VSCode配置 Python插件 Django插件 解释器选择 Django部署 创建项目 创建app 创建模板 编写视图 编写路由 启动服务器 访问 Python虚拟环境 安装virtualenv pip i…

H5小游戏如何提升APP变现收益?

在当前用户规模稳定但变现压力增加的背景下&#xff0c;开发者需要挖掘用户价值&#xff0c;提高营收&#xff0c;这成为开发者关注的重点话题。对于那些“用户用完即走”的APP产品来说&#xff0c;接入H5游戏能够吸引停留&#xff0c;为其带来收入上的增长。 一、什么是H5游戏…

面经-redis缓存

什么是Redis Redis(Remote Dictionary Server)键只能为字符串&#xff0c;值&#xff1a;字符串、列表、集合、散列表、有序集合。Redis 用来做分布式锁。支持事务 、持久化、LUA脚本、LRU驱动事件、多种集群方案。 Redis为什么这么快 完全基于内存&#xff0c;数据结构简单…

如何在CentOS下使用Docker部署Halo博客网站并结合内网穿透远程访问

文章目录 ⛳️ 推荐1. Docker部署Halo1.1 检查Docker版本如果未安装Docker可参考已安装Docker步骤&#xff1a;1.2 在Docker中部署Halo 2. Linux安装Cpolar2.1 打开服务器防火墙2.2 安装cpolar内网穿透 3. 配置Halo个人博客公网地址4. 固定Halo公网地址 ⛳️ 推荐 前些天发现了…

selenium-java中切换iframe

1、当iframe中有固定的name或者id时可以通过name和id进行切换,代码如下 driver.switchTo().frame("name"); 2、当iframe中没有固定的name或者id时可以通过iframe角标进行切换&#xff0c;在浏览器通过ctrlf快捷键&#xff0c;搜索标签框输入//iframe;来查看当前ifr…

web开发学习笔记(9.Tomcat介绍)

1.简介 2.tomcat和nginx等web应用服务器的区别 http://t.csdnimg.cn/OL9Qt 3.tomcat基本使用 4.tomcat更改端口号 5. 部署

三大爆款婴儿洗衣机深度测评,希亦、小吉、鲸立哪款最值得入手?

婴儿洗衣机&#xff0c;顾名思义就是专门给婴儿使用的洗衣机&#xff0c;它的功能更加有针对性&#xff0c;同时设计上也有普通洗衣机不同。对于不少有工作的宝爸宝妈而言&#xff0c;在日常生活中并没有充足的时间可以给孩子洗衣物&#xff0c;婴儿洗衣机是非常有必要买的。而…

使用freessl为网站获取https证书及配置详细步骤

文章目录 一、进入freessl网站二、修改域名解析记录三、创建证书四、配置证书五、服务启动 一、进入freessl网站 首先进入freessl网站&#xff0c;需要注册一个账号 freessl网站 进入网站后填写自己的域名 接下来要求进行DCV配置 二、修改域名解析记录 到域名管理处编辑域名…

服务器——Vscode选择虚拟环境编译器后,无法跳转至对应的python路径的解决办法

一、现象 输入 which python&#xff0c;显示 /bin/python&#xff0c;而不是对应的python路径。 二、原因分析 该用户账户下的.bashrc文件手动指定了python路径。 三、解决办法 将手动指定的python路径代码注释&#xff0c;这样就跟随编译器&#xff0c;自动选择python路…

k8s---对外服务 ingress

目录 目录 目录 ingress与service ingress的组成 ingress-controller&#xff1a; ingress暴露服务的方式 2.方式二&#xff1a;DaemonSethostnetworknodeSelector DaemonSethostnetworknodeSelector如何实现 3.deploymentNodePort&#xff1a; 虚拟主机的方式实现http代…

戴森持续深耕室内空气质量研究,携手商业空间打造全场景的洁净呼吸新体验

[2024年 1 月 18 日, 中国上海] 随着气温的日渐下降&#xff0c;家人陪伴和好友相聚也逐渐回归室内。和三两好友一起动手做些烘焙美食&#xff0c;相约美术馆看展&#xff0c;或室内亲子乐园成为不少家庭冬日生活的新风尚。为了进一步洞察消费者生活方式背后对于健康呼吸的多样…

Mybatis----面向接口

让mybatis自动生成dao层接口的实现类 这是dao层接口的实现类&#xff0c;在mybatis中我们可以省略这种实现接口的方式&#xff0c;直接面向接口操作数据库&#xff0c;mybatis可以帮我们自动生成接口的实现类&#xff0c;也就是下面这个实现类mybatis帮我们生成了。 1、修改se…

鸿蒙开发之状态管理

State 组件内状态 State装饰的变量&#xff0c;会和自定义组件的渲染绑定起来。当状态改变时&#xff0c;UI会发生对应的渲染改变。在状态变量相关装饰器中&#xff0c;State是最基础的&#xff0c;使变量拥有状态属性的装饰器&#xff0c;它也是大部分状态变量的数据源。 装…