7、Servlet——Servlet核心接口和类、创建Servlet的三种方式

news2025/1/18 3:31:32

目录

一、Servlet核心接口和类

1、Servlet接口

2、GenericServlet抽象类 

3、HttpServlet类 

二、创建Servlet的三种方式

1、实现Servlet接口 

2、继承GenericServlet抽象类

3、继承HttpServlet类

三、web.xml中其他配置

1、启动优先级:

2、url-pattern定义匹配规则

四、 使用注解配置


一、Servlet核心接口和类

1、Servlet接口

在Servlet API中最重要的是Servlet接口,所有Servlet都会直接或间接的与该接口发生联系,或是直接实现该接口,或间接继承自实现了该接口的类。该接口中包括以下5个方法:

destroy()
ServletConfig getServletConfig()
String getServletInfo()
void init(ServletConfig arg0)
void service(ServletRequest arg0, ServletResponse arg1)

void init(ServletConfig arg0)Servlet实例化后,Servlet容器调用该方法完成Servlet的初始化工作
ServletConfig getServletConfig()获取Servlet对象的配置信息
String getServletInfo()返回包含Servlet对象的配置信息
void service(ServletRequest arg0, ServletResponse arg1)

负责响应用户的请求,当容器接收到客户端访问Servlet对象的请求时就会调用此方法。

容器会构造一个表示客户端请求信息的ServletRequest对象和一个用于响应客户端的ServletResponse对象作为参数传递给service()方法,在service()方法中可以通过ServletRequest对象得到客户端的相关信息和请求信息,在对请求进行处理后,调用ServletResponse

void destroy()负责释放Servlet对象占用的资源,当服务器关闭或者Servlet对象被移除时会销毁Servlet对象,此时会调用此方法

2、GenericServlet抽象类 

GenericServlet抽象类使编写Servlet变得更容易。它提生命周期方法init和destroy的简单实现,要编写一般的Servlet,只需要重写service方法即可。  

3、HttpServlet类 

HttpServlet是在继承GenericServlet的基础上进一步的扩展。提供将要被子类化以创建适用于Web站点的HTTP servlet的抽象类

HTTPServlet的子类至少必须重写一个方法,该方法通常是:

  • doGet():用于HTTP GET请求

  • doPost():用于HTTP POST请求

  • doPut():用于HTTP PUT请求

  • doDelete():用于HTTP DELETE请求

二、创建Servlet的三种方式

1、实现Servlet接口 

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd"
         version="4.0">
    <servlet>
        <servlet-name>myservlet</servlet-name>
        <servlet-class>com.servlet.demo.MyServlet</servlet-class>
    </servlet>
    <servlet-mapping>
        <servlet-name>myservlet</servlet-name>
        <url-pattern>/MyServlet</url-pattern>
    </servlet-mapping>
</web-app>
package com.servlet.demo;

import javax.servlet.*;
import java.io.IOException;

public class MyServlet 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("第一个Servlet案例:实现Servley接口创建Servlet类");
    }

    @Override
    public String getServletInfo() {
        return null;
    }

    @Override
    public void destroy() {

    }
}

2、继承GenericServlet抽象类

实现一个类必须实现Servlet接口,但是真正使用到的只有一个service方法,其他的方法都没有使用到;GenericServlet抽象类只需要重写service方法即可。

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd"
         version="4.0">
    <servlet>
        <servlet-name>myservlet</servlet-name>
        <servlet-class>com.servlet.demo.MyGenericServlet</servlet-class>
    </servlet>
    <servlet-mapping>
        <servlet-name>myservlet</servlet-name>
        <url-pattern>/MyGenericServlet</url-pattern>
    </servlet-mapping>
</web-app>
package com.servlet.demo;

import javax.servlet.GenericServlet;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import java.io.IOException;

public class MyGenericServlet extends GenericServlet {
    @Override
    public void service(ServletRequest servletRequest, ServletResponse servletResponse) throws ServletException, IOException {
        System.out.println("第二个Servlet案例:继承GenericServlet抽象类创建Servlet");
    }
}

 

3、继承HttpServlet类

创建一个类,继承HttpServlet类,重写doGet()doPost()方法,在doGet()方法中编辑要处理的代码,在doPost()中调用doGet()方法

        --->request是请求,浏览器中的请求,就通过request来获取(request操作后端);

        --->response是响应,浏览器的响应可以通过response来实现(response操作前端)。

在浏览器中输入访问地址,访问地址相当于发送一个请求,到后台来,servlet类处理请求,在servlet来中默认找doGet方法

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd"
         version="4.0">
    <servlet>
        <servlet-name>myservlet</servlet-name>
        <servlet-class>com.servlet.demo.MyHttpServlet</servlet-class>
    </servlet>
    <servlet-mapping>
        <servlet-name>myservlet</servlet-name>
        <url-pattern>/MyHttpServlet</url-pattern>
    </servlet-mapping>
</web-app>
package com.servlet.demo;

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 MyHttpServlet extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        System.out.println("第三个servlet案例,继承HttpServlet类创建Servlet");
        resp.getWriter().println("Hello!Servlet");
    }

    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        doGet(req, resp);
    }
}

通过response对象调用一个输出流(PrintWriter),在浏览器页面进行输出。 

三、web.xml中其他配置

1、启动优先级:<load-on-startup>

在<Servlet>节点中可设置启动的Servlet启动的优先级

<load-on-startup>1</load-on-startup>

(1)元素标记容器是否应该在web应用程序启动的时候就加载这个servlet。

(2)它的值必须是一个整数,表示servlet被加载的先后顺序。

(3)如果该元素的值为负数或者没有设置,则容器会当servlet被请求时再加载。

(4)如果值为整数或0时,表示容器在应用启动时就加载并初始化这个servlet,值越小,servlet的优先级越高,就越先被加载。值相同时,容器就会自己选择顺序来加载。

2、url-pattern定义匹配规则

    精确匹配        /             具体的名称  只有url路径是具体的名称的时候才会触发Servlet
    后缀匹配        *.xxx      只要是以xxx结尾的就匹配触发Servlet
    通配符匹配      /*         匹配所有请求,包含服务器的所有资源
    通配符匹配      /          匹配所有请求,包含服务器的所有资源,不包括.jsp

四、 使用注解配置

所有的注解都以“@”开头(如@Override(重写));Servlet注解格式:@WebServlet( )

package com.servlet.study;

import javax.servlet.*;
import javax.servlet.http.*;
import javax.servlet.annotation.*;
import java.io.IOException;

@WebServlet(name = "Servlet", value = "/Servlet")
public class Servlet extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        System.out.println("第四个servlet案例:注解的使用");
        response.getWriter().println("@WebServlet");
    }

    @Override
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        doGet(request, response);
    }
}

 

@WebServlet注解常用属性:

name:Servlet名字(可选);

value:配置url路径,可以配置多个;

urlPatterns:配置url路径,和value作用一样,不能同时使用;

loadOnStartup:配置Servlet的创建的时机,如果是0或者正数,启动程序时创建,如果是负数,则访问时创建。数字越小优先级越高。

 

 

 

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

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

相关文章

【SpringCloud02】订单-支付微服务模块(支付模块构建)

1.微服务cloud整体聚合父工程Project New Project 聚合总父工程名字 Maven选版本 工程名字 字符编码 注解生效激活 Java编译版本选8 File Type过滤 2.父工程POM 2.1Pom.xml文件 <project xmlns"http://maven.apache.org/POM/4.0.0" xmlns:xsi&quo…

docker中MySQL忘记登录密码找回方法

查看docker启动列表 docker ps 进入启动的mysql容器中 docker exec -it mysql /bin/bash 修改mysql配置文件 vim /etc/mysql/conf.d/docker.cnf 在最后添加 skip-grant-tables 如果出现命令没找到&#xff0c;则需要安装。 依次使用以下命令安装vim apt-get update apt…

java 系列文章之异常

文章目录一、概念二、异常分类1. Error2. Exception三、异常的处理方式四、Throw 和 throws 的区别1. 位置不同2. 功能不同总结一、概念 果某个方法不能按照正常的途径完成任务&#xff0c;就可以通过另一种路径退出方法。在这种情况下会抛出一个封装了错误信息的对象。此时&a…

关于单行处理函数——ifnull()

我们先来看一个实例&#xff1a; 需求&#xff1a;在员工表emp中查看员工的年薪 分析&#xff1a;计算年薪除了月薪外补助也应该计算在内&#xff0c;所以年薪 (月薪 补助) * 12 sql语句&#xff1a;select ename,(sal comm) *12 as 年薪 from emp; …

SpringBoot+Vue项目在线拍卖系统

文末获取源码 开发语言&#xff1a;Java 框架&#xff1a;springboot JDK版本&#xff1a;JDK1.8 服务器&#xff1a;tomcat7 数据库&#xff1a;mysql 5.7/8.0 数据库工具&#xff1a;Navicat11 开发软件&#xff1a;eclipse/myeclipse/idea Maven包&#xff1a;Maven3.3.9 浏…

编译原理分析器大作业之字幕分析器

写这篇文章的主要目的呢是分享一下编译原理大作业——电影字幕分析器&#xff0c;分享一下我的做法&#xff0c;可能采用的做法不是特别好的用法&#xff0c;希望各位多多指点&#xff0c;觉得文章不错给点小赞赞喔!!! 题目介绍 写一个srt字幕解释器&#xff0c;需要分析单词…

动手深度学习-线性神经网络:线性回归

目录线性模型&#xff08;1&#xff09;度量模型质量-损失函数&#xff08;2&#xff09;更新模型以提高模型预测质量-随机梯度下降线性回归的从零开始实现线性回归的简洁实现参考教程&#xff1a;https://courses.d2l.ai/zh-v2/线性模型 定义&#xff1a;回归&#xff08;reg…

FFmpeg音频重采样API(libswresample)

目录 参考 lswr功能介绍 lswr使用说明 示例代码 \1. 参考 [1] FFmpeg/Libswresample Documentation [2] FFmpeg/Libswresample Detailed Description [3] FFmpeg/doc/examples/resampling_audio.c \2. lswr功能介绍 FFmpeg中重采样的功能由libswresample(后面简写为lswr…

代码随想录训练营第五十七天

1.回文子串 题647 ①dp数组含义 判断回文子串可以用头元素和尾元素是否相等的方式&#xff0c;设dp[i] [j]为[i,j]子串是否为回文子串&#xff0c;是则为true&#xff0c;否为false。 ②递推公式 若 s[i] s[j] &#xff0c;分三种情况&#xff1a;i j&#xff0c;即只有一…

Leetcode数组专题专练:经典题目+思路解读

文章目录 系列&#xff1a;数组专练 语言&#xff1a;java & go 题目来源&#xff1a;Leetcode 常考点&#xff1a; 二分 & 双指针 & 滑动窗口 & 模拟行为 思路和参考答案文章目录数组专题总结二分法专练双指针专练滑动窗口专练模拟行为专练题目描述数组专题总…

cnn平移等变性和不变性

通俗说法: 等变性&#xff08;Equivariance&#xff09;&#xff1a;对一个输入施加某种变换后所产生的结果同样反应在输出上&#xff0c;说明该变换具有等变性。寻找一个从输入图像到输出类别的映射&#xff0c;这个映射对目标的几何变换(如平移&#xff0c;旋转&#xff0c;…

linux系统中如何使用QT来进行网络编程实现

大家好&#xff0c;今天主要和大家分享一下&#xff0c;如何使用QT进行网络编程与实现。 目录 第一&#xff1a;网络编程基本简介 第二&#xff1a;TCP通信简介 第三&#xff1a;TCP服务器端代码具体实现 第四&#xff1a;源文件mainwindow.cpp的具体实现 第一&#xff1a;…

console的常用方法

console的常用方法&#x1f913; 这篇文章我们来总结一下前端常用的一些调试技巧。&#x1f913;&#x1f913;&#x1f913;&#x1f913;&#x1f913; 说到调试&#xff0c;我们避免不了console这个对象&#xff0c;在它身上有许多的方法&#xff0c;我们来看看最常用的几…

Java 处理JSON 数据小结

Java 处理 JSON 数据小结 JSON的格式类型 JSON有三种格式类型&#xff1a;基本类型、数组类型、对象嵌套 基本类型 格式说明&#xff1a;{“键” : 值, “键” : “值”,…}&#xff0c;以大括号开始&#xff0c;键的名称加上冒号&#xff0c;然后跟上对应的的值&#xff0…

【Git】Git分支操作

4、Git 分支操作 4.1、什么是分支 在版本控制过程中&#xff0c;同时推进多个任务&#xff0c;为每个任务&#xff0c;我们就可以创建每个任务的单独分支。使用分支意味着程序员可以把自己的工作从开发主线上分离开来&#xff0c;开发自己分支的时候&#xff0c;不会影响主线分…

复制PDF文字时去掉换行符

问题描述 当我们在pdf上复制文字时&#xff0c;每行总会出现换行符&#xff0c;乱糟糟的。 解决方法 ⚠️注意&#xff1a; windows推荐开源软件cpoy&#xff1a;gihub:copy 临时使用&#xff0c;推荐网页&#xff1a;文字替换在线处理工具 在快捷指令中新建“快捷服务”&…

RHCE学习笔记-253-2

electronic mail services(sendmail,postfix) sendmail features 支持许多种不同邮件地址的格式 TCP/IP userhostname BitNet UUCP FidoNet MCImail 可以伪装邮寄者寄出去的邮件 当传送失败自动重试 security and “anti-spam” features 安全性特性 如果无法解析地址就退回这封…

C++学习之旅 第五章:字符串详解

目录 开头&#xff1a; C字符串的两种形式&#xff1a; C 风格字符串 STL库中char类型的字符串操作函数&#xff1a; C 中的 String 类 STL库中string类型的操作函数&#xff1a; 1&#xff0e;声明一个C字符串 String类的构造函数和析构函数如下&#xff1a; 2&#…

RK3568开发板Visual Studio Code 插件安装

我们在此以 ubuntu 环境为例&#xff0c;讲解 Visual Studio Code 插件安装。 VSCode 支持多种语言&#xff0c;比如 C/C、Python、C#等等&#xff0c;对于嵌入式开发的我们主要用 来编写 C/C程序的&#xff0c;所以需要安装 C/C的扩展包&#xff0c;扩展包安装很简单&#xff…

若依移动端Ruoyi-App——开发总结

1. 去掉验证码 &#xff08;1&#xff09;在系统管理菜单中——》参数设置——》找到账户自助-验证码开关——》修改键值为false。 &#xff08;2&#xff09;在移动端前端将login.vue的captchaEnabled改为false&#xff0c;关闭验证码开关 &#xff08;3&#xff09;在移动端…