一、ServletConfig講解
1.1、配置Servlet初始化參數
在Servlet的配置文件web.xml中,可以使用一個或多個<init-param>標籤爲servlet配置一些初始化參數。
<servlet>
<description>This is the description of my J2EE component</description>
<display-name>This is the display name of my J2EE component</display-name>
<servlet-name>demoServlet</servlet-name>
<servlet-class>demo.cha.servlet.demoServlet</servlet-class>
<!--配置ServletConfigDemo1的初始化參數 -->
<init-param>
<param-name>name</param-name>
<param-value>cha</param-value>
</init-param>
<init-param>
<param-name>password</param-name>
<param-value>123456</param-value>
</init-param>
<init-param>
<param-name>charset</param-name>
<param-value>UTF-8</param-value>
</init-param>
</servlet>
1.2、通過ServletConfig獲取Servlet的初始化參數
當servlet配置了初始化參數後,web容器在創建servlet實例對象時,會自動將這些初始化參數封裝到ServletConfig對象中,並在調用servlet的init方法時,將ServletConfig對象傳遞給servlet。進而,我們通過ServletConfig對象就可以得到當前servlet的初始化參數信息。
public class demoServlet extends HttpServlet {
/**
* 定義ServletConfig對象來接收配置的初始化參數
*/
private ServletConfig config;
/**
* 當servlet配置了初始化參數後,web容器在創建servlet實例對象時,
* 會自動將這些初始化參數封裝到ServletConfig對象中,並在調用servlet的init方法時,
* 將ServletConfig對象傳遞給servlet。進而,程序員通過ServletConfig對象就可以
* 得到當前servlet的初始化參數信息。
*/
@Override
public void init(ServletConfig config) throws ServletException {
this.config = config;
}
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
//獲取在web.xml中配置的初始化參數
String paramVal = this.config.getInitParameter("name");//獲取指定的初始化參數
response.getWriter().print(paramVal);
response.getWriter().print("<hr/>");
//獲取所有的初始化參數
Enumeration<String> e = config.getInitParameterNames();
while(e.hasMoreElements()){
String name = e.nextElement();
String value = config.getInitParameter(name);
response.getWriter().print(name + "=" + value + "<br/>");
}
}
public void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
this.doGet(request, response);
}
}
測試下結果:
二、ServletContext對象
WEB容器在啓動時,它會爲每個WEB應用程序都創建一個對應的ServletContext對象,它代表當前web應用。
ServletConfig對象中維護了ServletContext對象的引用,開發人員在編寫servlet時,可以通過ServletConfig.getServletContext方法獲得ServletContext對象。
由於一個WEB應用中的所有Servlet共享同一個ServletContext對象,因此Servlet對象之間可以通過ServletContext對象來實現通訊。ServletContext對象通常也被稱之爲context域對象。
三、ServletContext的應用
3.1、多個Servlet通過ServletContext對象實現數據共享
範例:demoServlet1和demoServlet2通過ServletContext對象實現數據共享
public class demoServlet1 extends HttpServlet {
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
String data = "cha_199X";
/**
* ServletConfig對象中維護了ServletContext對象的引用,開發人員在編寫servlet時,
* 可以通過ServletConfig.getServletContext方法獲得ServletContext對象。
*/
ServletContext context = this.getServletConfig().getServletContext();//獲得ServletContext對象
context.setAttribute("data", data); //將data存儲到ServletContext對象中
}
public void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
doGet(request, response);
}
}
public class demoServlet2 extends HttpServlet {
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
ServletContext context = this.getServletContext();
String data = (String) context.getAttribute("data");//從ServletContext對象中取出數據
response.getWriter().print("data="+data);
}
public void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
doGet(request, response);
}
}
先運行demoServlet1,將數據data存儲到ServletContext對象中,然後運行demoServlet2就可以從ServletContext對象中取出數據了,這樣就實現了數據共享
如下圖所示:
3.2、獲取WEB應用的初始化參數
在web.xml文件中使用<context-param>標籤配置WEB應用的初始化參數,如下所示:
<?xml version="1.0" encoding="UTF-8"?>
<web-app version="3.0" xmlns="http://java.sun.com/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee
http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd">
<display-name></display-name>
<!-- 配置WEB應用的初始化參數 -->
<context-param>
<param-name>url</param-name>
<param-value>jdbc:mysql://localhost:3306/test</param-value>
</context-param>
<welcome-file-list>
<welcome-file>index.jsp</welcome-file>
</welcome-file-list>
</web-app>
獲取Web應用的初始化參數,代碼如下:public class demoServlet3 extends HttpServlet {
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
ServletContext context = this.getServletContext();
//獲取整個web站點的初始化參數
String contextInitParam = context.getInitParameter("url");
response.getWriter().print(contextInitParam);
}
public void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
doGet(request, response);
}
}
測試下結果:
3.3、用servletContext實現請求轉發
public class demoServlet4 extends HttpServlet {
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
String data = "<h1><font color='red'>cha_199X</font></h1>";
response.getOutputStream().write(data.getBytes());
ServletContext context = this.getServletContext();//獲取ServletContext對象
RequestDispatcher rd = context.getRequestDispatcher("/servlet/demoServlet5");//獲取請求轉發對象(RequestDispatcher)
rd.forward(request, response);//調用forward方法實現請求轉發
}
public void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
}
}
public class demoServlet5 extends HttpServlet {
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
response.getOutputStream().write("servletDemo5".getBytes());
}
public void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
this.doGet(request, response);
}
}
測試下結果:
訪問的是demoServlet4,瀏覽器顯示的卻是demoServlet5的內容,這就是使用ServletContext實現了請求轉發
3.4、利用ServletContext對象讀取資源文件
public class demoServlet6 extends HttpServlet {
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
/**
* response.setContentType("text/html;charset=UTF-8");目的是控制瀏覽器用UTF-8進行解碼;
* 這樣就不會出現中文亂碼了
*/
response.setHeader("content-type","text/html;charset=UTF-8");
readSrcDirPropCfgFile(response);//讀取src目錄下的properties配置文件
response.getWriter().println("<hr/>");
readWebRootDirPropCfgFile(response);//讀取WebRoot目錄下的properties配置文件
response.getWriter().println("<hr/>");
readPropCfgFile(response);//讀取src目錄下的db.config包中的db3.properties配置文件
response.getWriter().println("<hr/>");
readPropCfgFile2(response);//讀取src目錄下的gacl.servlet.study包中的db4.properties配置文件
}
/**
* 讀取src目錄下的demo.cha.servlet包中的db4.properties配置文件
* @param response
* @throws IOException
*/
private void readPropCfgFile2(HttpServletResponse response)
throws IOException {
InputStream in = this.getServletContext().getResourceAsStream("/WEB-INF/classes/demo/cha/servlet/db.properties");
Properties prop = new Properties();
prop.load(in);
String driver = prop.getProperty("driver");
String url = prop.getProperty("url");
String username = prop.getProperty("username");
String password = prop.getProperty("password");
response.getWriter().println("讀取src目錄下的demo.cha.servlet包中的db.properties配置文件:");
response.getWriter().println(
MessageFormat.format(
"driver={0},url={1},username={2},password={3}",
driver,url, username, password));
}
/**
* 讀取src目錄下的db.config包中的db.properties配置文件
* @param response
* @throws FileNotFoundException
* @throws IOException
*/
private void readPropCfgFile(HttpServletResponse response)
throws FileNotFoundException, IOException {
//通過ServletContext獲取web資源的絕對路徑
String path = this.getServletContext().getRealPath("/WEB-INF/classes/db/config/db.properties");
InputStream in = new FileInputStream(path);
Properties prop = new Properties();
prop.load(in);
String driver = prop.getProperty("driver");
String url = prop.getProperty("url");
String username = prop.getProperty("username");
String password = prop.getProperty("password");
response.getWriter().println("讀取src目錄下的db.config包中的db.properties配置文件:");
response.getWriter().println(
MessageFormat.format(
"driver={0},url={1},username={2},password={3}",
driver,url, username, password));
}
/**
* 通過ServletContext對象讀取WebRoot目錄下的properties配置文件
* @param response
* @throws IOException
*/
private void readWebRootDirPropCfgFile(HttpServletResponse response)
throws IOException {
/**
* 通過ServletContext對象讀取WebRoot目錄下的properties配置文件
* “/”代表的是項目根目錄
*/
InputStream in = this.getServletContext().getResourceAsStream("/db.properties");
Properties prop = new Properties();
prop.load(in);
String driver = prop.getProperty("driver");
String url = prop.getProperty("url");
String username = prop.getProperty("username");
String password = prop.getProperty("password");
response.getWriter().println("讀取WebRoot目錄下的db.properties配置文件:");
response.getWriter().print(
MessageFormat.format(
"driver={0},url={1},username={2},password={3}",
driver,url, username, password));
}
/**
* 通過ServletContext對象讀取src目錄下的properties配置文件
* @param response
* @throws IOException
*/
private void readSrcDirPropCfgFile(HttpServletResponse response) throws IOException {
/**
* 通過ServletContext對象讀取src目錄下的db1.properties配置文件
*/
InputStream in = this.getServletContext().getResourceAsStream("/WEB-INF/classes/db.properties");
Properties prop = new Properties();
prop.load(in);
String driver = prop.getProperty("driver");
String url = prop.getProperty("url");
String username = prop.getProperty("username");
String password = prop.getProperty("password");
response.getWriter().println("讀取src目錄下的db.properties配置文件:");
response.getWriter().println(
MessageFormat.format(
"driver={0},url={1},username={2},password={3}",
driver,url, username, password));
}
public void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
this.doGet(request, response);
}
}
測試下結果:
四、原博文地址:http://www.cnblogs.com/xdp-gacl/p/3763559.html