來源:http://blog.163.com/jianhuren2005@126/blog/static/17158171200782333849784/
使用Java技術開發WEB應用程序,深入了解Servlet的機制對應用的開發將有重要的推動作用.而想深入了解Servlet的機制就不得不了解javax.servlet包.
以Servlet2.3規范,我們介紹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在同一時刻只能服務一個用戶請求,后至的用戶請求必須在隊列中等待.
