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類別實作了Servlet及ServletConfig介面,所以在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容器會呼叫Servlet的init()方法將帶有初始參數的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在一開始就有些參數可用,並可根據初始參數來執行特定的行為時。
ServletConfig和ServletContext的差別是,ServletConfig的參數值僅給該Servlet使用,而ServletContext的參數範圍是整個應用程式,即任何Servlet皆可取用。
沒有留言:
張貼留言