1. 程式人生 > >Java for Web學習筆記(七):Servlet(5)初始化引數

Java for Web學習筆記(七):Servlet(5)初始化引數

Context Init引數

在web.xml中可以基於整個上下文進行設定,在web app內各個Servlet都可以獲取。

 <context-param>
     <param-name>settingOne</param-name>
     <param-value>foo</param-value>
 </context-param>
 <context-param>
     <param-name>settingTwo</param-name>
     <param-value>bar</param-value>
 </context-param>

我們可以在context中獲取這些數值。例子如下:

@WebServlet(
		name = "ContextparamTestServlet",
		urlPatterns = {"/ContextParamTest"}
		)
public class ContextparamTestServlet extends HttpServlet {
	private static final long serialVersionUID = 1L;
       
	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		/* 應養成設定Content-Type這個Header的習慣 ,本例設定為Content-Type:“text/plain;charset=UTF-8”*/
		response.setContentType("text/plain");
		response.setCharacterEncoding("UTF-8");
		
		ServletContext context = getServletContext(); //獲取上下文
		response.getWriter().append("settingOne = ").append(context.getInitParameter("settingOne"))
			.append("\nsettingTwo = ").append(context.getInitParameter("settingTwo"));
	}
}

Servlet Init引數

使用web.xml

基於不要同時使用web.xml和程式碼中的@WebServlet的原則,我們在程式碼中刪除或者註釋掉@WebServlet。在web.xml中加入以下定義:

<servlet>
    <servlet-name>ServletParamTestServlet</servlet-name>
    <servlet-class>cn.wei.flowingflying.chapter03.ServletParamTestServlet</servlet-class>
    <init-param>
        <param-name>databaseName</param-name>
        <param-value>mydabase</param-value>
    </init-param>
    <init-param>
        <param-name>databaseIp</param-name>
        <param-value>192.168.1.101</param-value>
    </init-param>
</servlet>
<servlet-mapping>
    <servlet-name>ServletParamTestServlet</servlet-name>
    <url-pattern>/servletInitTest</url-pattern>
 </servlet-mapping>

程式碼如下:

public class ServletParamTestServlet extends HttpServlet {
	private static final long serialVersionUID = 1L;
       
	protected void doGet(HttpServletRequest request, HttpServletResponse response) 
throws ServletException, IOException {	
		response.setContentType("text/plain");
		response.setCharacterEncoding("UTF-8");
		
		ServletConfig c = this.getServletConfig();
		PrintWriter writer = response.getWriter();
		writer.append("databaseName = ").append(c.getInitParameter("databaseName"))
			.append("\ndatabaseIp = ").append(c.getInitParameter("databaseIp"));
	}
}

使用@WebServlet

使用@WebServlet的例子如下:

@WebServlet(
		name = "servletParameTest2Servlet",
		urlPatterns = {"/servletParameTest2"},
		initParams = {
			@WebInitParam(name = "databaseName", value = "TestDatabase"),
			@WebInitParam(name = "databaseIp", value = "181.0.0.100")
		})

程式碼內容同上一個例子,執行結果如下:

討論:使用哪種方式

如果我們需要對Servlet的初始引數進行設定,一般使用web.xml。這些配置可以根據部署情況變化而進行修改,無需開發人員重新進行編譯。當然,有一些引數可能是固定,那麼這種情況,我們可以將此放置在一個類中。

使用@Config的方式(在javax.servlet.annotation中定義),可以簡化web.xml內容,一般推薦使用,但是這種方式不適用於:

1、  為同一個servlet建立多個servlet例項;

2、 無需重新編譯,修改初始化引數(通常和具體的配置有關)

3、  超過一個Filter。對於Filter,提供了@WebFilter的方式,如果有多個Filter,使用@Config方式無法設定Filter的順序。