Javaweb(二) servlet_Config

2 ServletConfig

2.1 ServletConfig概述

2.1.1 基本概念

它是Servlet的配置参数对象,在Servlet规范中,允许为每个Servlet都提供一些初始化配置。所以,每个Servlet都一个自己的ServletConfig。它的作用是在Servlet初始化期间,把一些配置信息传递给Servlet。

2.1.2 生命周期]

由于它是在初始化阶段读取了web.xml中为Servlet准备的初始化配置,并把配置信息传递给Servlet,所以生命周期与Servlet相同。这里需要注意的是,如果Servlet配置了1,那么ServletConfig也会在应用加载时创建。

2.2 ServletConfig的使用

2.2.1 如何获取

首先,要清楚的认识到,它可以为每个Servlet都提供初始化参数,所以肯定可以在每个Servlet中都配置。是配置在Servlet的声明部分

/**
 * 演示Servlet的初始化参数对象
 */
public class ServletDemo8 extends HttpServlet {

    //定义Servlet配置对象ServletConfig
    private ServletConfig servletConfig;

    /**
     * 在初始化时为ServletConfig赋值
     * @param config
     * @throws ServletException
     */
    @Override
    public void init(ServletConfig config) throws ServletException {
        this.servletConfig = config;
    }

    /**
     * @param req
     * @param resp
     * @throws ServletException
     * @throws IOException
     */
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        //输出ServletConfig
        System.out.println(servletConfig);
    }

    /**
     * 调用doGet方法
     * @param req
     * @param resp
     * @throws ServletException
     * @throws IOException
     */
    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        doGet(req,resp);
    }
}

<servlet>
    <servlet-name>servletDemo8servlet-name>
    <servlet-class>com.itheima.web.servlet.ServletDemo8servlet-class>
servlet>
<servlet-mapping>
    <servlet-name>servletDemo8servlet-name>
    <url-pattern>/servletDemo8url-pattern>
servlet-mapping>

2.2.2 如何配置

需要使用标签中的标签来配置。Servlet的初始化参数都是配置在Servlet的声明部分的。并且每个Servlet都支持有多个初始化参数,并且初始化参数都是以键值对的形式存在的。配置示例:


<servlet>
    <servlet-name>servletDemo8servlet-name>
    <servlet-class>com.itheima.web.servlet.ServletDemo8servlet-class>
    
    <init-param>
        
        <param-name>encodingparam-name>
        
        <param-value>UTF-8param-value>
    init-param>
    
    <init-param>
        <param-name>servletInfoparam-name>
        <param-value>This is Demo8param-value>
    init-param>
servlet>
<servlet-mapping>
    <servlet-name>servletDemo8servlet-name>
    <url-pattern>/servletDemo8url-pattern>
servlet-mapping>

2.2.3 常用方法

Javaweb(二) servlet_Config_第1张图片

/**
 * 演示Servlet的初始化参数对象
 */
public class ServletDemo8 extends HttpServlet {

    //定义Servlet配置对象ServletConfig
    private ServletConfig servletConfig;

    /**
     * 在初始化时为ServletConfig赋值
     * @param config
     * @throws ServletException
     */
    @Override
    public void init(ServletConfig config) throws ServletException {
        this.servletConfig = config;
    }

    /**
     * doGet方法输出一句话
     * @param req
     * @param resp
     * @throws ServletException
     * @throws IOException
     */
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        //1.输出ServletConfig
        System.out.println(servletConfig);
        //2.获取Servlet的名称
        String servletName= servletConfig.getServletName();
        System.out.println(servletName);
        //3.获取字符集编码
        String encoding = servletConfig.getInitParameter("encoding");
        System.out.println(encoding);
        //4.获取所有初始化参数名称的枚举
        Enumeration<String> names = servletConfig.getInitParameterNames();
        //遍历names
        while(names.hasMoreElements()){
            //取出每个name
            String name = names.nextElement();
            //根据key获取value
            String value = servletConfig.getInitParameter(name);
            System.out.println("name:"+name+",value:"+value);
        }
        //5.获取ServletContext对象
        ServletContext servletContext = servletConfig.getServletContext();
        System.out.println(servletContext);
    }

    /**
     * 调用doGet方法
     * @param req
     * @param resp
     * @throws ServletException
     * @throws IOException
     */
    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        doGet(req,resp);
    }
}

Javaweb(二) servlet_Config_第2张图片

3 ServletContext

3.1 ServletContext概述

3.1.1 基本介绍

ServletContext对象,它是应用上下文对象。每一个应用有且只有一个ServletContext对象。它可以实现让应用中所有Servlet间的数据共享。

3.1.2 生命周期

出生——活着——死亡
出生: 应用一加载,该对象就被创建出来了。一个应用只有一个实例对象。(Servlet和ServletContext都是单例的)
活着:只要应用一直提供服务,该对象就一直存在。
死亡:应用被卸载(或者服务器挂了),该对象消亡。

3.1.3 域对象概念

域对象的概念,它指的是对象有作用域,即有作用范围。
域对象的作用,域对象可以实现数据共享。不同作用范围的域对象,共享数据的能力不一样。
在Servlet规范中,一共有4个域对象。ServletContext就是其中一个。它是web应用中最大的作用域,叫application域。每个应用只有一个application域。它可以实现整个应用间的数据共享功能。

3.2 ServletContext的使用

3.2.1 如何获取

获取ServletContext对象的方式,只需要调用ServletConfig对象的getServletContext()方法就可以了。具体代码如下:创建一个新的Servlet用于演示ServletContext。

/**
 * 用于演示ServletContext对象的使用
 */
public class ServletDemo9 extends HttpServlet {

    //定义Servlet配置对象ServletConfig
    private ServletConfig servletConfig;

    /**
     * 在初始化时为ServletConfig赋值
     * @param config
     * @throws ServletException
     */
    @Override
    public void init(ServletConfig config) throws ServletException {
        this.servletConfig = config;

    }

    /**
     *
     * @param req
     * @param resp
     * @throws ServletException
     * @throws IOException
     */
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        //1.获取ServletContext对象
        ServletContext servletContext = servletConfig.getServletContext();
        System.out.println(servletContext);
    }

    /**
     * 调用doGet方法
     * @param req
     * @param resp
     * @throws ServletException
     * @throws IOException
     */
    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        doGet(req,resp);
    }
}

    <servlet>
        <servlet-name>servletDemo9servlet-name>
        <servlet-class>com.itheima.web.servlet.ServletDemo9servlet-class>
    servlet>
    <servlet-mapping>
        <servlet-name>servletDemo9servlet-name>
        <url-pattern>/servletDemo9url-pattern>
    servlet-mapping>

在实际开发中,如果每个Servlet对ServletContext都使用频繁的话,那么每个Servlet里定义ServletConfig,再获取ServletContext的代码将非常多,造成大量的重复代码。Servlet规范的定义中也想到了这一点,所以它在GenericServlet中,已经声明好了ServletContext获取的方法,如下图所示:
Javaweb(二) servlet_Config_第3张图片
这里的Servlet都是继承自HttpServlet,而HttpServlet又是GenericServlet的子类,所以在获取ServletContext时,如果当前Servlet没有用到它自己的初始化参数时,就可以不用再定义初始化参数了,而是直接改成下图所示的代码即可:
Javaweb(二) servlet_Config_第4张图片

3.2.2 如何配置

ServletContext既然被称之为应用上下文对象,所以它的配置是针对整个应用的配置,而非某个特定Servlet的配置。它的配置被称为应用的初始化参数配置。
配置的方式,需要在标签中使用来配置初始化参数。具体代码如下:


<context-param>
    
    <param-name>servletContextInfoparam-name>
    
    <param-value>This is application scopeparam-value>
context-param>

<context-param>
    <param-name>globalEncodingparam-name>
    <param-value>UTF-8param-value>
context-param>

3.2.3ServletContext 常用的方法

返回值 方法名 说明
String getInitParameter(String name) 根据名称获取全局配置的参数
String getContextPath() 获取当前应用的访问虚拟路径
String getRealPath(String path) 根据虚拟目录获取应用部署的磁盘绝对路径

Javaweb(二) servlet_Config_第5张图片
Javaweb(二) servlet_Config_第6张图片

返回值 方法名 说明
void setAttribute(String name,Object value) 向应用应用域对象中存储数据
Object getAttribute(String name) 通过名称获取应用域对象中的数据
void removeAttribute(String name) 通过名称移除应用域对象中的数据

你可能感兴趣的:(Javaweb,java)