在上兩篇我們都介紹了了工具方面的使用,相信大家對於Servlet是很懷念的。在這一篇,我將會介紹如何在Servlet裡面設定預設參數。
(和我部落格同時發佈:http://www.dotblogs.com.tw/alantsai/archive/2013/10/01/122216.aspx)
預設參數的設定
預設參數的好處不需要多說,其中一個常見的用法是能夠讓我們在不改程式的情況下改變判斷條件。那這邊我們可以把它想像成為我們在Asp .net web.config裡面的 AppSettings一樣概念。
在Servlet裡面,預設參數有兩個Scope,一種是只有在此Servlet才能夠取得到的,和一種是所有的Servlet都可以取得到的。
題外話,我們還沒有真的介紹Servlet的Lifecycle,不過Servlet每一個是不受互相干擾的,所以Servlet 1 和 Servlet 2 之間是不知道對方的。
那這邊我們會先從Servlet層級的開始看起。
Servlet層級的預設參數設定和使用
在 <Servlet >下面的 <INIT-PARAM >
當我們要設定Servlet層級的預設參數,如果是定義在xml裡面,那麼就是:
<SERVLET>
<SERVLET-NAME>TestServlet</SERVLET-NAME>
<SERVLET-CLASS>com.sample.servlet.TestServlet</SERVLET-CLASS>
<INIT-PARAM>
<PARAM-NAME>name</PARAM-NAME>
<PARAM-VALUE>alan</PARAM-VALUE>
</INIT-PARAM>
</SERVLET>
上面表示在TestServlet裡面可以取得一個預設參數為name的,它的值是alan。如果有多個參數,則增加多筆<INIT-PARAM> 。
使用Annotation的方式設定
當然,我們也可以使用Annotation的方式設定。好處是一目了然,同時如果之後需要修改,Web.xml裡面會比Annotation的優先度高。
@WebServlet( urlPatterns = { "/TestServlet" },
initParams = {
@WebInitParam(name = "name", value = "alan")})
public class HelloWorld extends HttpServlet {
...
上面的Annoation和在xml定義的是同樣的意思。
在程式裡面呼叫
還記得我們Hello World的例子,假設,今天我要把它修改一下,變成當使用者輸入某個特定字串(這邊例子是"alan",從Init paaram裡面讀取出來),我們會顯示一個特殊的頁面給他。
首先第一件事情是我們需要一個特殊的頁面,那這邊我就建立了一個secret.html的文件,裡面什麽也沒有,只有一行字而已,讓我們好辨認的確顯示的是這個html。
題外話:建立html在WEB-INF的下面是因為在Tomcat裡面,WEB-INF裡面的東西是不能直接用http取得。一定要透過Servlet來轉。 詳細內容在之後介紹Tomcat的時候會在提到。
環境準備好了以後,我們這邊介紹如何取得Init-Param設定的值。
基本上有兩種方法:
1.使用 getInitParameter("name") - 這邊"name"是那個參數的key
2.使用getServletConfig().getInitParameter("name") - 先取得ServletConfig的物件,在從裡面取得。
那有的時候我們會希望取得所有的key然後用回圈去取的所有的值,這個時候getInitParameterNames()就能夠取得所有的Key。
因此,最後我們程式碼如下:
protected void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
....
String name = request.getParameter("name");
String secretName = getInitParameter("name");
if(name.equals(secretName))
{
request.getRequestDispatcher("/WEB-
INF/Secret.html").forward(request, response);
return;
}
response.setContentType("text/html");
PrintWriter out = response.getWriter();
out.println("");
out.println("<html >");
.....
這邊沒什麼特別的,不過注意到當我們名字和預設參數一樣的時候,我們呼叫了一個getRequestDispatcher()的方法,基本上它的意思是把內容轉向另外一個頁面去繼續做處理(這部份之後會介紹到)。
最後結果:
Context-Param - 所有Servlet都可以取得到的預設參數
基本上和Init-Param概念上是一樣的,差別在於,Init-param只能那個Servlet取得,而Context-Para是所有Servlet都能夠取得,可以把它想成private variable和Global Variable的差別。
在Web.xml設定
和Init-Param很像,不過這次一定要在web.xml裡面設定放在root(web-app)的下面:
<web-app .. id="WebApp_ID" version="3.0" >
...
<CONTEXT-PARAM>
<PARAM-NAME>message</PARAM-NAME>
<PARAM-VALUE>名稱對了才能看到隱藏資料</PARAM-VALUE>
</CONTEXT-PARAM> ...
同樣,如果有多筆,就增加多個context-param。
程式裡面呼叫
我們這一次的例子是,如果使用者沒有輸入到關鍵名字(例子是:"alan"),那麼頁面顯示和上次一樣,不過這一次增加一段提示字。而那個提示字我們將使用Context- Param的預設值。
那取得Context-Param就一個方法:
1.使用 getServletContext().getInitParameter("message") - 先取得ServletContext在取得預設參數
和Init-Param一樣,可以呼叫getServletContext().getInitParameterNames()取得所有的全域參數的name。
程式碼如下:
String secretName = getInitParameter("name");
if(name.equals(secretName))
{
request.getRequestDispatcher("/WEB-INF/Secret.html")
.forward(request, response);
return;
} ...
out.println("");
out.println("Hello: " + name);
out.println("<BR>"); out.println(getServletContext().getInitParameter("message"));
...
實際執行:
結語
預設參數的使用非常廣泛,因此希望透過這一篇的介紹大家能夠瞭解如何設定預設參數。