Servlet複習
一、ServletConfig
ServletConfig對象可以用來封裝Servlet的初始化參數。在Web容器建立Servlet對象時,會将Servlet的初始化參數封裝到ServletConfig對象中,并在調用servlet的init方法時,将ServletConfig對象傳遞給servlet。
1.1在web.xml中< init-param >标簽下設定Servlet初始化參數:
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" id="WebApp_ID" version="2.5">
<servlet>
<servlet-name>servletConfigDemo1</servlet-name>
<servlet-class>servletReviewDemo1.servletConfigDemo1</servlet-class>
<!-- 在xml中設定初始化參數 -->
<init-param>
<param-name>name</param-name>
<param-value>clam</param-value>
</init-param>
<init-param>
<param-name>password</param-name>
<param-value>123</param-value>
</init-param>
<init-param>
<param-name>charset</param-name>
<param-value>UTF-8</param-value>
</init-param>
</servlet>
<servlet-mapping>
<servlet-name>servletConfigDemo1</servlet-name>
<url-pattern>/demo1</url-pattern>
</servlet-mapping>
</web-app>
1.2在Servlet中接收ServletConfig對象:
package servletReviewDemo1;
import java.io.IOException;
import java.io.PrintWriter;
import java.util.Enumeration;
import javax.servlet.ServletConfig;
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配置了初始化參數後,web容器在建立servlet執行個體對象時
* 會自動将這些初始化參數封裝到ServletConfig對象中
* 并在調用servlet的init方法時,将ServletConfig對象傳遞給servlet
* 進而,我們通過ServletConfig對象就可以得到目前servlet的初始化參數資訊
*@author clam
*
*/
public class servletConfigDemo1 extends HttpServlet {
/**
* 定義ServletConfig對象
* 用來接收初始化參數
*/
private ServletConfig config;
/**
* 接收初始化參數
*/
public void init(ServletConfig config){
this.config = config;
}
/**
* 檢驗初始化參數的接收
*/
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
String param1 = this.config.getInitParameter("name");
/*
* 輸出name的value值
*/
PrintWriter out = response.getWriter();
out.println(param1);
Enumeration<String> params = this.config.getInitParameterNames();
/*
* 輸出全部參數的name和value值
*/
while(params.hasMoreElements()){
String name = params.nextElement();
out.println("name = "+ name);
out.println("value = " + this.config.getInitParameter(name));
}
}
}
1.3網頁檢視輸出結果:
二、ServletContext
WEB容器在啟動時,會為每個WEB應用程式都建立一個ServletContext對象,它代表目前的WEB程式,稱context域。
一個WEB應用程式中的Servlet共用一個context域,是以可以用context域在不同的Servlet中共享資料。
ServletConfig中維護了ServletContext對象的引用,可以通過ServletConfig的getServletContext()方法獲得context對象的引用,也可以直接使用Servlet的方法getServletContext()獲得引用。
2.1使用context域共享資料
在demo1中将資料存入context域中,在demo2中進行通路:
demo1中的代碼:
package servletReviewDemo1;
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;
/**
* 在Demo1中建立資料
* 使用ServletContext在Demo2中通路該資料
*@author clam
*
*/
public class servletContextDemo1 extends HttpServlet {
/*
* data是在Demo2中将要通路的資料
*/
private String data = "This is clam";
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
/*
* 獲得ServletContext對象
* 使用ServletConfig中的getServletContext()方法
*/
ServletContext context = this.getServletConfig().getServletContext();
/*
* 将data放入context域中
*/
context.setAttribute("data", data);
}
}
demo2中的代碼:
package servletReviewDemo1;
import java.io.IOException;
import java.io.PrintWriter;
import javax.servlet.ServletContext;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
/**
* 在Demo2中通路data資料
*@author clam
*
*/
public class servletContextDemo2 extends HttpServlet {
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
/*
* 擷取ServletContext對象
* 使用Servlet中的getServletContext()方法
*/
ServletContext context = this.getServletContext();
/*
* 擷取data元素
*/
String data = (String) context.getAttribute("data");
response.getWriter().println(data);
}
}
2.2擷取WEB應用的初始化參數
使用< context-param >标簽配置WEB的初始化參數(< context-param >和< init-param >的差別):
<context-param>
<param-name>url</param-name>
<param-value>jdbc:mysql://localhost:3306/test</param-value>
</context-param>
在demo3中擷取初始化參數:
package servletReviewDemo1;
import java.io.IOException;
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;
/**
* 使用ServletContext擷取項目初始化參數
*@author clam
*
*/
public class servletContextDemo3 extends HttpServlet {
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
/*
* 擷取context對象
*/
ServletContext context = this.getServletContext();
/*
* 擷取初始化參數
*/
String value = (String) context.getInitParameter("url");
response.getWriter().println("name = url");
response.getWriter().println("value = " + value);
}
}
2.3使用ServletContext實作請求轉發:
使用ServletContext将demo4的請求轉發至demo5
demo4中代碼:
package servletReviewDemo1;
import java.io.IOException;
import javax.servlet.RequestDispatcher;
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;
/**
* 使用ServletContext實作請求轉發
*@author clam
*
*/
public class servletContextDemo4 extends HttpServlet {
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
response.getWriter().println("This is demo4");
ServletContext context = this.getServletContext();
RequestDispatcher dispatcher = context.getRequestDispatcher("/contextdemo5");//擷取請求轉發對象
dispatcher.forward(request, response);//請求轉發
}
}
demo5中代碼:
package servletReviewDemo1;
import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
public class servletContextDemo5 extends HttpServlet {
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
response.getWriter().println("This is demo5");
}
}
使用浏覽器通路demo4時的效果:
2.4使用ServletContext通路檔案資源
檔案目錄資訊:
檔案中的内容:
使用demo6通路檔案内容:
package servletReviewDemo1;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.text.MessageFormat;
import java.util.Properties;
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;
/**
* 使用ServletContext讀取檔案資源
*@author clam
*
*/
public class servletContextDemo6 extends HttpServlet {
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
String path = this.getServletContext().getRealPath("/WEB-INF/classes/c3p0.properties");
InputStream in = new FileInputStream(path);
Properties prop = new Properties();
prop.load(in);
String driver = prop.getProperty("c3p0.driverClass");
String url = prop.getProperty("c3p0.jdbcUrl");
String user = prop.getProperty("c3p0.user");
String password = prop.getProperty("c3p0.password");
response.getWriter().println(
MessageFormat.format(
"driver={0},url={1},user={2},password={3}",
driver,url, user, password));
}
}
浏覽器通路demo6的效果:
如有不足歡迎指出!