【JavaWeb】重新认识 Servlet 的初始化 [ 回顾 Servlet ]

news2025/7/6 12:17:43

🥇作者 .29. 的✔博客主页✔
🥇记录JavaWeb学习的专栏:Web专栏
🥇向前走,不要回头。

您的点赞收藏以及关注是对作者最大的鼓励喔 ~~

在这里插入图片描述

在这里插入图片描述

重新认识Servlet的初始化

  • 一、回顾Servlet
    • 1.什么是Servlet
    • 2.Servlet规范
    • 3.Servlet生命周期
  • 二、Servlet 的初始化方法
    • 1.带参初始化
    • 2.无参初始化
    • 3.重写 init() 方法,进行额外的初始化准备
      • ① 获取初始化参数值
      • ② `ServletContext` 和 `<context-param>`

一、回顾Servlet

====================

1.什么是Servlet

在讲解Servlet初始化方法之前,让我们先回顾一下Servlet:

Servlet 是 Java 提供的一门动态Web资源开发技术。

2.Servlet规范

经过对Servlet规范的总结,我们得到以下几点:

  • Servlet规范是JAVAEE规范中的一种。
  • Servlet规范给开发者指定了 动态资源文件 的开发步骤
  • Servlet规范给Http服务器指定了调用 动态资源文件 的规则。
  • Servlet规范给Http服务器指定了管理 动态资源文件实例对象 的规则。

3.Servlet生命周期

Servlet运行在Servlet容器中,其生命周期是由容器(Web服务器)来管理的,Servlet生命周期大致分为四个阶段:

  1. 实例化:默认情况下,当Servlet第一次被访问时,Web服务器(容器)会自动创建Servlet对象。

  2. 初始化:Servlet实例化后,容器会调用init()空参方法来初始化实例对象。这个过程中会完成加载配置文件、创建连接等初始化工作。初始化方法只会被调用一次

  3. 服务(请求响应)每次向Servlet发起请求时,Servlet容器都会调用Servlet中的service()方法来响应请求.(即:对请求进行处理)

  4. 销毁:当完成服务,需要释放内存或者关闭容器时,Servlet容器就会调用Servlet中的destroy()方法进行资源的释放:调用此方法后,容器会释放当前Servlet实例,而后该实例就会被Java垃圾收集器回收。


二、Servlet 的初始化方法

Servlet中的初始化方法有两个:

  • 无参数的方法: init();
  • 带参数的方法: init(ServletConfig config);

1.带参初始化

源码中,带参数的初始化方法代码如下:

public void init(ServletConfig config) throws ServletException {
        this.config = config;
        this.init();
}

2.无参初始化

源码中,无参数的初始化方法代码如下:

public void init() throws ServletException {
}

3.重写 init() 方法,进行额外的初始化准备

如果我们想在Servlet初始化时做一些准备工作,那么我们可以重写init()方法

========================

① 获取初始化参数值

如果想要获取初始化设置的数据,我们可以这么做:

在XML文件中,为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>Demo01Servlet</servlet-name>
        <servlet-class>com.haojin.servlet.Demo01Servlet</servlet-class>
        <init-param>
            <param-name>name</param-name>
            <param-value>InitName</param-value>
        </init-param>
    </servlet>
    <servlet-mapping>
        <servlet-name>Demo01Servlet</servlet-name>
        <url-pattern>/demo01</url-pattern>
    </servlet-mapping>
    
</web-app>

XML配置文件中,<init-param> </init-param>标签内的内容,就是我们设置的初始化参数,参数名为:“name” ---- 参数值为:“InitName”

重写init()方法,利用ServletConfig实例对象获取初始化参数值

import javax.servlet.ServletConfig;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;

/**
 * @author .29.
 * @create 2022-10-21 16:20
 */
public class Demo01Servlet extends HttpServlet {
    @Override
    public void init() throws ServletException {
        //获取ServletConfig实例对象
        ServletConfig config = getServletConfig();
        //通过实例对象调用getInitParameter()方法,获取初始化的参数
        String initValue = config.getInitParameter("name");
        
        //输出我们获取到的初始化参数,验证操作的可行性
        System.out.println("initValue = " + initValue);

    }
}

在这里插入图片描述

因为我们没有重写service()方法,所以程序运行后浏览器页面会显示405类型的错误,但我们不需要理会。


这时候主要应检查控制台能否正确输出我们设置好的初始化参数,以验证上述重写init()方法,获取初始化参数值操作的可行性。

在这里插入图片描述

注意绿色框框内容,程序成功读取配置文件中设置的初始化参数,控制台输出无误,事实证明操作是可行的。

上述在XML配置文件中注册的操作过于繁琐,Servlet3.0后支持以注解的方式进行注册,让我们来看一下更加简便的一种实现方法吧:

仅仅在代码开头加上了注解,这样就不需要在XML配置文件中设置复杂的配置了。

import javax.servlet.ServletConfig;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebInitParam;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;

/**
 * @author .29.
 * @create 2022-10-21 16:20
 */
@WebServlet(urlPatterns = {"/demo01"} ,
            initParams = {
                @WebInitParam(name = "name" , value = "InitName")
            }
            )
public class Demo01Servlet extends HttpServlet {
    @Override
    public void init() throws ServletException {
        //获取ServletConfig实例对象
        ServletConfig config = getServletConfig();
        //通过实例对象调用getInitParameter()方法,获取初始化的参数
        String initValue = config.getInitParameter("name");

        //输出我们获取到的初始化参数,验证操作的可行性
        System.out.println("initValue = " + initValue);

    }
}


ServletContext<context-param>

我们重写init()方法除了可以获取到配置文件中设置的初始化参数外,还可以用类似的流程来获取配置文件中设置的context参数。

XML文件中添加<context-param>配置

<context-param>
        <param-name>ContextConfigLocation</param-name>
        <param-value>classpath:application.xml</param-value>
    </context-param>


XML配置文件完整代码

<?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">
    
    <context-param>
        <param-name>ContextConfigLocation</param-name>
        <param-value>classpath:application.xml</param-value>
    </context-param>
    
     <servlet>
        <servlet-name>Demo01Servlet</servlet-name>
        <servlet-class>com.haojin.servlet.Demo01Servlet</servlet-class>
    </servlet>
    
    <servlet-mapping>
        <servlet-name>Demo01Servlet</servlet-name>
        <url-pattern>/demo01</url-pattern>
    </servlet-mapping>

</web-app>


重写init()方法,在方法内获取初始化配置的context值:

import javax.servlet.ServletConfig;
import javax.servlet.ServletContext;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;

/**
 * @author .29.
 * @create 2022-10-21 16:20
 */
public class Demo01Servlet extends HttpServlet {
    @Override
    public void init() throws ServletException {
        //获取ServletContext实例对象
        ServletContext servletContext = getServletContext();
        //通过对象调用getInitParameter()方法,获取设置的初始化参数(通过参数名获取对应参数值)
        String contextConfigLocation = servletContext.getInitParameter("ContextConfigLocation");
        
        //在控制台输出获取到的值
        System.out.println("contextConfigLocation = " + contextConfigLocation);

    }
}



控制台输出
成功获取到了xml配置文件中设置好的context值:

在这里插入图片描述


🥇作者 .29. 的✔博客主页✔

在这里插入图片描述

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

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

相关文章

设置背景图片大小的方法

背景图片大小设置 语法&#xff1a;background-size:宽度 高度&#xff1b;作用&#xff1a;设置背景图片大小取值&#xff1a; 取值场景数字px简单方便&#xff0c;常用百分比相当于当前盒子自身的宽高百分比contain包含&#xff0c;将背景图片等比例缩放&#xff0c;直到不…

Vue 之 echarts 图表数据可视化的基础使用(简单绘制各种图表、地图)

Vue 之 echarts 图表数据可视化的基础使用&#xff08;简单绘制各种图表、地图&#xff09; 目录 Vue 之 echarts 图表数据可视化的基础使用&#xff08;简单绘制各种图表、地图&#xff09; 一、简单介绍 二、环境搭建 三、使用 echarts 四、自动缩放 echarts 五、数据更…

【网络通信】websocket如何断线重连

Vue <template><div><button click"sendDevName(xxxxxxxx)">发送</button>{{data}}</div> </template><script> export default {name: HelloWorld,data () {return {data: null}},// html加载完成后执行initWebSocket()…

Vue3-路由跳转专题详细总结

一、基本路由 点击事件似乎可以使用模板更改视图中的内容&#xff0c;个人认为与路由的区别是路由能使网页中的地址栏发生变化 请先阅读基础第二篇 1.创建一个组件,并引入 2.js文件中配置路径 //name相当于别名{path:/tabView,component:TabView},{name:myComPany,path:compan…

Vue3项目搭建全过程

目录 一、前言 二、搭建准备 三、搭建项目 四、启动项目 一、前言 在2020年的9月19日&#xff0c;万众期待的Vue3终于发布了正式版&#xff0c;命名为“One Piece”。 它也带来了很多新的特性&#xff1a;更好的性能、更小的包体积、更好的TypeScript集成、更优秀的API设…

前端面试真题宝典(一)

面试题真题 闭包和柯里化 闭包是什么&#xff1f;闭包是能够读取其他函数内部变量的函数 柯里化是什么&#xff1f;柯里化是把一个多个参数的函数转化为单参数函数的方法 闭包的用途&#xff1a;闭包的主要用途是为了不污染全局变量&#xff0c;用闭包的局部变量来做一些库…

30个题型+代码(冲刺2023蓝桥杯)(中)

2023.3.13~4.13持续更新 目录 &#x1f34e;注意 &#x1f33c;前言 &#x1f33c;十&#xff0c;KMP&#xff08;留坑&#xff09; &#x1f33c;十一&#xff0c;Trie&#xff08;留坑&#xff09; &#x1f33c;十二&#xff0c;BFS &#x1f44a;(一)1562. 微博转发…

获取街道、镇级的地图geoJson数据方法,使用echarts绘制出街道、镇级的地图区域画面(中山市为例)

一、需求 1、在echarts上绘制市级以下的区、县的区域地图。 2、在市级下很多都是有区、县的区域&#xff0c;而少部分是不存在区、县的&#xff0c;是直接市下面一级就是街道、镇级别的区域。 3、统一管理区域数据&#xff0c;有区县的市直接拿区县的geoJson数据&#xff0c;没…

炸弹人小游戏代码开源(python)

♥️作者&#xff1a;小刘在C站 ♥️个人主页&#xff1a;小刘主页 ♥️每天分享云计算网络运维课堂笔记&#xff0c;努力不一定有收获&#xff0c;但一定会有收获加油&#xff01;一起努力&#xff0c;共赴美好人生&#xff01; ♥️夕阳下&#xff0c;是最美的绽放&#xff0…

Ajax--》请求操作以及跨域相关讲解

目录 jQuery中的Ajax 请求超时与网络异常处理 取消请求 Ajax请求—fetch() 跨域 jQuery中的Ajax 在jQuery中应该如何发送Ajax请求呢&#xff1f;看到这篇文章你就能大概了解到如何在jQuery中发送Ajax。 要想使用jQuery框架&#xff0c;肯定是需要引进jQuery资源的&#…

CSS实现单行、多行文本溢出显示省略号(…)

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录一、单行超出显示省略号二、多行超出显示省略号一、单行超出显示省略号 描述&#xff1a;如果文字超出父元素指定宽度&#xff0c;文字会自动换行&#xff0c;而连续…

Node.js——文件模块和路径模块(读写文件,处理路径)

个人简介 &#x1f440;个人主页&#xff1a; 前端杂货铺 &#x1f64b;‍♂️学习方向&#xff1a; 主攻前端方向&#xff0c;也会涉及到服务端 &#x1f4c3;个人状态&#xff1a; 在校大学生一枚&#xff0c;已拿 offer&#xff08;秋招&#xff09; &#x1f947;推荐学习&…

MySQL - 死锁的产生及解决方案

MySQL - 死锁的产生及解决方案1. 死锁与产生死锁的四个必要条件1.1 什么是死锁1.2 死锁产生的4个必要条件2. 死锁案例2.1 表锁死锁2.2 行锁死锁2.3 共享锁转换为排他锁3. 死锁排查4. 实例分析4.1 案例描述4.2 案例死锁问题复现4.3 死锁排查4.4 解决死锁5. 如何避免死锁1. 死锁与…

【保姆级】JMeter Mqtt 压测配置

忽然有个紧急任务要对某个服务做MQTT做压测&#xff0c;紧急实操下JMeter&#xff0c;这里记录下非专业测试员的测试过程、(▽&#xff40;)&#xff0c;欢迎&#x1f44f;大家检查指点(&#xffe3;∇&#xffe3;)/下载⏬工具JMeter官方下载地址https://jmeter.apache.org/do…

【前端】1.学习了一段时间的vue,总结一下Vue书写规范

学习了一段时间的vue&#xff0c;总结一下Vue书写规范命名规范普通变量命名规范常量命名规范组件命名规范method 方法命名命名规范views 下的文件命名props 命名规范结构化规范命名规范 在团体开发项目中&#xff0c;为了团队所有成员书写可维护的代码&#xff0c;而不是一次性…

JS入门到精通完整版

前言 JavaScript&#xff08;简称“JS”&#xff09; 是一种具有函数优先的轻量级&#xff0c;解释型或即时编译型的编程语言。它是作为开发Web页面的脚本语言而出名&#xff0c;JavaScript 基于原型编程、多范式的动态脚本语言&#xff0c;并且支持面向对象、命令式、声明式、…

【前端灵魂脚本语言JavaScript①】——JS引入方式

&#x1f41a; 作者: 阿伟 &#x1f482; 个人主页: Flyme awei &#x1f40b; 希望大家多多支持&#x1f618;一起进步呀&#xff01; &#x1f4ac; 文章对你有帮助&#x1f449;关注✨点赞&#x1f44d;收藏&#x1f4c2; JavaScript引入 文章目录JavaScript引入一、JS介绍二…

PTA第六章作业详解

&#x1f680;write in front&#x1f680; &#x1f4dd;个人主页&#xff1a;认真写博客的夏目浅石. &#x1f381;欢迎各位→点赞&#x1f44d; 收藏⭐️ 留言&#x1f4dd; &#x1f4e3;系列专栏&#xff1a;夏目的作业 &#x1f4ac;总结&#xff1a;希望你看完之后&am…

vue+uniapp瀑布流布局多种实现方式

文章目录前言一、实现原理二、代码实现1.方式1&#xff08;图片高度累加比较法&#xff09;2.方式2&#xff08;父元素高度比较法&#xff09;三.uniapp实现代码实现四、多列实现代码实现前言 瀑布流布局是网页设计常见的一种布局&#xff0c;一般用于图片多列展示。列宽固定&…

Vue3:状态管理-Store(Vuex,Pinia)

什么是状态管理 理论上来说&#xff0c;每一个 Vue 组件实例都已经在“管理”它自己的响应式状态了 它是一个独立的单元&#xff0c;由以下几个部分组成 状态&#xff1a;驱动整个应用的数据源&#xff1b;视图&#xff1a;对状态的一种声明式映射&#xff1b;交互&#xff1a…