Java Servlet详解(补充,极其重要)

news2024/11/23 19:32:23

在这里插入图片描述

✅作者简介:热爱国学的Java后端开发者,修心和技术同步精进。
🍎个人主页:Java Fans的博客
🍊个人信条:不迁怒,不贰过。小知识,大智慧。
💞当前专栏:JAVA开发者成长之路
✨特色专栏:国学周更-心性养成之路
🥭本文内容:Java Servlet详解(补充,极其重要)
更多内容点击👇
      Servlet与表单数据交互(如文本框、单选按钮、复选框、下拉列表等)

在这里插入图片描述

本文目录

    • Servlet核心接口和类
      • 【1】Servlet接口
      • 【2】GenericServlet抽象类
      • 【3】HttpServlet类
    • Servlet两种创建方式
      • 【1】实现Servlet接口
      • 【2】继承HttpServlet(推荐使用)
    • Servlet两种配置方式
      • 【1】使用web.xml配置
      • 【2】资源配置属性
      • 【3】使用注解配置
      • 【4】@WebServlet注解常用属性

在这里插入图片描述

Servlet核心接口和类

  在Servlet体系结构中,除了第三节中讲的实现Servlet接口,还可以通过继承GenericServlet或HttpServlet类,完成自定义Servlet的编写。

【1】Servlet接口

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

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

【2】GenericServlet抽象类

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

  在 GenericServlet 中,主要完成了以下任务:

  • 将 init() 中的 ServletConfig 赋给一个类级变量,可以由 getServletConfig 获得;
  • 为 Servlet 所有方法提供默认实现;
  • 可以直接调用 ServletConfig 中的方法;
public class ServletDemo2 extends GenericServlet {

    @Override
    public void service(ServletRequest arg0, ServletResponse arg1)
            throws ServletException, IOException {
        System.out.println("heihei");

    }
}

【3】HttpServlet类

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

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

  • doGet():用于HTTP GET请求
  • doPost():用于HTTP POST请求
  • doPut():用于HTTP PUT请求
  • doDelete():用于HTTP DELETE请求
public class ServletDemo3 extends HttpServlet {

    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp)
            throws ServletException, IOException {
        System.out.println("haha");
    }

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

}

Servlet两种创建方式

【1】实现Servlet接口

  使用这种方式创建Servlet类比较麻烦,需要重写Servlet接口中的所有方法

package com.cxyzxc.www.servlet01;

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

/**
 * 使用实现Servlet接口创建的Servlet类
 */

public class MyServlet01 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接口创建的MyServlet类");
        servletResponse.getWriter().println("Servlet is very interesting ");
    }

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

    @Override
    public void destroy() {

    }
}

【2】继承HttpServlet(推荐使用)

package com.cxyzxc.www.servlet01;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;

/**
 * 使用继承HttpServlet类创建的MyServlet类,开发中推荐使用这种方式
 */

public class MyServlet02 extends HttpServlet {

    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        System.out.println("使用继承HttpServlet类创建的MyServlet类");
        resp.getWriter().println("Servlet is very funny ");
    }

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

Servlet两种配置方式

【1】使用web.xml配置

  这种配置是Servlet2.5之前使用的

<?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名称 -->
        <servlet-name>myServlet01</servlet-name>
        <!-- Servlet的全称类名 -->
        <servlet-class>com.cxyzxc.www.servlet01.MyServlet01</servlet-class>
       <!-- 启动的优先级,数字越小越先起作用 -->
        <load-on-startup>1</load-on-startup>
    </servlet>

    <!-- Servlet映射配置 -->
    <servlet-mapping>
        <!-- Servlet名称 -->
        <servlet-name>myServlet01</servlet-name>
        <!-- 资源的匹配原则:精确匹配 -->
        <url-pattern>/servlet01</url-pattern>
    </servlet-mapping>
</web-app>

【2】资源配置属性

url-pattern 定义匹配规则,取值说明:

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

load-on-startup

1】元素标记容器是否应该在web应用程序启动的时候就加载这个servlet。
2】它的值必须是一个整数,表示servlet被加载的先后顺序。
3】如果该元素的值为负数或者没有设置,则容器会当servlet被请求时再加载。
4】如果值为整数或0时,表示容器在应用启动时就加载并初始化这个servlet,值越小,servlet的优先级越高,就越先被加载。值相同时,容器就会自己选择顺序来加载。

【3】使用注解配置

  这种配置是Servlet3.0之后使用的,推荐使用这种方式

@WebServlet("/servlet02")
public class MyServlet02 extends HttpServlet {

    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        System.out.println("使用继承HttpServlet类创建的MyServlet类");
        resp.getWriter().println("Servlet is very funny ");
    }

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

【4】@WebServlet注解常用属性

  • name:Servlet名字(可选)
  • value:配置url路径,可以配置多个
  • urlPatterns:配置url路径,和value作用一样,不能同时使用
  • loadOnStartup:配置Servlet的创建的时机,如果是0或者正数,启动程序时创建,如果是负数,则访问时创建。数字越小优先级越高。

  码文不易,本篇文章就介绍到这里,如果想要学习更多Java系列知识点击关注博主,博主带你零基础学习Java知识。与此同时,对于日常生活有困扰的朋友,欢迎阅读我的第四栏目:《国学周更—心性养成之路》,学习技术的同时,我们也注重了心性的养成。

在这里插入图片描述

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

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

相关文章

SwiftUI 中列表行(List Row)展开和收起无动画或动画诡异的解决

文章目录 问题现象问题分析1. 为什么 List 行展开与收起没有动画效果?2. 第一种解决方法3. 另一种巧妙的解决总结结束语问题现象 SwiftUI 中展开(expand)和收起(collapse)列表行(List Row)是一个常见的操作,不过默认来说这样的操作不会有动画效果: 如上图所示,我们为…

粒子滤波算法(Matlab代码实现)

&#x1f468;‍&#x1f393;个人主页&#xff1a;研学社的博客 &#x1f4a5;&#x1f4a5;&#x1f49e;&#x1f49e;欢迎来到本博客❤️❤️&#x1f4a5;&#x1f4a5; &#x1f3c6;博主优势&#xff1a;&#x1f31e;&#x1f31e;&#x1f31e;博客内容尽量做到思维缜…

CpG ODN——艾美捷ODN 1826 (TLRGRADE)说明书

艾美捷CpG ODN系列——ODN 1826 (TLRGRADE)&#xff1a;具有硫代磷酸酯骨架的CpG寡脱氧核苷酸&#xff08;B型&#xff09;。小鼠TLR9&#xff08;Toll样受体9&#xff09;的特异性配体。 艾美捷CpG ODN 丨ODN 1826 (TLRGRADE)化学性质&#xff1a; 备选名称&#xff1a;CpG-B…

Suspense组件

先上官网&#xff1a;https://cn.vuejs.org/guide/built-ins/suspense.html 注意一下 <Suspense> 是一项实验性功能。它不一定会最终成为稳定功能&#xff0c;并且在稳定之前相关 API 也可能会发生变化。 在使用了之后在浏览器控制台会有如下打印&#xff0c;至少目前是…

【大数据】有关zookeeper的问题

如图&#xff0c;启动zookeeper失败&#xff0c;输入 zkServer.sh start-foreground 查看失败原因 Invalid config&#xff0c;我得知是配置文件出了问题&#xff0c;但是检查配置文件没有发现错误 最终在配置文件末尾配置参数结尾发现了未删除的空格 将三个节点配置文件中的…

C/C++ 和 Java的编译运行机制比较 个人理解

计算机程序语言按程序的执行方式可分为编译型语言和解释性语言。 编译型语言是指使用专用的编译器&#xff0c;针对某操作系统将高级语言源代码一次性地翻译成可被该系统硬件执行的机器码(包括机器指令和操作数&#xff09;&#xff0c;并包装成该系统所能识别的可执行程序的格…

同事开源我的微服务深度实践笔记到 GitHub,短短 3 天竟吸粉 1W+

说Spring成就了Java&#xff0c;Spring是Java程序员必修课之一&#xff0c;应该没人反对吧&#xff1f;前几年面试最常问的且可以顺利拿到高薪的技能是Spring&#xff0c;随着Spring体系的壮大&#xff0c;除非你在简历上添加Spring Boot和Spring Cloud的技能&#xff0c;才可以…

Kubernetes——Debug Static Pod

1. 问题背景 注意&#xff0c;我这里的Static Pod并非Kubernetes的Static Pod&#xff0c;而是需要把想要Debug的程序放到Delve环境中重新打包一个镜像。因为还有另外一种场景&#xff0c;那就是我们需要不重启Running Pod&#xff0c;为了和这种方式区分&#xff0c;才以此为…

彻底卸载并重装Anaconda环境与Python的方法

本文介绍在Windows平台下&#xff0c;彻底删除Anaconda环境与其自带Python版本&#xff0c;并进行重新安装的方法。 最近&#xff0c;由于原有Anaconda环境中的部分第三方库出现了冲突的情况&#xff0c;且基于“Anaconda Prompt (anaconda3)”也无法升级Anaconda与相关库了&am…

《超新星纪元》

《超新星纪元》 关于作者 刘慈欣&#xff0c;髙级工程师&#xff0c;科普作家&#xff0c;被誉 为"中国当代科幻第一人"。自上世纪90年代开始&#xff0c;他一边在发电厂担任计算机工程师&#xff0c;一边利用业余时间出版了13本小说集&#xff0c;连续数年获得中国…

这是一篇讲解用户行为分析的推荐书单和总结

写在前面 技术文延迟了 本来计划参加活动的还有一篇&#xff0c;应该是一篇技术翻译文&#xff0c;但是那篇文章太难了&#xff0c;看我过我以往文章的同学&#xff0c;应该能理解&#xff0c;我的文章很少有3000字数以下的&#xff0c;而且如果不是来自谷歌&#xff08;主要…

深蓝学院-多传感器融合定位课程-第9章-基于图优化的建图方法

专栏文章: 深蓝学院-多传感器融合定位课程-第1章-概述_goldqiu的博客-CSDN博客 深蓝学院-多传感器融合定位课程-第2章-3D激光里程计I_goldqiu的博客-CSDN博客 深蓝学院-多传感器融合定位课程-第3章-3D激光里程计II_goldqiu的博客-CSDN博客 深蓝学院-多传感器融合定位课程-第…

2022品牌出海:日本网红营销白皮书

日本作为世界第三大经济体&#xff0c;同时也是世界第四大电子商务市场&#xff0c;亚洲第二大消费市场&#xff0c;其经济水平和消费能力都非常出色。对出海企业来说&#xff0c;日本是一个非常有吸引力的市场。日本的网红营销市场也非常成熟&#xff0c;在疫情的影响下&#…

java设计模式之原型模式(prototype Pattern)

原型模式主要在于对象的克隆&#xff0c;所以也叫克隆模式 其实就是利用java中的Object对象中的clone方法实现一个对象的克隆。此方法需要注意的是&#xff0c;一个对象想要实现克隆&#xff0c;就必须实现一个标志性接口Cloneable 现在先来说一下浅克隆 这玩意也叫表皮克隆&…

【前端开发学习】1.前端引入和HTML标签

文章目录1.快速开发网站2. 浏览器能识别的标签2.1 编码&#xff08;head&#xff09;2.2 Title&#xff08;head&#xff09;2.3 标题&#xff08;body&#xff09;2.4 div 和 span&#xff08;body&#xff09;2.5 超链接&#xff08;body&#xff09;2.6 图片&#xff08;bod…

基于微信小程序的居民疫情服务系统springboot框架-计算机毕业设计

项目介绍 随着我国经济迅速发展&#xff0c;人们对手机的需求越来越大&#xff0c;各种手机软件也都在被广泛应用&#xff0c;但是对于手机进行数据信息管理&#xff0c;对于手机的各种软件也是备受用户的喜爱&#xff0c;居民疫情服务系统小程序被用户普遍使用&#xff0c;为…

一个基于.Net开发齐全的加密库

网络安全&#xff0c;对于我们项目日常开发&#xff0c;是非常重要的&#xff0c;比如密码加密存储、密码加密传输、SSL证书、端对端加密等等。 这些加密算法&#xff0c;每个知识点都包含了很多内容&#xff0c;自己实现都需要花费很多时间&#xff0c;所以今天就给大家推荐一…

Qt 模型视图编程之增删行列

背景 Qt 模型视图编程中模型定义了标准接口对数据进行访问&#xff0c;可根据需求继承对应的抽象模型类来实现自定义的数据模型。一个基本的数据模型至少要实现以下虚函数&#xff1a; ①&#xff0e;rowCount&#xff1a;行数&#xff0c;返回要显示多少行&#xff1b; ②&…

net基于asp.net的社区团购网站-计算机毕业设计

项目介绍 社区团购系统依托社区团购系统和社区门店,是现在的一个重大市场和发展方向,通过研究企业在社区团购系统环境下的营销模式创新,对于普通的零售业和传统社区团购系统的转型发展具有重要的理论意义。随着互联网行业的发展,人们的生活方式发生着重大变化,人们越来越倾向于…

[附源码]Python计算机毕业设计Django酒店客房管理系统

项目运行 环境配置&#xff1a; Pychram社区版 python3.7.7 Mysql5.7 HBuilderXlist pipNavicat11Djangonodejs。 项目技术&#xff1a; django python Vue 等等组成&#xff0c;B/S模式 pychram管理等等。 环境需要 1.运行环境&#xff1a;最好是python3.7.7&#xff0c;…