Servlet的自动加载、ServletConfig对象、ServletContext对象

news/2025/2/11 1:43:14/

一、 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>


http://www.ppmy.cn/news/1286640.html

相关文章

sklearn 中matplotlib编制图表

代码 # 导入pandas库&#xff0c;并为其设置别名pd import pandas as pd import matplotlib.pyplot as plt# 使用pandas的read_csv函数读取名为iris.csv的文件&#xff0c;将数据存储在iris_data变量中 iris_data pd.read_csv(data/iris.txt,sep\t)# 使用groupby方法按照&quo…

pytorch01:概念、张量操作、线性回归与逻辑回归

目录 一、pytorch介绍1.1pytorch简介1.2发展历史1.3pytorch优点 二、张量简介与创建2.1什么是张量&#xff1f;2.2Tensor与Variable2.3张量的创建2.3.1 直接创建torch.tensor()2.3.2 从numpy创建tensor 2.4根据数值创建2.4.1 torch.zeros()2.4.2 torch.zeros_like()2.4.3 torch…

分库分表之Mycat应用学习四

4 分片策略详解 分片的目标是将大量数据和访问请求均匀分布在多个节点上&#xff0c;通过这种方式提升数 据服务的存储和负载能力。 4.1 Mycat 分片策略详解 总体上分为连续分片和离散分片&#xff0c;还有一种是连续分片和离散分片的结合&#xff0c;例如先 范围后取模。 …

什么是 JavaScript 中的 Spread 运算符

JavaScript 中的 Spread 运算符是一个用于展开数组或对象的运算符&#xff0c;它使用三个连续的点&#xff08;...&#xff09;来表示。当 Spread 运算符用于数组时&#xff0c;它可以将一个数组展开为多个独立的元素。当 Spread 运算符用于对象时&#xff0c;它可以将一个对象…

ORACLE P6 v23.12 最新虚拟机(VM)全套系统环境分享

引言 根据上周的计划&#xff0c;我简单制作了两套基于ORACLE Primavera P6 最新发布的23.12版本预构建了虚拟机环境&#xff0c;里面包含了全套P6 最新版应用服务 此虚拟机仅用于演示、培训和测试目的。如您在生产环境中使用此虚拟机&#xff0c;请先与Oracle Primavera销售代…

PaddleOCR环境搭建

windows下环境搭建 安装python https://www.python.org/ftp/python/3.8.10/python-3.8.10-amd64.exe 验证安装&#xff1a; python -V 提示&#xff1a; Python 3.8.10 即为安装成功&#xff01; 安装PaddlePaddle 参考文档&#xff1a;开始使用_飞桨-源于产业实践的开源…

FileZilla的使用以及主动模式跟被动模式

目录 FileZilla的安装 下载路径 安装 FileZilla的基本使用 添加组 添加用户 设置权限 测试 开始测试 FileZilla的主动模式及被动模式 主动模式&#xff08;Active Mode&#xff09; 被动模式&#xff08;Passive Mode&#xff09; 思维导图 ​编辑 FileZilla的安装 下载…

使用SCP在Linux中安全复制文件:参数详解

SCP&#xff08;Secure Copy&#xff09;是一个在Linux和其他类Unix系统中使用的命令行工具&#xff0c;用于在本地和远程主机之间安全地复制文件和目录。本文将详细介绍SCP的多个常用参数&#xff0c;并通过示例进行说明。 基本语法 scp [options] source destination其中&a…