使用 Java 技術開發 WEB 應用程序 , 深刻了解 Servlet 的機制對應用的開發將有重要的推進做用 . 而想深刻了解 Servlet 的機制就不得不瞭解 javax.servlet 包 .java
javax.servlet 包中包含了 7 個接口 ,3 個類和 2 個異常類 , 它們分別是 :web
接口 :RequestDispatcher,Servlet,ServletConfig,ServletContext,ServletRequest,ServletResponse 和 SingleThreadModelspa
類 :GenericServlet,ServletInputStream 和 ServletOutputStreamcode
異常類 :ServletException 和 UnavailableExceptionxml
Servlet 的生命週期對象
在 Servlet 的接口中定義了一個 Servlet 的生命週期方法 , 分別是 Init,Service 和 Destroy
演示了 Servlet 生命週期方法的簡單 Servlet:接口
import javax.servlet.*; import java.io.IOException; public class PrimitiveServlet implements Servlet { public void init(ServletConfig config) throws ServletException { System.out.println("init"); } public void service(ServletRequest request, ServletResponse response) throws ServletException, IOException { System.out.println("service"); } public void destroy() { System.out.println("destroy"); } public String getServletInfo() { return null; } public ServletConfig getServletConfig() { return null; } }
在 Servlet 中如何獲取 ServletConfig 對象 ?生命週期
在 Servlet 的 Init 方法中 ,Servlet Container 將會傳入一個 ServletConfig 對象 , 開發人員能夠經過這個對象獲取在 web.xml 文件中定義的 Servlet 初始化參數 .隊列
下面是一個獲取 Servlet 初始參數的示例 :資源
import javax.servlet.*; import java.util.Enumeration; import java.io.IOException; public class ConfigDemoServlet implements Servlet { public void init(ServletConfig config) throws ServletException { Enumeration parameters = config.getInitParameterNames(); while (parameters.hasMoreElements()) { String parameter = (String) parameters.nextElement(); System.out.println("Parameter name : " + parameter); System.out.println("Parameter value : " + config.getInitParameter(parameter)); } } public void destroy() { } public void service(ServletRequest request, ServletResponse response) throws ServletException, IOException { } public String getServletInfo() { return null; } public ServletConfig getServletConfig() { return null; } }
如何獲取 ServletContext 對象 ?
能夠經過 ServletConfig 對象的 getServletContext 方法獲取 ServletContext 對象
import javax.servlet.*; import java.util.Enumeration; import java.io.IOException; public class ContextDemoServlet implements Servlet { ServletConfig servletConfig; public void init(ServletConfig config) throws ServletException { servletConfig = config; } public void destroy() { } public void service(ServletRequest request, ServletResponse response) throws ServletException, IOException { ServletContext servletContext = servletConfig.getServletContext(); Enumeration attributes = servletContext.getAttributeNames(); while (attributes.hasMoreElements()) { String attribute = (String) attributes.nextElement(); System.out.println("Attribute name : " + attribute); System.out.println("Attribute value : " + servletContext.getAttribute(attribute)); } System.out.println("Major version : " + servletContext.getMajorVersion()); System.out.println("Minor version : " + servletContext.getMinorVersion()); System.out.println("Server info : " + servletContext.getServerInfo()); } public String getServletInfo() { return null; } public ServletConfig getServletConfig() { return null; } }
如何在 Servlet 之間共享信息 ?
咱們能夠經過 ServletContext 來維護在不一樣 Servlet 之間共享的信息 .
如何解決 Servlet 的多 Thread 問題 ?
若是 Servlet 須要讀寫外部資源 , 咱們須要考慮 Thread 的問題 , 咱們能夠使用聲明性接口 SingleThreadModel 來避免多 Thread 之間的資源衝突問題 . 可是須要注意的是 , 若是 Servlet 僅僅只是讀外部資源的話 , 咱們一般不該該實現這個接口 . 若是實現這個接口 ,Servlet 在同一時刻只能服務一個用戶請求 , 後至的用戶請求必須在隊列中等待
HttpServlet容器響應Web客戶請求流程以下:
1)Web客戶向Servlet容器發出Http請求;
2)Servlet容器解析Web客戶的Http請求;
3)Servlet容器建立一個HttpRequest對象,在這個對象中封裝Http請求信息;
4)Servlet容器建立一個HttpResponse對象;
5)Servlet容器調用HttpServlet的service方法,這個方法中會根據request的Method來判斷具體是執行doGet仍是doPost,把HttpRequest和HttpResponse對象做爲service方法的參數傳給HttpServlet對象;
6)HttpServlet調用HttpRequest的有關方法,獲取HTTP請求信息;
7)HttpServlet調用HttpResponse的有關方法,生成響應數據;
8)Servlet容器把HttpServlet的響應結果傳給Web客戶。