Servlet 之 javax.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 在同一時刻只能服務一個用戶請求 , 后至的用戶請求必須在隊列中等待


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM