ServletContext
的對(duì)象由Web容器在部署項(xiàng)目時(shí)創(chuàng)建。 該對(duì)象可用于從web.xml
文件獲取配置信息。 每個(gè)Web應(yīng)用程序只有一個(gè)ServletContext
對(duì)象。
如果有信息要共享給多個(gè)servlet使用,最好在web.xml
文件中使用<context-param>
元素提供它。
如果有任何信息要共享給所有的servlet使用,并且要讓它容易維護(hù),最好的辦法就是在web.xml
文件中提供這些信息,所以如果信息要更改直接在web.xml
中修改,而不需要修改servlet
代碼。
ServletContext接口的使用
有很多ServletContext對(duì)象可以使用。 其中一些如下:
web.xml
文件獲取配置信息。web.xml
文件中屬性。參考以下示意圖 -
常用的ServletContext接口方法
給出了一些常用的ServletContext
接口方法。
序號(hào) | 方法 | 描述 |
---|---|---|
1 | public String getInitParameter(String name) |
返回指定參數(shù)名稱的參數(shù)值。 |
2 | public Enumeration getInitParameterNames() |
返回上下文的初始化參數(shù)的名稱。 |
3 | public void setAttribute(String name,Object object) |
在應(yīng)用程序范圍內(nèi)設(shè)置給定的對(duì)象。 |
4 | public Object getAttribute(String name) |
返回指定名稱的屬性。 |
5 | public Enumeration getInitParameterNames() |
返回上下文的初始化參數(shù)的名稱,作為String 對(duì)象的枚舉。 |
6 | public void removeAttribute(String name) |
從servlet上下文中刪除給定名稱的屬性。 |
如何獲取ServletContext接口的對(duì)象?
ServletConfig
接口的getServletContext()
方法返回ServletContext
對(duì)象。GenericServlet
類的getServletContext()
方法返回ServletContext
對(duì)象。getServletContext()方法的語法
public ServletContext getServletContext()
getServletContext()方法的示例
//We can get the ServletContext object from ServletConfig object
ServletContext application=getServletConfig().getServletContext();
//Another convenient way to get the ServletContext object
ServletContext application=getServletContext();
在Context范圍內(nèi)提供初始化參數(shù)的語法
Web應(yīng)用程序的context-param
元素的子元素用于定義應(yīng)用程序范圍中的初始化參數(shù)。 參數(shù)名稱和參數(shù)值是context-param
的子元素。param-name
元素定義參數(shù)名稱,param-value
定義其值。參考以下配置代碼片段 -
<web-app>
......
<context-param>
<param-name>parameter_name</param-name>
<param-value>parameter_value</param-value>
</context-param>
......
</web-app>
這個(gè)例子中,從web.xml
文件獲取初始化參數(shù)并打印初始化參數(shù)的值。請(qǐng)注意,ServletContext
的對(duì)象表示應(yīng)用程序范圍。所以如果從web.xml
文件中更改參數(shù)的值,所有的servlet
類都將獲得更改的值。所以不需要修改每個(gè)servlet中的值。最好通過web.xml
文件中的context-param
元素為多個(gè)servlet
提供公共信息。下面來看一個(gè)簡(jiǎn)單的例子:
打開Eclipse,創(chuàng)建一個(gè)動(dòng)態(tài)Web項(xiàng)目,其項(xiàng)目結(jié)構(gòu)如下所示 -
以下是幾個(gè)主要的代碼文件 -
文件:ContextServlet.java -
package com.yiibai;
import java.io.IOException;
import java.io.PrintWriter;
import javax.servlet.ServletContext;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
/**
* Servlet implementation class ContextServlet
*/
public class ContextServlet extends HttpServlet {
private static final long serialVersionUID = 1L;
/**
* @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse
* response)
*/
protected void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
// TODO Auto-generated method stub
response.setContentType("text/html");
PrintWriter pw = response.getWriter();
// creating ServletContext object
ServletContext context = getServletContext();
// Getting the value of the initialization parameter and printing it
String driverName = context.getInitParameter("dname");
pw.println("driver name is = <b>'" + driverName+"'</b>");
pw.close();
}
}
文件:web.xml -
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns="http://xmlns.jcp.org/xml/ns/javaee"
xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd"
id="WebApp_ID" version="3.1">
<display-name>ServletContext</display-name>
<welcome-file-list>
<welcome-file>index.html</welcome-file>
</welcome-file-list>
<servlet>
<servlet-name>ContextServ</servlet-name>
<servlet-class>com.yiibai.ContextServlet</servlet-class>
</servlet>
<context-param>
<param-name>dname</param-name>
<param-value>com.mysql.jdbc.Driver</param-value>
</context-param>
<servlet-mapping>
<servlet-name>ContextServ</servlet-name>
<url-pattern>/context</url-pattern>
</servlet-mapping>
</web-app>
在編寫完成上述代碼后,部署這個(gè)Web應(yīng)用,打開瀏覽器訪問URL: http://localhost:8080/ServletContext/context ,如果程序沒有錯(cuò)誤,應(yīng)該會(huì)看到以下結(jié)果 -
在這個(gè)例子中,我們將從web.xml
文件中獲取所有初始化參數(shù)。要獲取所有參數(shù),需要在servlet類中使用getInitParameterNames()
方法。
在上面項(xiàng)目中,新建一個(gè)名稱為:ContextServletAll.java 的Servlet,其代碼如下 -
package com.yiibai;
import java.io.IOException;
import java.io.PrintWriter;
import java.util.Enumeration;
import javax.servlet.ServletContext;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
/**
* Servlet implementation class ContextServletAll
*/
public class ContextServletAll extends HttpServlet {
private static final long serialVersionUID = 1L;
/**
* @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse
* response)
*/
protected void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
// TODO Auto-generated method stub
response.setContentType("text/html");
PrintWriter out = response.getWriter();
ServletContext context = getServletContext();
Enumeration<String> e = context.getInitParameterNames();
String str = "";
while (e.hasMoreElements()) {
str = e.nextElement();
out.print("<br> " + context.getInitParameter(str));
}
}
}
文件:web.xml -
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns="http://xmlns.jcp.org/xml/ns/javaee"
xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd"
id="WebApp_ID" version="3.1">
<display-name>ServletContext</display-name>
<welcome-file-list>
<welcome-file>index.html</welcome-file>
</welcome-file-list>
<servlet>
<servlet-name>ContextServ</servlet-name>
<servlet-class>com.yiibai.ContextServlet</servlet-class>
</servlet>
<context-param>
<param-name>dname</param-name>
<param-value>com.mysql.jdbc.Driver</param-value>
</context-param>
<servlet-mapping>
<servlet-name>ContextServ</servlet-name>
<url-pattern>/context</url-pattern>
</servlet-mapping>
<servlet>
<servlet-name>ContextServAll</servlet-name>
<servlet-class>com.yiibai.ContextServletAll</servlet-class>
</servlet>
<context-param>
<param-name>dname</param-name>
<param-value>com.mysql.jdbc.Driver</param-value>
</context-param>
<context-param>
<param-name>username</param-name>
<param-value>root</param-value>
</context-param>
<context-param>
<param-name>password</param-name>
<param-value>mypasswd</param-value>
</context-param>
<servlet-mapping>
<servlet-name>ContextServAll</servlet-name>
<url-pattern>/contextall</url-pattern>
</servlet-mapping>
</web-app>
在編寫完成上述代碼后,部署這個(gè)Web應(yīng)用,打開瀏覽器訪問URL: http://localhost:8080/ServletContext/contextall ,如果程序沒有錯(cuò)誤,應(yīng)該會(huì)看到以下結(jié)果 -