ServletConfig和ServletContext

1.ServletConfig

javax.servlet.ServletConfig的一个接口

ServletConfig是servlet配置对象,该对象在初始化时将信息传递给servlet,一个servlet对象对应一个servletconfig对象,100个servlet对象对应100个servletconfig对象。

在doGet或者doPost方法中可以直接获取ServletConfig对象:

 ServletConfig config = getServletConfig();

其主要有四个方法:以下例子会涉及到

先准备两个servlet类并且配置好web.xml

web.xml:在servlet标签中配置config的信息

<!--    Servlet03-->
    <servlet>
        <servlet-name>servlet03</servlet-name>
        <servlet-class>com.dh.servlet.Servlet03</servlet-class>
<!--    在servlet标签中配置config的信息-->
        <init-param>
            <param-name>name</param-name>
            <param-value>zhangsan</param-value>
        </init-param>
<!--    可配置多个-->
        <init-param>
            <param-name>age</param-name>
            <param-value>18</param-value>
        </init-param>
    </servlet>
    <servlet-mapping>
        <servlet-name>servlet03</servlet-name>
        <url-pattern>/servlet03</url-pattern>
    </servlet-mapping>

<!--    Servlet04-->
    <servlet>
        <servlet-name>servlet04</servlet-name>
        <servlet-class>com.dh.servlet.Servlet03</servlet-class>
        <init-param>
            <param-name>name</param-name>
            <param-value>lisi</param-value>
        </init-param>
        <init-param>
            <param-name>age</param-name>
            <param-value>20</param-value>
        </init-param>
    </servlet>
    <servlet-mapping>
        <servlet-name>servlet04</servlet-name>
        <url-pattern>/servlet04</url-pattern>
    </servlet-mapping>

servlet类:

Servlet03:(Servlet04所有的代码都一致,所以不在此粘贴代码)

package com.dh.servlet;

import javax.servlet.ServletConfig;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.util.Enumeration;

public class Servlet03 extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        //获取servletConfig
        ServletConfig config = getServletConfig();
        System.out.println("servlet03:"+config);
        
        //获取servlet的名字
        System.out.println(config.getServletName());
        
        //获取web.xml中配置的指定参数的值
        String value = config.getInitParameter("name");
        System.out.println(value);
        
        //获取web.xml中配置的参数的所有name
        Enumeration<String> names = config.getInitParameterNames();
        while (names.hasMoreElements()){
            System.out.println(names.nextElement());
        }
    }
}

测试:

启动服务器先请求http://localhost:8080/servlet_01_javaweb/servlet03,再请求http://localhost:8080/servlet_01_javaweb/servlet04

servlet03:org.apache.catalina.core.StandardWrapperFacade@14f8b464
servlet03
zhangsan
name
age
----------------------------------------------------------------(手动加的分隔符)
servlet04:org.apache.catalina.core.StandardWrapperFacade@2ab0b564
servlet04
lisi
name
age

可以验证结果,每个servlet对象都有一个对应的servletconfig对象。

2.ServletContext

是一个接口。

ServletContext是上下文对象,对应的是web.xml文件,一个webapp只有一个ServletContext对象。所以同一个webapp中的servlet对象共享一个ServletContext对象,所以servletcontext对象也可以看作是所有servlet对象的四周环境的代表。

服务器启动时实例化ServletContext对象,关闭服务器时销毁ServletContext对象。

所以,ServletContext可以在同一个webapp中跨用户存取数据,即想要每个用户都能访问的数据就放在servletcontext对象中。

(一般放在servletcontext中的数据不建议多线程共享,因为修改就会有线程安全问题)

ServletContext接口中有很多的方法,常用的为以下六个:

web.xml:

<!--    配置context属性,可配置多个-->
    <context-param>
        <param-name>name</param-name>
        <param-value>Jerry</param-value>
    </context-param>
<!--    Servlet05-->
    <servlet>
        <servlet-name>servlet05</servlet-name>
        <servlet-class>com.dh.servlet.Servlet05</servlet-class>
    </servlet>
    <servlet-mapping>
        <servlet-name>servlet05</servlet-name>
        <url-pattern>/servlet05</url-pattern>
    </servlet-mapping>
<!--    Servlet06-->
    <servlet>
        <servlet-name>servlet06</servlet-name>
        <servlet-class>com.dh.servlet.Servlet06</servlet-class>
    </servlet>
    <servlet-mapping>
        <servlet-name>servlet06</servlet-name>
        <url-pattern>/servlet06</url-pattern>
    </servlet-mapping>

Servlet05:存数据及移除数据

package com.dh.servlet;

import javax.servlet.ServletConfig;
import javax.servlet.ServletContext;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.util.Enumeration;

public class Servlet05 extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        //两种获取ServletConfig对象的方法
        //1.ServletConfig中包含ServletConfig对象,通过ServletConfig获取
        ServletConfig config = getServletConfig();
        ServletContext servletContext = config.getServletContext();
        //2.直接获取ServletConfig对象
        ServletContext context = getServletContext();

        //输出
        System.out.println(context);

        //获取web.xml的配置信息中指定属性的值
        String value = context.getInitParameter("name");
        System.out.println(value);

        //获取web.xml配置信息中的所有属性名
        Enumeration<String> names = context.getInitParameterNames();
        while (names.hasMoreElements()){
            System.out.println(names.nextElement());
        }

        //往域对象中存数据
        context.setAttribute("class1","1");
        context.setAttribute("class2","2");
        //取域对象中的数据
        System.out.println(context.getAttribute("class1"));
        //移除域对象中的数据
        context.removeAttribute("class2");
    }
}

servlet06:取数据

package com.dh.servlet;

import javax.servlet.ServletConfig;
import javax.servlet.ServletContext;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.util.Enumeration;

public class Servlet06 extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        //获取ServletConfig对象
        ServletContext context = getServletContext();
        System.out.println("-------------------------------------");
        //输出
        System.out.println(context);

        //获取web.xml的配置信息中指定属性的值
        String value = context.getInitParameter("name");
        System.out.println(value);

        //获取web.xml配置信息中的所有属性名
        Enumeration<String> names = context.getInitParameterNames();
        while (names.hasMoreElements()){
            System.out.println(names.nextElement());
        }
        //取域对象中的数据
        System.out.println(context.getAttribute("class1"));
        System.out.println(context.getAttribute("class2"));
    }
}

先执行http://localhost:8080/servlet_01_javaweb/servlet05,再执行http://localhost:8080/servlet_01_javaweb/servlet06

测试结果:

org.apache.catalina.core.ApplicationContextFacade@4b1e4a38
Jerry
name
1
-------------------------------------
org.apache.catalina.core.ApplicationContextFacade@4b1e4a38
Jerry
name
1
null

可以看到,不同的servlet对象共享一个ServletContext对象,也都能取到web.xml中配置的全局属性,存在ServletContext域对象中的数据也是共享的。

ServletContext还有两个常用的方法,一个通过相对路径获取文件的绝对路径,一个获取当前的项目名:

//获取项目的绝对路径
System.out.println(context.getRealPath(""));
System.out.println(context.getRealPath("/"));
//C:\Users\DH\Desktop\java\Tomcat服务器\Tomcat服务器\windows x64\apache-tomcat-8.5.16-windows-x64\apache-tomcat-8.5.16\webapps\servlet_01_javaweb\

System.out.println(context.getRealPath("/WEB-INF/web.xml"));
//C:\Users\DH\Desktop\java\Tomcat服务器\Tomcat服务器\windows x64\apache-tomcat-8.5.16-windows-x64\apache-tomcat-8.5.16\webapps\servlet_01_javaweb\WEB-INF\web.xml

System.out.println(context.getRealPath("index.jsp"));
//C:\Users\DH\Desktop\java\Tomcat服务器\Tomcat服务器\windows x64\apache-tomcat-8.5.16-windows-x64\apache-tomcat-8.5.16\webapps\servlet_01_javaweb\index.jsp

//获取当前的项目名
System.out.println(context.getContextPath());
//结果:/servlet_01_javaweb
posted @ 2021-03-11 16:31  deng-hui  阅读(115)  评论(0编辑  收藏  举报