Servlet ServletContext配置資訊

ServletContext的對象由Web容器在部署專案時創建。 該對象可用於從web.xml檔獲取配置資訊。 每個Web應用程式只有一個ServletContext對象。

如果有資訊要共用給多個servlet使用,最好在web.xml檔中使用<context-param>元素提供它。

ServletContext的優點

如果有任何資訊要共用給所有的servlet使用,並且要讓它容易維護,最好的辦法就是在web.xml檔中提供這些資訊,所以如果資訊要更改直接在web.xml中修改,而不需要修改servlet代碼。

ServletContext介面的使用

有很多ServletContext對象可以使用。 其中一些如下:

  • ServletContext對象提供容器和servlet之間的介面。
  • 使用ServletContext對象在web.xml檔獲取配置資訊。
  • ServletContext對象可用於設置,獲取或刪除web.xml檔中屬性。
  • ServletContext對象可用於提供應用程式間通信。

參考以下示意圖 -

常用的ServletContext介面方法

給出了一些常用的ServletContext介面方法。

序號 方法 描述
1 public String getInitParameter(String name) 返回指定參數名稱的參數值。
2 public Enumeration getInitParameterNames() 返回上下文的初始化參數的名稱。
3 public void setAttribute(String name,Object object) 在應用程式範圍內設置給定的對象。
4 public Object getAttribute(String name) 返回指定名稱的屬性。
5 public Enumeration getInitParameterNames() 返回上下文的初始化參數的名稱,作為String對象的枚舉。
6 public void removeAttribute(String name) 從servlet上下文中刪除給定名稱的屬性。

如何獲取ServletContext介面的對象?

  • 通過ServletConfig介面的getServletContext()方法返回ServletContext對象。
  • 通過GenericServlet類的getServletContext()方法返回ServletContext對象。

getServletContext()方法的語法

public ServletContext getServletContext()

getServletContext()方法的示例

//We can get the ServletContext object from ServletConfig object
ServletContext application=getServletConfig().getServletContext();

//Another convenient way to get the ServletContext object
ServletContext application=getServletContext();

在Context範圍內提供初始化參數的語法

Web應用程式的context-param元素的子元素用於定義應用程式範圍中的初始化參數。 參數名稱和參數值是context-param的子元素。param-name元素定義參數名稱,param-value定義其值。參考以下配置代碼片段 -

<web-app>
 ......
  <context-param>
    <param-name>parameter_name</param-name>
    <param-value>parameter_value</param-value>
  </context-param>
 ......
</web-app>

獲取初始化參數的ServletContext示例

這個例子中,從web.xml檔獲取初始化參數並列印初始化參數的值。請注意,ServletContext的對象表示應用程式範圍。所以如果從web.xml檔中更改參數的值,所有的servlet類都將獲得更改的值。所以不需要修改每個servlet中的值。最好通過web.xml檔中的context-param元素為多個servlet提供公共資訊。下麵來看一個簡單的例子:

打開Eclipse,創建一個動態Web專案,其專案結構如下所示 -

以下是幾個主要的代碼檔 -

檔:ContextServlet.java -

package com.zaixian;

import java.io.IOException;
import java.io.PrintWriter;

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;

/**
 * Servlet implementation class ContextServlet
 */
public class ContextServlet extends HttpServlet {
    private static final long serialVersionUID = 1L;

    /**
     * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse
     *      response)
     */
    protected void doGet(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        // TODO Auto-generated method stub
        response.setContentType("text/html");
        PrintWriter pw = response.getWriter();

        // creating ServletContext object
        ServletContext context = getServletContext();

        // Getting the value of the initialization parameter and printing it
        String driverName = context.getInitParameter("dname");
        pw.println("driver name is = <b>'" + driverName+"'</b>");

        pw.close();
    }

}

檔:web.xml -

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xmlns="http://xmlns.jcp.org/xml/ns/javaee"
    xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd"
    id="WebApp_ID" version="3.1">
    <display-name>ServletContext</display-name>
    <welcome-file-list>
        <welcome-file>index.html</welcome-file>
    </welcome-file-list>
    <servlet>
        <servlet-name>ContextServ</servlet-name>
        <servlet-class>com.zaixian.ContextServlet</servlet-class>
    </servlet>

    <context-param>
        <param-name>dname</param-name>
        <param-value>com.mysql.jdbc.Driver</param-value>
    </context-param>
    <servlet-mapping>
        <servlet-name>ContextServ</servlet-name>
        <url-pattern>/context</url-pattern>
    </servlet-mapping>
</web-app>

在編寫完成上述代碼後,部署這個Web應用,打開流覽器訪問URL: http://localhost:8080/ServletContext/context ,如果程式沒有錯誤,應該會看到以下結果 -

獲取所有初始化參數的ServletContext示例

在這個例子中,我們將從web.xml檔中獲取所有初始化參數。要獲取所有參數,需要在servlet類中使用getInitParameterNames()方法。

在上面專案中,新建一個名稱為:ContextServletAll.java 的Servlet,其代碼如下 -

package com.zaixian;

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

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;

/**
 * Servlet implementation class ContextServletAll
 */
public class ContextServletAll extends HttpServlet {
    private static final long serialVersionUID = 1L;

    /**
     * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse
     *      response)
     */
    protected void doGet(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        // TODO Auto-generated method stub
        response.setContentType("text/html");
        PrintWriter out = response.getWriter();

        ServletContext context = getServletContext();
        Enumeration<String> e = context.getInitParameterNames();
        String str = "";
        while (e.hasMoreElements()) {
            str = e.nextElement();
            out.print("<br> " + context.getInitParameter(str));
        }
    }

}

檔:web.xml -

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xmlns="http://xmlns.jcp.org/xml/ns/javaee"
    xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd"
    id="WebApp_ID" version="3.1">
    <display-name>ServletContext</display-name>
    <welcome-file-list>
        <welcome-file>index.html</welcome-file>
    </welcome-file-list>
    <servlet>
        <servlet-name>ContextServ</servlet-name>
        <servlet-class>com.zaixian.ContextServlet</servlet-class>
    </servlet>
    <context-param>
        <param-name>dname</param-name>
        <param-value>com.mysql.jdbc.Driver</param-value>
    </context-param>
    <servlet-mapping>
        <servlet-name>ContextServ</servlet-name>
        <url-pattern>/context</url-pattern>
    </servlet-mapping>

    <servlet>
        <servlet-name>ContextServAll</servlet-name>
        <servlet-class>com.zaixian.ContextServletAll</servlet-class>
    </servlet>
    <context-param>
        <param-name>dname</param-name>
        <param-value>com.mysql.jdbc.Driver</param-value>
    </context-param>
    <context-param>
        <param-name>username</param-name>
        <param-value>root</param-value>
    </context-param>

    <context-param>
        <param-name>password</param-name>
        <param-value>mypasswd</param-value>
    </context-param>
    <servlet-mapping>

        <servlet-name>ContextServAll</servlet-name>
        <url-pattern>/contextall</url-pattern>
    </servlet-mapping>
</web-app>

在編寫完成上述代碼後,部署這個Web應用,打開流覽器訪問URL: http://localhost:8080/ServletContext/contextall ,如果程式沒有錯誤,應該會看到以下結果 -


上一篇: Servlet ServletConfig配置資訊 下一篇: Servlet屬性設置