【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应用程序的基础设施,与应用程序的运行和配置密切相关。


相关文章
|
2月前
|
Web App开发 SQL Java
javaweb实现分页(二)
javaweb实现分页(二)
19 1
|
2月前
|
SQL 关系型数据库 MySQL
javaweb实现分页查询(一)
javaweb实现分页查询(一)
20 0
|
2月前
|
SQL 关系型数据库 MySQL
javaweb中实现分页,持续更新……
javaweb中实现分页,持续更新……
19 1
|
2月前
|
Java Spring 容器
[JavaWeb]——过滤器filter与拦截器Interceptor的使用、执行过程、区别
[JavaWeb]——过滤器filter与拦截器Interceptor的使用、执行过程、区别
|
2月前
JavaWeb 开发之 ServletContext 的和使用
JavaWeb 开发之 ServletContext 的和使用
23 1
|
2月前
|
SQL 前端开发 Java
Java后端进阶之路: JavaWeb(四)
Java后端进阶之路: JavaWeb
35 1
|
XML SQL Java
Java后端进阶之路: JavaWeb(三)
Java后端进阶之路: JavaWeb
34 1
|
3月前
|
设计模式 XML 前端开发
JavaWeb 会话_过滤_监听器
JavaWeb 会话_过滤_监听器
28 0
|
4月前
|
SQL JSON 前端开发
JavaWeb:商品管理系统(Vue版)
JavaWeb商品管理系统是一个使用Java语言开发的,用于管理商品信息的Web应用程序。它提供了一套完整的功能,包括商品的增加、删除、修改和查询等操作。
52 2
JavaWeb:商品管理系统(Vue版)
|
4月前
|
Java 关系型数据库 MySQL