【JavaWeb】知识总结Ⅸ(ServletConfig, ServletContext)

简介: ServletConfig 类是为 Servlet 程序的配置信息的类2. Servlet 程序和 ServletConfig 对象都是由 Tomcat 负责创建3. Servlet 程序默认是第 1 次访问的时候创建, ServletConfig 在 Servlet 程序创建时,就创 建一个对应的 ServletConfigServletConfig 类能干什么1. 获取 Servlet 程序的 servlet-name 的值2. 获取初始化参数 init-param3. 获取 ServletContext 对象

目录


一. ServletConfig


🌓ServletConfig 基本介绍


🌓ServletConfig 类能干什么


🌒应用实例 :


二. ServletContext


🌔为什么需要 ServletContext


🌔ServletContext 基本介绍


🌔ServletContext 可以做什么


🌒应用实例 1-获取工程相关信息


🌒应用实例 2-简单的网站访问次数计数器


🌕为啥一个Servlet对应着一个ServletConfig


🌕为啥一个web对应一个ServletContext


🌕getServletConfig()


🌕getServletContext()


🌔什么是上下文


一. ServletConfig

ServletConfig 基本介绍

1. ServletConfig 类是为 Servlet 程序的配置信息的类

2. Servlet 程序和 ServletConfig 对象都是由 Tomcat 负责创建

3. Servlet 程序默认是第 1 次访问的时候创建, ServletConfig 在 Servlet 程序创建时,就创 建一个对应的 ServletConfig

ServletConfig 类能干什么

1. 获取 Servlet 程序的 servlet-name 的值


2. 获取初始化参数 init-param

3. 获取 ServletContext 对象

应用实例 :

需求: 编写 DBServlet.java 完成如下功能

在 web.xml 配置连接 mysql 的用户名和密码

在 DBServlet 执行 doGet()/doPost() 时,可以获取到 web.xml 配置的用户名和密码


示意图(思路分析)


代码实现

public class ServletConfig_ extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//        super.doGet(req, resp);
        doPost(req, resp);
    }
    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//        super.doPost(req, resp);
        ServletConfig servletConfig = getServletConfig();
        String username = servletConfig.getInitParameter("username");
        String pwd = servletConfig.getInitParameter("pwd");
        System.out.println("username = " + username);
        System.out.println("pwd = " + pwd);
    }
}


xml配置


<servlet>
   <servlet-name>ServletConfig_</servlet-name>
   <servlet-class>com.lxb.servlet.servletMethod.ServletConfig_</servlet-class>
   <init-param>
      <param-name>username</param-name>
      <param-value>lxb</param-value>
   </init-param>
   <init-param>
       <param-name>pwd</param-name>
       <param-value>123456</param-value>
   </init-param>
</servlet>
<servlet-mapping>
    <servlet-name>ServletConfig_</servlet-name>
    <url-pattern>/servletConfig</url-pattern>
</servlet-mapping>


二. ServletContext

为什么需要 ServletContext

1. 先看一个需求: 如果我们希望统计某个 web 应用的所有 Servlet 被访问的次数,怎么 办 ?

2. 方案 1-DB


3. 方案 2-ServletContext


ServletContext 基本介绍

1. ServletContext 是一个接口,它表示 Servlet 上下文对象

2. 一个 web 工程,只有一个 ServletContext 对象实例

3. ServletContext 对象 是在 web 工程启动的时候创建,在 web 工程停止的时销毁


4. ServletContext 对象可以通过 ServletConfig.getServletContext 方法获得对 ServletContext 对象的引用,也可以通过 this.getServletContext () 来获得其对象的引用。

5. 由于一个 WEB 应用中的所有 Servlet 共享同一个 ServletContext 对象,因此 Servlet 对象 之间可以通过 ServletContext 对象来实现多个 Servlet 间通讯。 ServletContext 对象通常也被 称之为域对象。【示意图】


ServletContext 可以做什么

1. 获取 web.xml 中配置的上下文参数 context-param [ 信息和整个 web 应用相关,而不是 属于某个 Servlet]   (应用实例1)

2. 获取当前的工程路径,格式 : / 工程路径 = 》 比如 /servlet  (应用实例1)

3. 获 取 工 程 部 署 后 在 服 务 器 硬 盘 上 的 绝 对 路 径 ( 比 如 : D:\hspedu_javaweb\servlet\out\artifacts\servlet_war_exploded)

       (应用实例1)

4. 像 Map 一样存取数据 , 多个 Servlet 共享数据 (应用实例2)

应用实例 1-获取工程相关信息

● 需求如下:

1. 获取 web.xml 中配置的上下文参数 context-param

2. 获取当前的工程路径,格式 : / 工程路径

3. 获取工程部署后在服务器硬盘上的绝对路径


● 代码实现 .

String contextPath = servletContext.getContextPath();
String realPath = servletContext.getRealPath("/");
String serverInfo = servletContext.getServerInfo();
System.out.println("contextPath = " + contextPath);
System.out.println("realPath = " + realPath);
System.out.println("serverInfo = " + serverInfo);

应用实例 2-简单的网站访问次数计数器

        需求分析 / 图解


需求: 完成一个简单的网站访问次数计数器:


代码实现 :

一个页面的类

package com.lxb.servlet.servletMethod;
//-*- code = utf-8 -*-
//@Time : 2023-07-18 10:42:06
//@Authors : 罗雄波
//@File : OrderServlet.java
//@Software : IntelliJ IDEA
import javax.servlet.ServletContext;
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 java.io.PrintWriter;
@WebServlet(urlPatterns = {"/order"})
public class OrderServlet extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//        super.doGet(req, resp);
        doPost(req, resp);
    }
    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//        super.doPost(req, resp);
        ServletContext servletContext = getServletContext();
        Object attribute = servletContext.getAttribute("visit-count");
        if(attribute == null) {
            servletContext.setAttribute("visit-count", 1);
            attribute = 1;
        } else {
            attribute = Integer.parseInt(String.valueOf(attribute)) + 1;
            servletContext.setAttribute("visit-count", attribute);
        }
        resp.setContentType("text/html; charset = utf-8");
        PrintWriter writer = resp.getWriter();
        writer.println("<h1>新网站被访问的次数是 : " + attribute + "</h1>");
    }
}


另一个页面的类

package com.lxb.servlet.servletMethod;
//-*- code = utf-8 -*-
//@Time : 2023-07-18 09:42:38
//@Authors : 罗雄波
//@File : ServletContext_.java
//@Software : IntelliJ IDEA
import javax.servlet.ServletContext;
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 java.io.PrintWriter;
@WebServlet(urlPatterns = {"/context"})
public class ServletContext_ extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//        super.doGet(req, resp);
        doPost(req, resp);
    }
    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//        super.doPost(req, resp);
        ServletContext servletContext = getServletContext();
        Object attribute = servletContext.getAttribute("visit-count");
        if(attribute == null) {
            servletContext.setAttribute("visit-count", 1);
            attribute = 1;
        } else {
            attribute = Integer.parseInt(String.valueOf(attribute)) + 1;
            servletContext.setAttribute("visit-count", attribute);
        }
        resp.setContentType("text/html; charset = utf-8");
        PrintWriter writer = resp.getWriter();
        writer.println("<h1>新网站被访问的次数是 : " + attribute + "</h1>");
    }
}


       以下是一些官方的问题分析 :

为啥一个Servlet对应着一个ServletConfig

ServletConfig对象是在Servlet初始化时由Servlet容器创建并传递给Servlet的,用于存储Servlet的配置信息和初始化参数。每个Servlet实例都有一个唯一的ServletConfig对象,它与该Servlet实例一一对应。


通过ServletConfig对象,Servlet可以获取到与其相关的配置信息,如初始化参数、Servlet名称、Servlet上下文等。ServletConfig提供了以下几个常用的方法:


getInitParameter(String name):获取指定名称的初始化参数的值。

getInitParameterNames():获取所有初始化参数的名称的枚举。

getServletName():获取当前Servlet的名称。

getServletContext():获取当前Servlet所在的ServletContext对象。

ServletConfig对象是在Servlet的生命周期中非常重要的组成部分,它为Servlet提供了访问配置信息的能力,使得Servlet能够根据自身的需求进行初始化和处理请求。


为啥一个web对应一个ServletContext

ServletContext对象代表整个Web应用程序的上下文环境,它在应用程序启动时由Servlet容器创建,并在整个应用程序的生命周期中存在。每个Web应用程序都有一个唯一的ServletContext对象,并且该对象被所有在同一Web应用程序中运行的Servlet共享。


通过ServletContext对象,Servlet可以获取与整个应用程序相关的重要信息和资源,如:


初始化参数:ServletContext对象提供了方法来获取设置在web.xml配置文件中的应用程序级别的初始化参数。

资源访问:ServletContext对象提供了方法来获取应用程序范围内的资源,如读取文件、访问数据库连接池等。

上下文路径:ServletContext对象提供了方法来获取应用程序部署在服务器上的上下文路径。

共享属性:ServletContext对象提供了一种在应用程序范围内共享数据的方式,可供不同的Servlet实例之间进行交互。

总之,对于一个Web应用程序,ServletContext对象是代表整个应用程序的上下文环境,并且为所有运行在这个应用程序中的Servlet提供了共享的信息和资源访问能力。


getServletConfig()

ServletConfig接口表示Servlet的配置对象,它包含了Servlet的初始化参数和其他配置信息。每个Servlet实例都有一个对应的ServletConfig对象,用于存储该Servlet的配置数据。


通过调用getServletConfig()方法,可以获取当前Servlet实例的ServletConfig对象。ServletConfig对象提供了一系列方法来获取Servlet的配置信息,例如获取初始化参数、获取Servlet名称、获取Servlet上下文等。


常见的使用场景包括:


获取Servlet的初始化参数:通过getInitParameter(String name)方法可以获取指定名称的初始化参数的值。

获取Servlet的名称:通过getServletName()方法可以获取当前Servlet的名称。

获取Servlet的上下文信息:通过getServletContext()方法可以获取当前Servlet所在的ServletContext对象,从而获取整个Web应用程序的上下文信息。

总的来说,getServletConfig()方法返回的是当前Servlet实例的配置对象,通过这个对象可以获取Servlet的配置信息,以便在Servlet的运行过程中使用和处理。


getServletContext()

ServletContext对象表示整个Web应用程序的上下文环境,它是在Web应用程序启动时由Servlet容器创建并提供给每个Servlet使用的。它在整个应用程序中是唯一的,并且可以在所有的Servlet中共享和访问。


ServletContext对象提供了一系列方法,用于获取和设置与Web应用程序相关的信息,以及执行与应用程序环境和运行时状态有关的操作。一些常见的用途包括:


获取Web应用程序的初始化参数。

在应用程序范围内共享数据。

获取Web应用程序的上下文路径。

获取服务器和Servlet容器的信息。

通过getServletContext()方法,Servlet可以获取到当前Web应用程序的ServletContext对象,并利用它提供的方法来完成各种与应用程序环境相关的任务。


什么是上下文

上下文环境(Context)是指在特定范围内相关联的数据、配置和资源的集合,它提供了一种在这个范围内共享和访问这些内容的机制。在Web应用程序中,上下文环境是指整个应用程序的运行环境和配置信息。


具体来说,ServletContext对象表示整个Web应用程序的上下文环境。它是在应用程序启动时由Servlet容器创建的,并且在整个应用程序的生命周期中都存在。每个Web应用程序都有一个唯一的ServletContext对象。


上下文环境包含了与Web应用程序相关的重要信息,如:


初始化参数:在web.xml配置文件中定义的应用程序级别的初始化参数,可以通过ServletContext对象的方法获取到。

Servlet的上下文路径:表示Web应用程序部署在服务器上的路径,通过ServletContext对象的getContextPath()方法可以获取。

共享数据:可以在整个应用程序范围内共享和访问的数据,例如存储在ServletContext对象中的属性。

资源访问:可以通过ServletContext对象获取应用程序所需的共享资源,如数据库连接池、文件路径等。

上下文环境提供了一种在应用程序中共享和访问全局数据和资源的机制,使得不同的组件(如Servlet、Filter、Listener等)能够在应用程序中进行协同工作,共享信息和资源。它是Web应用程序的基础设施,与应用程序的运行和配置密切相关。


相关文章
|
6月前
|
存储 前端开发 JavaScript
基于JavaWeb实现停车场管理系统
基于JavaWeb实现停车场管理系统
|
6月前
|
前端开发 JavaScript Java
图书借阅管理平台|基于JavaWeb实现图书借阅系统
图书借阅管理平台|基于JavaWeb实现图书借阅系统
121 1
|
3月前
|
设计模式 Java 关系型数据库
【Java笔记+踩坑汇总】Java基础+JavaWeb+SSM+SpringBoot+SpringCloud+瑞吉外卖/谷粒商城/学成在线+设计模式+面试题汇总+性能调优/架构设计+源码解析
本文是“Java学习路线”专栏的导航文章,目标是为Java初学者和初中高级工程师提供一套完整的Java学习路线。
440 37
|
2月前
|
前端开发 Java 应用服务中间件
Javaweb学习
【10月更文挑战第1天】Javaweb学习
33 2
|
2月前
|
安全 Java Android开发
JavaWeb解压缩漏洞之ZipSlip与Zip炸弹
JavaWeb解压缩漏洞之ZipSlip与Zip炸弹
60 5
|
3月前
|
缓存 前端开发 Java
【Java面试题汇总】Spring,SpringBoot,SpringMVC,Mybatis,JavaWeb篇(2023版)
Soring Boot的起步依赖、启动流程、自动装配、常用的注解、Spring MVC的执行流程、对MVC的理解、RestFull风格、为什么service层要写接口、MyBatis的缓存机制、$和#有什么区别、resultType和resultMap区别、cookie和session的区别是什么?session的工作原理
【Java面试题汇总】Spring,SpringBoot,SpringMVC,Mybatis,JavaWeb篇(2023版)
|
6月前
|
前端开发 Java 关系型数据库
JavaWeb开发简介
JavaWeb开发简介
57 0
|
3月前
|
安全 Java Android开发
JavaWeb解压缩漏洞之ZipSlip与Zip炸弹
JavaWeb解压缩漏洞之ZipSlip与Zip炸弹
116 2
|
3月前
|
SQL JSON JavaScript
JavaWeb基础9——VUE,Element&整合Javaweb的商品管理系统
Vue 指令、生命周期、this和$、vue脚手架进行模块化开发/ElementUI框架、综合案例,element商品列表展示增删改查
JavaWeb基础9——VUE,Element&整合Javaweb的商品管理系统
|
6月前
|
SQL Java 数据库连接
JavaWeb Mapper代理开发
JavaWeb Mapper代理开发