1. 程式人生 > >JaveWeb學習之Servlet(二):ServletConfig和ServletContext

JaveWeb學習之Servlet(二):ServletConfig和ServletContext

ServletConfig

繼續檢視ServletConfig原始碼:

package javax.servlet;
public interface ServletConfig {
    public String getServletName();
    public ServletContext getServletContext();
    public String getInitParameter(String name);
    public Enumeration<String> getInitParameterNames();
}

 

getServletName();

getServletName方法用於獲取當前Servlet名稱,這個是在xml中配置的:<servlet-name>springmvcdemo</servlet-name>;

getServletContext();

getServletContext方法用於獲取代表當前web應用的ServletContext物件;

getInitParameter(String name);

getInitParameter方法用於獲取當前Servlet指定名稱的初始化引數的值;

getInitParameterNames();

getInitParameterNames獲取當前Servlet所有初始化引數的名字列舉集合;

Servlet容器初始化時每一個Servlet物件時,會為其建立一個ServletConfig物件,通過Servlet的init方法,會把ServletContext物件傳遞給當前Servlet:

public void init(ServletConfig config) throws ServletException;

 

之後使用this.getServletConfig()物件獲取當前Servlet的ServletConfig物件;

ServletConfig servletConfig = getServletConfig();

 

我們在xml中配置Servlet時,還可以配置Servlet初始化引數資訊:

<servlet>
    <servlet-name>Servlet_1</servlet-name>
    <servlet-class>com.guitu.servlet.Servlet_1</servlet-class>
    <init-param>
        <param-name>username</param-name>
        <param-value>zhangkuan</param-value>
    </init-param>
</servlet>

 

之後可以通過servletConfig獲取InitParameter引數;

Enumeration<String> initParameterNames = servletConfig.getInitParameterNames();

 

獲得的是一個引數名字的列舉集合,在呼叫getInitParameter(String name)即可獲得引數的值:

String initParameter = servletConfig.getInitParameter(parameterName);

 

ServletContext

Servlet容器啟動後,會為每一個獨立的Web應用建立一個ServletContext例項,代表當前Web應用;
ServletContext由所有Servlet共享,所以ServletContext中的引數所有Servlet都能夠獲取,多個web元件之間使用它實現資料共享;

ServletContext常用方法:

getAttribute(String name);

獲取ServletContext中儲存的資料;

setAttribute(String name, Object obj);

向ServletContext中儲存資料;

getInitParameter(String name);

獲取<context-param>標籤中為整個Web應用配置的初始化引數;

getInitParameterNames();

一次性獲取<context-param>裡所有的初始化引數名的列舉;

getRealPath(String path);

獲取應用程式內指定資源的絕對路徑;

getResource(String parh);

path必須是/開頭,代表當前web應用程式的根目錄。返回一個代表某個資源的URL物件;

getResoutceAsStream(String parh);

可以使用相對於根目錄的路徑訪問到web目錄下的所有檔案,而不必知道絕對路徑,返回檔案流;

ServletConfig、ServletContext測試Demo

1、Servlet_1:

package com.guitu.servlet;

import java.io.IOException;
import java.util.Enumeration;

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;

public class Servlet_1 extends HttpServlet {

    protected void doGet(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {

        ServletConfig servletConfig = getServletConfig();
        Enumeration<String> initParameterNames = servletConfig.getInitParameterNames();
        System.out.println("=====Servlet_1.ServletConfig.InitParameter=====");
        while (initParameterNames.hasMoreElements()) {
            String parameterName = initParameterNames.nextElement();
            String initParameter = servletConfig.getInitParameter(parameterName);
            System.out.println(parameterName + ":" + initParameter);
        }

        System.out.println("=====Servlet_1.ServletContext.InitParameter=====");
        ServletContext servletContext = getServletContext();
        Enumeration<String> contextInitParameters = servletContext.getInitParameterNames();
        while (contextInitParameters.hasMoreElements()) {
            String parameterName = contextInitParameters.nextElement();
            String initParameter = servletContext.getInitParameter(parameterName);
            System.out.println(parameterName + ":" + initParameter);
        }

        servletContext.setAttribute("message", "Hello World !");

    }

    protected void doPost(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        doGet(request, response);
    }

}

 

2、Servlet_2:

package com.guitu.servlet;

import java.io.IOException;
import java.util.Enumeration;

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;

public class Servlet_2 extends HttpServlet {

    protected void doGet(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {

        ServletConfig servletConfig = getServletConfig();
        Enumeration<String> initParameterNames = servletConfig.getInitParameterNames();
        System.out.println("=====Servlet_2.ServletConfig.InitParameter======");
        while (initParameterNames.hasMoreElements()) {
            String parameterName = initParameterNames.nextElement();
            String initParameter = servletConfig.getInitParameter(parameterName);
            System.out.println(parameterName + ":" + initParameter);
        }

        System.out.println("=====Servlet_2.ServletContext.InitParameter=====");
        ServletContext servletContext = getServletContext();
        Enumeration<String> contextInitParameters = servletContext.getInitParameterNames();
        while (contextInitParameters.hasMoreElements()) {
            String parameterName = contextInitParameters.nextElement();
            String initParameter = servletContext.getInitParameter(parameterName);
            System.out.println(parameterName + ":" + initParameter);
        }

        System.out.println("=====servletContext.getAttribute=====");
        Object object = servletContext.getAttribute("message");
        System.out.println("message:" + object);
    }

    protected void doPost(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        doGet(request, response);
    }

}

 

3、web.xml配置:

<context-param>
    <param-name>domain</param-name>
    <param-value>guitu18.com</param-value>
</context-param>
<context-param>
    <param-name>name</param-name>
    <param-value>夜月歸途</param-value>
</context-param>
<servlet>
    <servlet-name>Servlet_1</servlet-name>
    <servlet-class>com.guitu.servlet.Servlet_1</servlet-class>
    <init-param>
        <param-name>username</param-name>
        <param-value>zhangkuan</param-value>
    </init-param>
</servlet>
<servlet-mapping>
    <servlet-name>Servlet_1</servlet-name>
    <url-pattern>/Servlet_1</url-pattern>
</servlet-mapping>
<servlet>
    <servlet-name>Servlet_2</servlet-name>
    <servlet-class>com.guitu.servlet.Servlet_2</servlet-class>
    <init-param>
        <param-name>password</param-name>
        <param-value>Guitu18</param-value>
    </init-param>
</servlet>
<servlet-mapping>
    <servlet-name>Servlet_2</servlet-name>
    <url-pattern>/Servlet_2</url-pattern>
</servlet-mapping>

 

在Servlet1和Servlet2中,分別獲得了ServletConfig物件和ServletContext物件;
在web.xml中,也分別為他們配置了不同的初始化引數,同時配置了一個context級的初始化引數;
之後分別在兩個Servlet中獲取ServletConfig和ServletContext的InitParamer引數;
在Servlet1中還通過setAttribute向ServletContext域中儲存了一條訊息message,在Servlet2中,便可以通過getAttribute獲取這條訊息;

4、訪問兩個Servlet,先訪問Servlet_1:

=====Servlet_1.ServletConfig.InitParameter=====
username:zhangkuan
=====Servlet_1.ServletContext.InitParameter=====
domain:guitu18.com
name:夜月歸途

 

再訪問Servlet_2:

=====Servlet_2.ServletConfig.InitParameter=====
password:Guitu18
=====Servlet_2.ServletContext.InitParameter=====
domain:guitu18.com
name:夜月歸途
=====servletContext.getAttribute=====
message:Hello World !

 

可以看到,每個Servlet擁有自己ServletConfig物件,資料不互通,而ServletContext中的初始化引數和context域中的引數,是所有Servlet共享的,可以使用context域實現資料共享;