Servlet学习之ServletConfig和ServletContext

1.ServletConfig

1.1 概述

  • ServletConfig是Servlet对象的配置存储对象
  • ServletConfig封装了web.xml文件中**<servlet></servlet>**标签中的配置信息
  • 一个Servlet对象对应一个ServletConfig对象。
  • Servlet对象和ServletConfig对象都是由服务器创建,默认情况下他们都是用户发出第一次请求的时候被创建

如果我们看一下Servlet接口的源码不难发现,ServletConfig是作为init()方法的参数出现的。

1.2 常用方法

public String getInitParameter(String name); // 通过初始化参数的name获取value

public Enumeration<String> getInitParameterNames(); // 获取所有的初始化参数的name

public ServletContext getServletContext(); // 获取ServletContext对象

public String getServletName(); // 获取Servlet的name

1.3 部分演示

单单是文字可能不够直接,所以我们使用代码来展示这个ServletConfig到底装了什么玩意。

首先说明一下服务器的环境,我们使用的Tomcat10,该webapp的名字为xmm。

展示一下Servlet的代码:

package com.bjpowernode.javaweb.servlet;

import jakarta.servlet.*;
import java.io.IOException;
import java.io.PrintWriter;
import java.util.Enumeration;

public class AServlet extends GenericServlet {
    @Override
    public void service(ServletRequest req, ServletResponse res) throws ServletException, IOException {
        res.setContentType("text/html");
        PrintWriter out = res.getWriter();
        //获取该Servlet对象的ServletConfig对象
        ServletConfig servletConfig = this.getServletConfig();
		//使用getInitParameterNames()来获取配置信息的名字
        Enumeration<String> initParameterNames =  servletConfig.getInitParameterNames();
        //遍历容器将其展示在网页上
        while (initParameterNames.hasMoreElements()){
            String name = initParameterNames.nextElement();
        //getInitPatameter(String name)获得配置信息的值
            out.print(name +" "+ this.getInitParameter(name) + "<br>");
        }
    }
}

再看一下WebApp的配置文件(web.xml)中关于AServlet的内容:

<servlet>                                                                  
    <servlet-name>AServlet</servlet-name>                                  
    <servlet-class>com.bjpowernode.javaweb.servlet.AServlet</servlet-class>
    <init-param>                                                           
        <param-name>测试数据1</param-name>                                     
        <param-value></param-value>                                       
    </init-param>                                                          
    <init-param>                                                           
        <param-name>测试数据2</param-name>                                     
        <param-value></param-value>                                       
    </init-param>                                                          
    <init-param>                                                           
        <param-name>测试数据3</param-name>                                     
        <param-value></param-value>                                       
    </init-param>                                                          
</servlet>                                                                 
<servlet-mapping>                                                          
    <servlet-name>AServlet</servlet-name>                                  
    <url-pattern>/a</url-pattern>                                          
</servlet-mapping>                                                         

再接下来我们启动Tomcat服务器,并通过路径启动AServlet中的服务。

页面展示效果:
请添加图片描述
这样以来ServletConfig中的内容是不是就非常的清晰了。

2.ServletContext

2.1 概述

  • 从上面我们可以知道,一个Servlet对象对应一个ServletConfig,而一个WebApp对应一个ServletContext对象。
  • ServletContext对象在服务器启动的时候被服务器创建,在服务器关闭的时候被销毁。
  • ServletConfig对应的是<servlet></servlet>中的内容,而ServletContext对应的是web.xml中的内容。

2.2 常用方法

public String getInitParameter(String name); // 通过初始化参数的name获取value

public Enumeration<String> getInitParameterNames(); // 获取所有的初始化参数的name

public String getContextPath();// 获取应用的根路径(非常重要),因为在java源代码当中有一些地方可能会需要应用的根路径,这个方法可以动态获取应用的根路径

public String getRealPath(String path);// 获取文件的绝对路径(真实路径),参数为相对路径

// 这两个方法用来记录日志,日志文件存放在/TOMCAT_HOME/logs目录下
public void log(String message);
public void log(String message, Throwable t);
// Tomcat服务器的logs目录下都有哪些日志文件?
// catalina.2021-11-05.log 服务器端的java程序运行的控制台信息。
// localhost.2021-11-05.log ServletContext对象的log方法记录的日志信息存储到这个文件中。
// localhost_access_log.2021-11-05.txt 访问日志

// 存(向ServletContext应用域中存数据)
public void setAttribute(String name, Object value); // map.put(k, v)
// 取(从ServletContext应用域中取数据)
public Object getAttribute(String name); // Object v = map.get(k)
// 删(删除ServletContext应用域中的数据)
public void removeAttribute(String name); // map.remove(k)

2.3 部分演示

同样的我们用代码来展示ServletContext中的内容:

AServlet:

package com.bjpowernode.javaweb.servlet;

import jakarta.servlet.*;
import java.io.IOException;
import java.io.PrintWriter;
import java.util.Enumeration;

public class AServlet extends GenericServlet {
    @Override
    public void service(ServletRequest req, ServletResponse res) throws ServletException, IOException {
        res.setContentType("text/html");
        PrintWriter out = res.getWriter();
        ServletContext servletContext= this.getServletContext();

        Enumeration<String> initParameterNames =  servletContext.getInitParameterNames();
        while (initParameterNames.hasMoreElements()){
            String name = initParameterNames.nextElement();
            out.print(name +"<br>");
        }
    }
}

配置文件:

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd"
         version="4.0">

    <servlet>
        <servlet-name>AServlet</servlet-name>
        <servlet-class>com.bjpowernode.javaweb.servlet.AServlet</servlet-class>
    </servlet>
    <servlet-mapping>
        <servlet-name>AServlet</servlet-name>
        <url-pattern>/a</url-pattern>
    </servlet-mapping>


    <context-param>
        <param-name>测试数据1</param-name>
        <param-value></param-value>
    </context-param>
    <context-param>
        <param-name>测试数据2</param-name>
        <param-value></param-value>
    </context-param>
    <context-param>
        <param-name>测试数据3</param-name>
        <param-value></param-value>
    </context-param>
    
</web-app>

结果:
请添加图片描述

这里我们说一下<context-param><context-param>中的配置信息,这里的配置信息是应用级别的,对一个项目中的所有的App都生效。

如果你不想这样,你只是想让这一段配置信息只对一个Servlet对象起作用,那我们只需要把该标签放在<servlet></servlet>即可。

2.4 关于ServletContext存放的数据

首先我们已经知道,ServletContext中的数据是被一整个项目所共享的。那么什么样的数据适合存放在ServletContext呢?答案是:数据量小、所有用户共享、又不修改

  • 数据量小:如果数据量比较大的话,太占用堆内存,而且这个对象的生命周期比较长,只有当服务器关闭的时候才会被销毁。
  • 所有用户共享的数据:因为Servlet对象只有一个,如果这个数据只对一个对象所享用,那么就会浪费资源。
  • 不修改:所有用户共享的数据,如果涉及到修改操作,必然会存在线程并发所带来的安全问题。所以放在ServletContext对象中的数据一般都是只读的。
  • 5
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

少不入川。

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值