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皆可取用。
沒有留言:
張貼留言