板块一 Servlet编程:第七节 ServletContext对象全解与Servlet三大域对象总结 来自【汤米尼克的JAVAEE全套教程专栏】

板块一 Servlet编程:第七节 ServletContext对象全解与Servlet三大域对象总结

  • 一、什么是ServletContext对象
  • 二、获取ServletContext对象及常用方法
      • (1)获取 ServletContext 对象
      • (2)ServletContext对象提供的方法
  • 三、servletContext域对象
      • Servlet三大域对象总结

在上一节中,我们学习了Servlet的第四个对象HttpSession对象,可以想象将一个Session放在服务器中,并且里面的数据可供很多个客户端访问,没错,此时这个Ssseion就变成了ServletContext,它可以理解成一个公共的Session,这一节中我们就来学习最后此教程的第五个Servlet对象:ServletContext

一、什么是ServletContext对象

每一个Web应用都有且仅有一个ServletContext对象,又称Application对象,从名称中可知,该对象是与应用程序相关的。它代表整个Web应用程序,而不是单个用户的请求,使用时通过javax.servlet.ServletContext对象获取实例。生命周期上,在Web容器启动的时,会为每一个Web应用程序创建一个对应的 ServletContext对象,在Web应用停止时销毁,ServletContext对象的生命周期与Web应用程序的生命周期相同

该对象有两大作用

  • 作为域对象用来共享数据,此时数据在整个应用程序中共享
  • 在该对象中保存当前应用程序相关信息,比如可以通过getServerlnfo()方法获取当前服务器信息,getRealPath(String path)获取资源的真实路径等
    在这里插入图片描述

二、获取ServletContext对象及常用方法

(1)获取 ServletContext 对象

  • 通过 Request 对象获取
ServletContext servletContext = request.getServletContext();
  • 通过 Session 对象获取
ServletContext servletContext = request.getsession().getservletContext();
  • 在Servlet标准中提供了ServletConfig方法,也可以获取
ServletConfig servletConfig = getServletConfig();
ServletContext servletContext = servletConfig.getServletContext();
  • 在Servlet中直接获取
ServletContext servletContext = getServletContext();

实际上无论Request对象、Session对象、还是servletConfig对象,都是在各自的接口中通过各自的get()方法创建相同的ServletContext实例,例如下图的ServletConfig接口中的定义,因此几种方法创建的getServletContext实例的效果相同
在这里插入图片描述

(2)ServletContext对象提供的方法

ServletContext对象提供了一系列方法,用于管理和访问Web应用程序的全局信息。以下是一些常用的ServletContext方法:

  • String getRealPath(String path):获取Web应用程序中指定文件或目录的真实路径。这在需要访问Web应用程序的目录和文件时非常有用。
  • RequestDispatcher getRequestDispatcher(String path):获取用于将请求转发到指定路径的RequestDispatcher对象。这对于实现请求转发非常有用。
  • RequestDispatcher getNamedDispatcher(String name):获取用于将请求转发到指定名称的Servlet的RequestDispatcher对象。
  • InputStream getResourceAsStream(String path):获取指定路径的资源文件的输入流。这对于读取Web应用程序中的资源文件非常有用。
  • URL getResource(String path):获取指定路径的资源文件的URL。
  • int getMajorVersion():获取Servlet API的主要版本号。
  • int getMinorVersion():获取Servlet API的次要版本号。
  • String getServerInfo():获取当前服务器的版本信息。
  • String getServletContextName():获取Web应用程序的名称。

实例:在start.java中通过各种方式获取ServletConfig实例,然后通过方法获取当前服务器的版本信息以及当前资源的真实路径
在start.java中导入javax.servlet.ServletContext包,在service()中写入测试代码

package www.caijiyuan;

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

import javax.servlet.ServletContext;

@WebServlet("/start")
public class start extends HttpServlet {
    @Override
    protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//        通过 Request 对象获取
        ServletContext servletContext_req = req.getServletContext();
//        通过 Session 对象获取
        ServletContext servletContext_ses = req.getSession().getServletContext();
//        在Servlet标准中提供了ServletConfig方法,也可以获取
        ServletConfig servletConfig = getServletConfig();
        ServletContext servletContext_conf = servletConfig.getServletContext();
//        在Servlet中直接获取
        ServletContext servletContext = getServletContext();

        // 获取当前服务器的版本信息
        String serverInfo = servletContext_req.getServerInfo();
        System.out.println("获取当前服务器的版本信息:"+serverInfo);
        // 获取项目的真实路径
        String realPath = servletContext_req.getRealPath( "/");
        System.out.println("获取项目的真实路径:"+realPath);
    }
}

代码中演示了四种获取servletContext实例的方法,但在调用方法时只使用了通过Request创建的实例,启动服务器,在浏览器中访问start,可以得到控制台输出
在这里插入图片描述

三、servletContext域对象

ServletContext也可当做域对象来使用,通过向ServletContext中存取数据,可以使得整个应用程序共享某些数据。但是不建议存放过多数据,因为ServletContext中的数据一旦存储进去没有手动移除将会一直保存直到服务器关闭
在第二点,我们列举了很多ServletContext对象的方法,还有这些方法,属于域对象操作

  • String getInitParameter(String name):获取指定名称的初始化参数值。
  • Enumeration<String> getInitParameterNames():获取所有初始化参数的名称。
  • Object getAttribute(String name):获取指定名称的属性值。
  • Enumeration<String> getAttributeNames():获取所有属性的名称。
  • void setAttribute(String name, Object value):设置指定名称的属性值。
  • void removeAttribute(String name):移除指定名称的属性

实例:
在start.java中添加数据

package www.caijiyuan;

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

import javax.servlet.ServletContext;

@WebServlet("/start")
public class start extends HttpServlet {
    @Override
    protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//        在Servlet中直接获取
        ServletContext servletContext = getServletContext();
//        设置servletContext域对象
        servletContext.setAttribute("name","ToomyNike");
    }
}

在after.java中获取数据并输出,然后移除servletContext域对象中的name键值

package www.caijiyuan;

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

@WebServlet("/after")
public class after extends HttpServlet {
    @Override
    protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        ServletContext servletContext = getServletContext();
        // 获取指定名称的session域对象
        String ContextName = (String) servletContext.getAttribute("name");
        System.out.println(ContextName);
        // 移除指定名称的session域对象
        servletContext.removeAttribute("name");
    }
}

启动服务器,先后在浏览器中访问start和after资源,便可在控制台打印得
在这里插入图片描述
整个过程与我们在上一节Session中使用域对象设置获取参数的过程一摸一样,不同之处在于servletContext域对象是服务器中所有客户端都可以获取参数的,而Session只有指定SessionID的那一个客户端可以访问。这里我们就要做总结了

Servlet三大域对象总结

这三大域对象都的三个方法
设置属性信息:void setAttribute(String name,Object value)
获取属性值:Object getAttribute(String name)
移除属性信息:void removeAttribute(String name)

域对象作用域被销毁
Request只在一次请求响应中保存,服务器跳转(请求转发)后依然有效客户端跳转(重定向/超链接)
Session在一次会话范围中(多个请求多个响应),无论何种跳转都可以使用重启浏览器(客户端)
servletContext在整个服务器上保存重启服务器

以上就是Servlet几大对象的所有内容,怎么样,是不是感觉学到东西了,轻舟已过Servlet山,下一节我们将学习Servlet板块的最后一个小节,讲讲Servlet对于文件的上传下载操作

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

pytorch自定义数据集分类resnet18

# 文件结构为&#xff1a; # |--- data # |--- dog # |--- dog1_1.jpg # |--- dog1_2.jpg # |--- cat # |--- cat2_1.jpg # |--- cat2_2.jpg import torch import torchvision import torchvision.transforms as transforms import torch.nn as nn import to…

【软件测试面试】要你介绍项目-如何说?完美面试攻略...

目录&#xff1a;导读 前言一、Python编程入门到精通二、接口自动化项目实战三、Web自动化项目实战四、App自动化项目实战五、一线大厂简历六、测试开发DevOps体系七、常用自动化测试工具八、JMeter性能测试九、总结&#xff08;尾部小惊喜&#xff09; 前言 1、测试面试时&am…

UI风格汇:扁平化风格来龙去脉,特征与未来趋势

Hello&#xff0c;我是大千UI工场&#xff0c;设计风格是我们新开辟的栏目&#xff0c;主要讲解各类UI风格特征、辨识方法、应用场景、运用方法等&#xff0c;本次带来的扁平化风格的解读&#xff0c;有设计需求&#xff0c;我们也可以接单。 一、什么是扁平化风格 扁平化风格…

C# EF Core迁移数据库

现象&#xff1a; 在CodeFirst时&#xff0c;先写字段与表&#xff0c;创建数据库后&#xff0c;再添加内容 但字段与表会变更&#xff0c;比如改名删除增加等 需求&#xff1a; 当表字段变更时&#xff0c;同时变更数据库&#xff0c;执行数据库迁移 核心命令 Add-Migrat…

陪诊小程序:温暖您的就医之路,让关怀触手可及

随着社会的进步和科技的发展&#xff0c;人们对于医疗健康的需求日益增长。然而&#xff0c;在繁忙的生活节奏中&#xff0c;许多人在面对就医时却面临着无人陪伴的困境。为了解决这一问题&#xff0c;陪诊小程序应运而生。 陪诊小程序是一种便捷、高效、人性化的医疗服务应用…

9-pytorch-现有模型使用及修改

b站小土堆pytorch教程学习笔记 1 使用ImageNet测试模型vgg16 train_datatorchvision.datasets.ImageNet(dataset/ImageNet,trainTrue ,downloadTrue ,transformtorchvision.transforms.ToTensor())代码运行报错&#xff1a;ImageNet数据集过大&#xff0c;导致现在无法公开访问…

聊聊 Go 边界检查消除

前言 在这篇文章中碰巧看到了Go边界检查消除相关的讨论. 我也借此简单聊聊. 有这样一段代码, 非常简单, 就是一段求向量点积的程序: func sum(a, b []int) int {if len(a) ! len(b) {panic("must be same len")}ret : 0for i : 0; i < len(a); i {ret a[i] * …

SAM轻量化的终点竟然是RepViT + SAM

本文首发&#xff1a;AIWalker&#xff0c;欢迎关注~~ 殊途同归&#xff01;SAM轻量化的终点竟然是RepViT SAM&#xff0c;移动端速度可达38.7fps。 对于 2023 年的计算机视觉领域来说&#xff0c;「分割一切」&#xff08;Segment Anything Model&#xff09;是备受关注的一项…

0-1背包问题-动态规划

解法归纳&#xff1a; 一、如果装不下当前物品&#xff0c;那么前n个物品的最佳组合和前n-1个物品的最佳组合是一样的。 二、如果装得下当前物品。 假设1 :装当前物品&#xff0c;在给当前物品预留了相应空间的情况下&#xff0c;前n-1 个物品的最佳组 合加上当前物品的价值就…

作业 找单身狗2

方法一&#xff1a; 思路&#xff1a; 我们可以先创建一个新的数组&#xff0c;初始化为0&#xff0c;然后让原来的数组里面的元素作为新数组的下标 如果该下标对应的值为0&#xff0c;说明没有出现过该数&#xff0c;赋值为1作为标记&#xff0c;表示出现过1次 如果该下标…

#FPGA(基础知识)

1.IDE:Quartus II 2.设备&#xff1a;Cyclone II EP2C8Q208C8N 3.实验&#xff1a;正点原子-verilog基础知识 4.时序图&#xff1a; 5.步骤 6.代码&#xff1a;

代码随想录刷题第41天

首先是01背包的基础理论&#xff0c;背包问题&#xff0c;即如何在有限数量的货物中选取使具有一定容量的背包中所装货物价值最大。使用动规五步曲进行分析&#xff0c;使用二维数组do[i][j]表示下标从0到i货物装在容量为j背包中的最大价值&#xff0c;dp[i][j]可由不放物品i&a…

物理备份的方式

完全备份恢复流程 停止数据库清理环境重演回滚&#xff0d;&#xff0d;> 恢复数据修改权限启动数据库 1.关闭数据库&#xff1a; [rootmysql-server ~]# systemctl stop mysqld [rootmysql-server ~]# rm -rf /var/lib/mysql/* //删除所有数据// [rootmysql-server ~]# …

Sora:颠覆性AI视频生成工具

Sora是一款基于人工智能&#xff08;AI&#xff09;技术的视频生成工具&#xff0c;它彻底改变了传统视频制作的模式&#xff0c;为创作者提供了高效、便捷、高质量的视频内容生成方式。通过深度学习和自然语言处理等先进技术&#xff0c;Sora实现了从文字描述到视频画面的自动…

并发编程(5)共享模型之不可变

7 共享模型之不可变 本章内容 不可变类的使用不可变类设计无状态类设计 7.1 日期转换的问题 问题提出 下面的代码在运行时&#xff0c;由于 SimpleDateFormat 不是线程安全的, 有很大几率出现 java.lang.NumberFormatException 或者出现不正确的日期解析结果&#xff0c;…

SpringCloud Alibaba 2022之Nacos学习

SpringCloud Alibaba 2022使用 SpringCloud Alibaba 2022需要Spring Boot 3.0以上的版本&#xff0c;同时JDK需要是17及以上的版本。具体的可以看官网的说明。 Spring Cloud Alibaba版本说明 环境搭建 这里搭建的是一个聚合项目。项目结构如下&#xff1a; 父项目的pom.xm…

(拦截器)学习SpringMVC的第三天

一 .拦截器简介 拦截器的几个处理阶段 二 . 拦截器快速入门 2.1 实现拦截器接口 public class MyInterceptor1 implements HandlerInterceptor {Overridepublic boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Excep…

微信小程序开启横屏调试

我们先打开小程序项目 开启真机运行 目前是一个竖屏的 然后打开全局配置文件 app.json 给下面的 window 对象 下面加一个 pageOrientation 属性 值为 landscape 运行结果如下 然后 我们开启真机运行 此时 就变成了个横屏的效果

(done) Positive Semidefinite Matrices 什么是半正定矩阵?如何证明一个矩阵是半正定矩阵? 可以使用特征值

参考视频&#xff1a;https://www.bilibili.com/video/BV1Vg41197ew/?vd_source7a1a0bc74158c6993c7355c5490fc600 参考资料(半正定矩阵的定义)&#xff1a;https://baike.baidu.com/item/%E5%8D%8A%E6%AD%A3%E5%AE%9A%E7%9F%A9%E9%98%B5/2152711?frge_ala 看看半正定矩阵的…

ubantu设置mysql开机启动

阅读本文之前请参阅----MySQL 数据库安装教程详解&#xff08;linux系统和windows系统&#xff09; 在Ubuntu系统中设置MySQL开机启动&#xff0c;通常有以下几种方法&#xff1a; 1. **使用systemctl命令**&#xff1a; Ubuntu 16.04及更高版本使用systemd作为…