javax.servlet包介绍

使用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在同一时刻只能服务一个用户请求,后至的用户请求必须在队列中等待.

猜你喜欢

转载自my.oschina.net/zjllovecode/blog/1620328