常用的servlet包名,以及作用(servlet執行緒問題)
使用 Java 技術開發 WEB 應用程式 , 深入瞭解 Servlet 的機制對應用的開發將有重要的推動作用 . 而想深入瞭解 Servlet 的機制就不得不瞭解 javax.servlet 包 .
javax.servlet 包中包含了 7 個介面 ,3 個類和 2 個異常類 , 它們分別是 :
介面 :RequestDispatcher,Servlet,ServletConfig,ServletContext,ServletRequest,ServletResponse 和 SingleThreadModel
類 :GenericServlet,ServletInputStream 和 ServletOutputStream
異常類 :ServletException 和 UnavailableException
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 在同一時刻只能服務一個使用者請求 , 後至的使用者請求必須在佇列中等待