Servlet的自动加载、ServletConfig对象、ServletContext对象
一、 Servlet的自动加载
默认情况下,第一次访问servlet的时候,创建servlet对象。如果servlet构造函数里面的代码或者init方法里面的代码比较多,就会导致用户第一次访问servlet的时候比较慢。这个时候,我们可以改变servlet对象的创建时机:提前到加载web应用的时候。在servlet的配置信息中,加上一个<load-on-startup>标签即可。
<servlet><servlet-name>loadOnStartup</servlet-name><servlet-class>com.by.servlet.LoadOnStartupServlet</servlet-class><!--容器是否在启动时加载该servlet,数字越小优先级越高越高--><load-on-startup>1</load-on-startup>
</servlet>
servlet实例:
public class LoadOnStartupServlet implements HttpServlet {public LoadOnStartupServlet(){System.out.println("LoadOnStartupServlet constructor method has run....");}
}
这样配置之后,servlet的构造函数和init方法就会在web应用加载的时候就会执行。
二、ServletConfig对象
-
是什么
ServletConfig是javax.servlet.包下的一个接口,ServletConfig它是Servlet的一个配置对象;
ServletConfig是由tomcat容器创建,通过init方法传入给Servlet;
-
ServletConfig对象如何获取?
在GenericServlet里面定义了:
public ServletConfig getServletConfig() {return this.config;
}
-
常用方法
getInitParameter(String parameterName); //根据参数名称获取指定的参数值
getInitParameterNames(); //获取所有的参数名称
-
需求:
获取servlet里面定义的参数
<servlet><servlet-name>demo2</servlet-name><servlet-class>com.by.servlet.ServletConfigServlet</servlet-class><!--Servlet的初始化参数--><init-param><param-name>username</param-name><param-value>root</param-value></init-param><init-param><param-name>password</param-name><param-value>root123</param-value></init-param></servlet><servlet-mapping><servlet-name>demo2</servlet-name><url-pattern>/demo2</url-pattern></servlet-mapping>
ServletConfigServlet
package com.by.servlet;import javax.servlet.*;
import javax.servlet.http.HttpServlet;public class ServletConfigServlet extends HttpServlet {@Overridepublic void service(ServletRequest servletRequest, ServletResponse servletResponse) throws ServletException {//1.获取ServletConfig对象ServletConfig servletConfig = getServletConfig();//2.获取Servlet中的初始化参数String username = servletConfig.getInitParameter("username");System.out.println(username);String password = servletConfig.getInitParameter("password");System.out.println(password);//3.获取ServletContext对象(域对象)ServletContext servletContext = servletConfig.getServletContext();}
}
思考:param参数可不可以在另外的Servlet中获取? 不能
public class ServletConfigServlet2 extends HttpServlet {@Overridepublic void goGet(ServletRequest servletRequest, ServletResponse servletResponse) throws ServletException {//1.获取ServletConfig对象ServletConfig servletConfig = getServletConfig();//2.获取Servlet中的初始化参数String username = servletConfig.getInitParameter("username");//不能获取System.out.println(username);String password = servletConfig.getInitParameter("password");//不能获取System.out.println(password);//3.获取ServletContext对象(域对象)ServletContext servletContext = servletConfig.getServletContext();}
}
三、ServletContext对象
-
是什么
ServletContext是javax.servlet包下的一个接口,又称上下文对象,是配置对象也是一个域对象;
当服务器启动时,会为服务器中的每一个web应用程序创建一个ServletContext对象;
在web应用中的servlet要想实现资源的共享,可以通过ServletContext来完成;
-
如何获取这个对象:
public ServletContext getServletContext() {//获取ServletContext对象return this.getServletConfig().getServletContext();
}
-
这个对象里面也有很多方法:
getInitParameter() //获取指定参数名称的全局参数值
getRealPath(String path) //获得当前项目的服务器磁盘路径
getContextPath() //获取项目的根路径
getAttribute(String parameterName) //获取ServletContext域中指定名称的参数值;
setAttribute(String paramterName,Object parameterValue) //存储参数到ServletContext域中;
removeAttribute(String parameterNam) //将ServletContext域中指定名称的参数移除;
-
需求
获取servlet里面定义的参数
<context-param><param-name>username</param-name><param-value>root</param-value></context-param><context-param><param-name>password</param-name><param-value>root456</param-value></context-param>
package com.by.servlet;import javax.servlet.*;
import javax.servlet.http.HttpServlet;public class ServletContextServlet extends HttpServlet {@Overridepublic void service(ServletRequest servletRequest, ServletResponse servletResponse) throws ServletException {//获取ServletContext对象ServletContext servletContext = getServletContext();//1.获取全局初始化参数String username = servletContext.getInitParameter("username");System.out.println(username);String password = servletContext.getInitParameter("password");System.out.println(password);//2.获取服务器真实路径String upload = servletContext.getRealPath("");System.out.println(upload);//3.获取项目的根路径String contextPath = servletContext.getContextPath();System.out.println(contextPath);//4.往ServletContext域中,存储一个名称为msg的属性,值为"hello"String str = "hello";servletContext.setAttribute("msg",str);}
}
思考:param参数可不可以在另外的Servlet中获取? 不能
package com.by.servlet;import javax.servlet.ServletContext;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.http.HttpServlet;public class ServletContextServlet2 extends HttpServlet {@Overridepublic void doGet(ServletRequest servletRequest, ServletResponse servletResponse) throws ServletException {//从ServletContext域中取出msg的值ServletContext servletContext = getServletContext();//1.获取全局初始化参数String username = servletContext.getInitParameter("username");System.out.println(username);String password = servletContext.getInitParameter("password");System.out.println(password);//2.获得msg属性Object msg = servletContext.getAttribute("msg");//能获取System.out.println(msg);}
}
package com.by.servlet;import javax.servlet.ServletContext;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.http.HttpServlet;public class ServletContextServlet3 extends HttpServlet {@Overridepublic void service(ServletRequest servletRequest, ServletResponse servletResponse) throws ServletException {//1.获取ServletContext对象ServletContext servletContext = getServletContext();//将ServletContext域中的msg参数移除servletContext.removeAttribute("msg");}
}
<servlet><servlet-name>context3=</servlet-name><servlet-class>com.by.servlet.ServletContextServlet</servlet-class></servlet><servlet-mapping><servlet-name>context3=</servlet-name><url-pattern>/context=</url-pattern></servlet-mapping><servlet><servlet-name>context2</servlet-name><servlet-class>com.by.servlet.ServletContextServlet2</servlet-class></servlet><servlet-mapping><servlet-name>context2</servlet-name><url-pattern>/context2</url-pattern></servlet-mapping><servlet><servlet-name>context3</servlet-name><servlet-class>com.by.servlet.ServletContextServlet3</servlet-class></servlet><servlet-mapping><servlet-name>context3</servlet-name><url-pattern>/context3</url-pattern></servlet-mapping>
相关文章:
Servlet的自动加载、ServletConfig对象、ServletContext对象
一、 Servlet的自动加载 默认情况下,第一次访问servlet的时候,创建servlet对象。如果servlet构造函数里面的代码或者init方法里面的代码比较多,就会导致用户第一次访问servlet的时候比较慢。这个时候,我们可以改变servlet对象的创…...
Vue - Class和Style绑定详解
1. 模板部分 <template><div><!-- Class 绑定示例 --><div :class"{ active: isActive, text-danger: hasError }">Hello, Vue!</div><!-- Class 绑定数组示例 --><div :class"[activeClass, errorClass]">Cla…...
适用于 Windows 的 7 个顶级视频转换器 – 流畅的视频转换体验!
对于任何想要增强视频转换体验的人来说,视频转换器都是必不可少的工具。无论您是需要转换视频文件格式以实现兼容性,还是只是想优化视频以获得更好的质量,可靠的视频转换器都可以使该过程无缝且高效。在这篇博文中,我们将探讨适用…...
Vue3全局属性app.config.globalProperties
文章目录 一、概念二、实践2.1、定义2.2、使用 三、最后 一、概念 一个用于注册能够被应用内所有组件实例访问到的全局属性的对象。点击【前往】访问官网 二、实践 2.1、定义 在main.ts文件中设置app.config.globalPropertie import {createApp} from vue import ElementPl…...
单片机开发--keil5
一.keil5 Keil uVision5是一个集成开发环境(IDE),用于对嵌入式系统中的微控制器进行编程。它是一个软件套件,包括源代码编辑器、项目经理、调试器以及微控制器开发、调试和编程所需的其他工具。Keil uVision5 IDE主要用于对基于A…...
<JavaEE> TCP 的通信机制(三) -- 滑动窗口
目录 TCP的通信机制的核心特性 四、滑动窗口 1)什么是滑动窗口? 2)滑动窗口的作用是什么? 3)批量传输出现丢包如何处理? 1> 接收端ACK丢包 2> 发送端数据包丢包 4)适用性 TCP的通…...
听GPT 讲Rust源代码--library/portable-simd
File: rust/library/portable-simd/crates/core_simd/examples/spectral_norm.rs spectral_norm.rs是一个示例程序,它展示了如何使用Portable SIMD库中的SIMD(Single Instruction Multiple Data)功能来实现频谱规范化算法。该示例程序是Rust源…...
CMake入门教程【基础篇】CMake+Minggw构建项目
文章目录 Minggw是什么Minggw下载CMake下载安装第1步:下载CMake第2步:安装CMake 如何构建和编译项目:使用CMake和MinGW总结 Minggw是什么 MinGW(Minimalist GNU for Windows)是一个免费的软件开发环境,旨在…...
2024年原创深度学习算法项目分享
原创深度学习算法项目分享,包括以下领域: 图像视频、文本分析、知识图谱、推荐系统、问答系统、强化学习、机器学习、多模态、系统界面、爬虫、增量学习等领域… 有需要的话,评论区私聊...
Linux自定义shell编写
Linux自定义shell编写 一.最终版本展示1.动图展示2.代码展示 二.具体步骤1.打印提示符2.解析命令行3.分析是否是内建命令1.shell对于内建名令的处理2.cd命令3.cd函数的实现4.echo命令的实现5.export命令的实现6.内建命令函数的实现 4.创建子进程通过程序替换执行命令5.循环往复…...
堆的应用:堆排序和TOP-K问题
上次才讲完堆的相关问题:二叉树顺序结构与堆的概念及性质(c语言实现堆 那今天就接着来进行堆的主要两方面的应用:堆排序和TOP-K问题 文章目录 1.堆排序1.1概念、思路及代码1.2改良代码(最初建立大堆用AdjustDow) 2. TO…...
element表格排序功能
官方展示 个人项目 可以分别对每一项数据进行筛选 注:筛选的数据不能是字符串类型必须是数字类型,否则筛选会乱排序 html <el-table :data"tableData" border height"600" style"width: 100%"><el-table-co…...
HNU-Java程序设计基础训练-2023
1.DNA序列(Java) 【问题描述】 一个DNA序列由A/C/G/T四个字母的排列组合组成。G和C的比例(定义为GC-Ratio)是序列中G和C两个字母的总的出现次数除以总的字母数目(也就是序列长度)。在基因工程中…...
数据库和数据库编程
数据库、数据表、表数据操作以及数据库编程相关的知识点 1. 数据库的概念: 数据库是用于存储和组织数据的系统。数据库管理系统(DBMS)是管理数据库的软件,提供对数据的访问、查询和维护。关系型数据库是一种通过表格结构来组织和管理数据的数据库。 2…...
爬虫基础一(持续更新)
爬虫概念: 通过编写程序,模拟浏览器上网,然后让其去互联网上抓取数据的过程 分类: 1,通用爬虫:抓取一整张页面数据 2,聚焦爬虫:抓取页面中的局部内容 3,增量式爬虫&…...
右键菜单“以notepad++打开”,在windows文件管理器中
notepad 添加到文件管理器的右键菜单中 找到安装包,重新安装一般即可。 这里有最新版:地址 密码:f0f1 方法 在安装的时候勾选 “Context Menu Entry” 即可 Notepad的右击打开文件功能 默认已勾选 其作用是添加右键快捷键。即,对于任何…...
JSON.parseObject强制将自动转化的Intage型设置为Long型
通过Redis或Caffeine存储入json型String,通过JSON.parseObject自动类型转化之后,数值会优先转为Intage,如果存入的字符值大于Intage最大值,会自动转为Long型; 需求是:实要取出时数值类型值为Long࿱…...
Redis的集群模式:主从 哨兵 分片集群
基于Redis集群解决单机Redis存在的问题,在之前学Redis一直都是单节点部署 单机或单节点Redis存在的四大问题: 数据丢失问题:Redis是内存存储,服务重启可能会丢失数据 > 利用Redis数据持久化的功能将数据写入磁盘并发能力问题…...
Note: An Interesting Festival
An Interesting Festival 一个有趣的节日。 festival The Agricultural Feast takes place after the independence Day. 农业盛会在独立日后举行 takes place independence feast agricultural It is not a worldwide celebration. 它不是一个全球的庆典。 worldwide ce…...
iview表格固定列横向滚动条无法拖动问题
文章目录 问题解决办法 问题 在使用iview的表格组件时,遇到了设置固定列表格后滚动条无法拖动的问题,当对表格列进行固定后,底部的横向滚动条就无法拖动了,主要的问题就是固定区域盖住了横向滚动条。 解决办法 在组件内直接加下…...
使用Gemini-OpenAI代理实现零成本AI模型迁移与协议转换
1. 项目概述:一个让OpenAI生态无缝接入Gemini的桥梁如果你和我一样,长期在AI应用开发的一线折腾,肯定遇到过这样的场景:手头有一个基于OpenAI API(比如ChatGPT的gpt-3.5-turbo或gpt-4)构建得相当成熟的应用…...
告别3389端口暴露:零信任防火墙重塑RDP安全访问新范式
1. 传统RDP安全方案的致命短板 每次看到服务器日志里那些密密麻麻的暴力破解尝试记录,我的后颈都会发凉。作为从业十年的运维老兵,我见过太多因为3389端口暴露引发的安全事故。有个客户的数据库服务器,明明设置了16位复杂密码,还是…...
labelCloud架构解析:3D点云标注的模块化解决方案深度指南
labelCloud架构解析:3D点云标注的模块化解决方案深度指南 【免费下载链接】labelCloud A lightweight tool for labeling 3D bounding boxes in point clouds. 项目地址: https://gitcode.com/gh_mirrors/la/labelCloud 在3D计算机视觉和自动驾驶领域&#x…...
别再死记硬背SPI时序了!用STM32CubeMX+W25Q128实战,5分钟搞懂CPOL/CPHA模式选择
从波形到代码:STM32CubeMX可视化解析SPI四种模式的实战指南 当第一次接触SPI通信时,那四种工作模式(CPOL/CPHA组合)就像天书一样令人困惑。传统教程往往要求死记硬背时序图,但今天我们将通过STM32CubeMX和W25Q128 Flas…...
TranslucentTB:3分钟打造Windows任务栏透明效果的终极指南
TranslucentTB:3分钟打造Windows任务栏透明效果的终极指南 【免费下载链接】TranslucentTB A lightweight utility that makes the Windows taskbar translucent/transparent. 项目地址: https://gitcode.com/gh_mirrors/tr/TranslucentTB 想让你的Windows桌…...
Maxwell 2D仿真进阶:从磁力线可视化到磁感应强度曲线分析
1. Maxwell 2D仿真基础与优势解析 第一次接触电磁场仿真时,我被各种专业术语和复杂的操作界面搞得晕头转向。直到发现Maxwell 2D这个神器,才真正体会到电磁仿真的魅力。相比于3D仿真,2D版本有个特别实用的功能——可以直接观察磁力线分布&…...
信息量模型避坑指南:用ArcGIS做地灾评价,这3个细节错了全盘皆输
信息量模型避坑指南:用ArcGIS做地灾评价,这3个细节错了全盘皆输 地质灾害易发性评价是地质工程领域的核心课题之一。在山区开发、城市规划等场景中,准确预测地质灾害风险区域,能够为防灾减灾提供科学依据。信息量模型因其计算简单…...
Transformer架构与混合专家系统(MoE)的技术演进与应用
1. Transformer架构与混合专家系统(MoE)的演进之路2017年,Transformer架构的横空出世彻底改变了自然语言处理的游戏规则。这种基于自注意力机制的架构不仅在各种序列建模任务中展现出惊人性能,更为后续的大规模语言模型奠定了坚实基础。然而,…...
Motorola LS2208条码扫描器USB接口模式解析与Python数据采集实战
1. 项目概述:从“扫码枪”到数据采集终端在仓库、快递站或者超市收银台,我们每天都能看到工作人员拿着一个像手枪一样的东西,“嘀”一声,商品信息就录入了系统。这个设备就是条码扫描器,很多人习惯叫它“扫码枪”。你可…...
API v2.0 设计规范
API v2.0 设计规范 【免费下载链接】marp-cli A CLI interface for Marp and Marpit based converters 项目地址: https://gitcode.com/gh_mirrors/ma/marp-cli 认证机制 // JWT 认证示例 const token jwt.sign({ userId: user.id },process.env.JWT_SECRET,{ expires…...
