来源:http://blog.163.com/[email protected]/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在同一时刻只能服务一个用户请求,后至的用户请求必须在队列中等待.