網頁

2017/8/16

ServletConfig簡介

Web容器(web container)在啟動時,會先讀取DD文件(即web.xml),然後幫每一個Servlet建立一個ServletConfig的實例,接著根據DD文件的設定建立一些name/value參數,然後Web容器將參數交給ServletConfig物件,最後產生Servlet的實例時會呼叫Servlet的init(ServletConfig config)方法把ServletConfig物件傳入Servlet

因此在Servlet程式中,我們可以利用ServletConfig介面提供的方法如getInitParameter(String name)方法取得Servlet的初始參數。


以下是ServletConfig的簡單範例

在Eclipse中建立一個簡單的動態web應用程式(Dynamic Web Project),接著建立一個Servlet類別MyServlet及應用程式的首頁index.jsp

MyServlet

package idv.matt.servlet;

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

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

public class MyServlet extends HttpServlet {
    private static final long serialVersionUID = 1L;
  
    protected void doGet(HttpServletRequest request, HttpServletResponse response) t
            hrows ServletException, IOException {
      
        Enumeration<String> e = getInitParameterNames();
        while(e.hasMoreElements()){
            String paramName = e.nextElement();
            String paramValue = getInitParameter(paramName);
            
            System.out.println("init-param name: " + paramName);
            System.out.println("init-param value: " + paramValue);
          
        }
    }

}

注意Eclipse在幫我們產生Servlet時會自動掛上@WebServlet的annotation,但為方便說明所以這邊還是用web.xml的設定來進行Servlet的mapping設定。

HttpServlet類別實作了ServletServletConfig介面,所以在MyServlet中可直接呼叫getInitParameterNames()方法來取得Servlet的初始參數名稱,或呼叫getInitParameter()根據初始參數名稱來取得初始參數的值。

index.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
</head>
<body>
 <a href="MyServlet.do">MyServlet</a>
</body>
</html>

index.jsp為應用程式啟動時的首頁,標籤<a href="MyServlet.do">在點選時將request導向MyServlet

web.xml<web-app>的標籤中加入以下設定。

<servlet>
  <servlet-name>MyServlet</servlet-name>
  <servlet-class>idv.matt.servlet.MyServlet</servlet-class>
  <init-param>
    <param-name>param_001</param-name>
    <param-value>helloworld</param-value>
  </init-param>
  <init-param>
    <param-name>param_002</param-name>
    <param-value>dog</param-value>
  </init-param>
</servlet>
<servlet-mapping>
  <servlet-name>MyServlet</servlet-name>
  <url-pattern>*.do</url-pattern>
</servlet-mapping>

Servlet的名稱為MyServlet

<url-mapping>的設定代表任何以.do為結尾的request uri會交由MyServlet來處理。對照index.jsp<a>href屬性的值結尾為".do",又.do之前為MyServlet,所以此連接發出的request會交由MyServlet處理。

<init-param>可設定Servlet的初始參數,必須撰寫在<servlet>標籤內,其中還要設定兩個屬性<param-name><param-value>

<param-name>為Servlet初始參數的名稱,<param-value>為Servlet初始參數的值,這個name/value的組合會交給ServletConfig,然後Servlet初始化時,Web容器會呼叫Servletinit()方法將帶有初始參數的ServletConfig物件傳入Servlet。

一個<init-param>代表一個初始參數,也就是說其標籤內僅能有一對<param-name><param-value>的設定。

完成以上設定後,啟動Tomcat。

點選畫面中的連結來發出request並導向MyServlet並執行其doGet()方法。

根據MyServlet.doGet()的內容,會在console印出下面結果,由此可觀察到印出的結果即為web.xml<init-param>的設定值。

init-param name: param_001
init-param value: helloworld
init-param name: param_002
init-param value: dog

因為在MyServlet.doGet()中沒有寫出任何Response,所以瀏覽器的畫面為空白。


ServletConfig的用途為Servlet在一開始就有些參數可用,並可根據初始參數來執行特定的行為時。

ServletConfigServletContext的差別是,ServletConfig的參數值僅給該Servlet使用,而ServletContext的參數範圍是整個應用程式,即任何Servlet皆可取用。


沒有留言:

張貼留言