Servlet初始化参数设置\获取,全局初始化参数的设置、获取

news2025/1/24 22:44:26

之前在学习SpringMVC、SpringSecurity时,会用到Filter,需要对Filter进行参数配置,而Filter本质上也是一个Servlet,然后对Servlet设置初始化参数已经忘记了,所以打算重新回顾并整理Servlet这一部分的内容(虽然在目前的开发中已经不会用原生的Servlet进行开发了,但还是想了解一下)

回顾Servlet的生命周期

当Servelt第一次被访问时,此时有web容器负责创建Servlet实例,然后调用init()方法来对Servelt进行初始化配置,然后调用service()方法来处理请求,当web容器关闭时,会调用destroy()方法来销毁Servlet实例。

还有一个比较重要的接口是ServletConfig,这是一个Servlet的配置对象,封装了Servelt实例的一些配置信息,例如初始化参数,Servlet的名称等。

当调用Servlet的init()方法进行初始化时,会将ServletConfig对象传递给init()方法,进行Servlet实例的配置。

在Servlet中是如何设置初始化参数?如何获取初始化参数的呢?

设置Servlet的初始化参数

注册Servlet的方式有两种,一种是基于XML的方式,另一种是基于注解的方式。

参数是自定义的,设置初始化参数到指定Servlet身上,只有指定的Servelt才能访问到。

在初始化Servlet实例前,这些初始化参数会封装到ServletConfig对象中,然后再将ServletConfig对象传递给Servlet的init()方法进行实例化

这是一个普通的Servlet

public class IndexServlet extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        resp.getWriter().print("Hello !!!");
    }
}

基于web.xml的方式

<servlet>标签中,通过嵌套<init-param>来设置初始化参数

<servlet>
    <servlet-name>hello</servlet-name>
    <servlet-class>com.liumingkai.web.IndexServlet</servlet-class>
    <init-param>
        <param-name>MyLocation</param-name>
        <param-value>ShanDong-WeiHai</param-value>
    </init-param>
    <init-param>
        <param-name>password</param-name>
        <param-value>123456</param-value>
    </init-param>
</servlet>
<servlet-mapping>
    <servlet-name>hello</servlet-name>
    <url-pattern>/</url-pattern>
</servlet-mapping>

基于注解

利用@WebServlet注解的initParams属性

注意:每个参数都要使用@WebInitParam来标注

@WebServlet(value = "/", initParams = {
        @WebInitParam(name = "password", value = "123456"),
        @WebInitParam(name = "where", value = "ShanDong-WeiHai")
})
public class IndexServlet extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        String password = this.getInitParameter("password");
        resp.getWriter().print("Hello !!!Your password is " + password);

    }
}

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-9JexJvcC-1681570187676)(https://kkbank.oss-cn-qingdao.aliyuncs.com/note-img/image-20230415223828759.png)]

获取Servlet初始化参数

因为这些初始化参数会先被封装到ServletConfig对象身上,然后将ServeltConfig对象作为参数传递给Servlet的init()方法。

所以我们可以在ServeltConfig和Servlet本身中获取这些初始化参数。

ServletConfig中获取参数的方法

在Servlet自身中可以通过this.getServletConfig()方法来获取对应的ServletConfig对象

// 根据参数名称获取参数值
String getInitParameter(String var1);
// 获取所有参数的名称
Enumeration<String> getInitParameterNames();

HttpServlet中的中获取参数的方法:

// 根据参数名称获取参数值
public String getInitParameter(String name) ;

// 获取所有的参数名称
public Enumeration<String> getInitParameterNames() ;

Servlet自身的这两个方法是通过调用ServletConfig对应方法来实现的。

全局初始化参数

每个Web应用都有唯一的一个ServletContext对象,用来代指整个Web应用的上下文,我们可以设置初始化参数到Context域,这样所有的Servlet都可以访问到,可以实现多个Serlvet之间共享数据。我们称ServletContext的参数是全局参数

在web.xml中通过<context-param>来设置

<?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"
         metadata-complete="false"
>

    <context-param>
        <param-name>password</param-name>
        <param-value>123456</param-value>
    </context-param>
    <context-param>
        <param-name>where</param-name>
        <param-value>ShanDong-WeiHai</param-value>
    </context-param>
</web-app>

想要获取全局初始化参数,首先要获取ServletContext对象

ServletContext接口中用来获取全局初始化参数的方法

// 根据参数名称获取初始化参数
String getInitParameter(String var1);

// 获取所有的参数名称
Enumeration<String> getInitParameterNames();

这样,即使一个Servlet没有设置初始化参数,还是可以读取到ServletContext身上的数据

@WebServlet(value = "/")
public class IndexServlet extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        ServletContext servletContext = this.getServletContext();
        String password = servletContext.getInitParameter("password");
        String where = servletContext.getInitParameter("where");
        resp.getWriter().print("Hello !!!Your password is " + password + " , you are " + where);
    }
}

image-20230415224514556

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

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

相关文章

[Netty源码] 编码和解码相关问题 (十二)

文章目录1.编码和解码的介绍2.相关继承3.解码器分析3.1 ByteToMessageDecoder基类3.2 FixedLengthFrameDecoder3.3 LineBasedFrameDecoder3.4 DelimiterBasedFrameDecoder3.5 LengthFieldBasedFrameDecoder4.编码器分析4.1 解码过程分析4.2 writeAndFlush方法分析4.3 MessageTo…

2007-2020年国际产权指数InternationalPropertyRightsIndex(IPRI)IPRI

2007-2020年国际产权指数InternationalPropertyRightsIndex(IPRI)IPRI 1、来源&#xff1a;国际产权联合会 International Poverty Right Alliance 2、时间&#xff1a;2007-2020 3、范围&#xff1a;全球 4、指标说明&#xff1a; country、region、score、annual change…

提高软件测试效率的6大注意事项

1、测试策略非常重要 测试策略的基础是风险评估&#xff0c;我们需要通过失效概率和失效影响两个维度&#xff0c;对风险进行高、中、低的区分和可能性的判断。如CoCode开发云能够根据风险影响等级&#xff0c;自动计算出风险系数&#xff0c;并对风险进行优先级划分。而系数超…

项目管理:我们每个人都是管理者

项目管理的技能在生活中时时能用到、处处可锻炼。只要有心&#xff0c;项目成员一样可以学习和实践项目管理知识&#xff0c;也可以说&#xff0c;我们每个人都是管理者。 1、管理是职能而不是职位 有的人认为项目管理只是管理者应该学的&#xff0c;其实不是这样的&#xf…

卷积神经网络底层原理

1.卷积神经网络底层原理 声明&#xff1a;以下为《大话计算机》作者冬瓜哥课程视频截图&#xff0c;仅供学习 1.1卷积 一张图经过一种卷积核&#xff08;核函数&#xff09;滑动窗口进行卷积运算后得到一张特征图&#xff0c;这只是这种卷积核视角下看到的特征。所以我们需要多…

一起学 WebGL:图形变形以及矩阵变换

之前绘制了三角形&#xff0c;我们现在给它做一个变形操作。 对一个三角形进行变形&#xff0c;其实就是重新这个三角形的三个顶点的位置&#xff0c;计算完后再绘制出来&#xff0c;相比原来就发生了变形。 变形常见的有位移、选择、缩放。位移&#xff0c;其实就是给每个顶…

中国版ChatGPT即将来袭-国内版ChatGPT入口

必应chatGPT入口 目前并不存在“必应ChatGPT”这个概念。必应&#xff08;Bing&#xff09;是Microsoft公司推出的一款搜索引擎&#xff0c;而ChatGPT是OpenAI开发的自然语言处理技术&#xff0c;它们是两个不同的产品品牌。 不过&#xff0c;Microsoft也在自然语言处理领域里…

Microsoft 365管理和报告工具

在管理 Microsoft 365 设置的过程中&#xff0c;本机Microsoft 365 功能可能无法满足你的需求。M365 Manager Plus 具有复杂的功能&#xff0c;使 Microsoft 365 管理毫不费力。它提供基于功能的管理&#xff0c;因此你可以单独管理 Microsoft 365 组件。 使用 M365 Manager P…

进程的概念以及PCB的概念

在linux上进程是非常重要的知识点&#xff0c;今天我自我发表浅见。 可执行程序与进程 当在linux上编译完毕一个源文件生成可执行程序&#xff0c;这个时候这可执行程序只能称为普通文件&#xff0c;还不能定义为进程&#xff0c;在加载在内存中后才可称为进程&#xff0c;那…

次优二叉查找树(次优查找树)_递归和非递归实现_20230414

次优二叉查找树&#xff08;次优查找树)-递归和非递归实现 前言 当有序表中的各记录的查找概率相等的时候&#xff0c;采用折半查找效率可以提升查找性能&#xff1b;如果有序表中的各记录的查找概率不相等&#xff0c;那么折半查找就不再适用。 如果只考虑查找成功的情况&a…

Robocup 仿真2D 学习笔记(四)阵型编辑

一、阵型文件介绍 阵型文件里设置的是球员在比赛中的跑位点 基于helios base的阵型文件&#xff0c;在目录/src/formations-dt中 阵型的调用在/src/strategy.cpp 文件&#xff1a; before-kick-off.conf 是球员上场之后的阵型 &#xff08;或进球等待开球&#xff09; no…

有限元基础编程-何晓明老师课件-一维程序实现matlab

文章目录前言一、主程序二、一维有限元求解程序-框架三、组装刚度矩阵assemble_matrix_from_1D_integral.m2.1 算法2.2 get_standard_gauss_1D.m2.3 get_Gauss_local_1D.m前言 只是为方便学习&#xff0c;不做其他用途&#xff0c;课程理论学习来自b站视频有限元基础编程-何晓明…

RT-Thread线程管理以及内核裁剪

RT-Thread线程管理以及内核裁剪 1. RTOS概述 1.1 RTOS的定义 实时操作系统&#xff08;Real-time operating system, RTOS&#xff09;&#xff0c;又称即时操作系统&#xff0c;它会按照排序运行、管理系统资源&#xff0c;并为开发应用程序提供一致的基础。 实时操作系统与…

核心业务2:借款人申请借款额度

核心业务2&#xff1a;借款人申请借款额度 1.业务流程图 ------------截止提交个人信息部分-------- 2.借款人申请借款额度数据库设计 3.借款人申请额度流程 4.前端代码逻辑 5.后端代码逻辑 ------------截止提交个人信息部分-------- 核心业务2&#xff1a;借款人申请借…

Linux从命令行管理文件

目录 一、创建链接文件 二、目录操作命令 1. 创建目录&#xff08;make directory&#xff09; 2. 统计目录及文件的空间占用情况 3. 删除目录文件 三、创建、删除普通文件 文件命名规则&#xff1a; &#xff08;1&#xff09;不能使用/来当文件名&#xff0c;/是用来做…

【WCH】CH32F203软件I2C驱动SSD1306 OLED

【WCH】CH32F203软件I2C驱动SSD1306 OLED&#x1f4cc;相关篇《【WCH】CH32F203硬件I2C驱动SSD1306 OLED》&#x1f4fa;驱动显示效果&#xff1a; &#x1f33f;OLED屏幕&#xff1a;i2c ssd1306 oled&#x1f516;驱动单片机型号&#xff1a;CH32F203 ✨由于CH32F203主频为96…

wordpress下载插件,安装失败,无法创建目录问题

刚开始安装这个wordpress&#xff0c;在发表文章时候想要在其中加上图片&#xff0c;不想一个个手动上传媒体库&#xff0c;耽误时间&#xff0c;然后就去下了个imagepaste这个复制粘贴的插件&#xff0c;当我打开安装插件搜索到的时候准备安装&#xff0c;尼玛出现“安装失败&…

若一个单词被拆分成多少token, word_ids得到的序号是相同的?还是序号累加的?

目录 问题描述&#xff1a; 问题实现&#xff1a; 方法一&#xff1a; 方法二&#xff1a; 问题描述&#xff1a; 在使用tokenizer进行编码的时候&#xff0c;经常会存在word被拆分成多个token的情况&#xff0c;不同的参数设置&#xff0c;会得到不同的结果。总的来说&…

redis——使用

session缓存缓存更新方式删除缓存vs更新缓存缓存和数据库操作原子性缓存和数据库操作顺序结论缓存问题缓存穿透缓存雪崩缓存击穿全局唯一ID数据并发线程安全单体分布式redis分布式锁的问题redis消息队列listpubsubstream消息推送session 问题&#xff1a;session存在tomcat服务…

【Linux驱动开发】023 platform设备驱动

一、前言 驱动分离目的&#xff1a;提高Linux代码重用性和可移植性。 二、驱动的分隔与分离 百度看了很多&#xff0c;大多都没讲清楚为什么使用platform驱动&#xff0c;为什么驱动分隔与分离可以提高代码重用性&#xff0c;只是在讲实现的结构体、函数接口等等&#xff0c…