国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 學(xué)院 > 開發(fā)設(shè)計 > 正文

Servlet 容器的工作原理 ( 三 )

2019-11-18 12:32:18
字體:
供稿:網(wǎng)友

  ServletPRocessor1 類
    ServletProcessor1 類用來處理對 servlet 的 HTTP 請求。 它非常簡單,只包含了一個 process 方法。 而這個方法接受兩個參數(shù): 一個javax.servlet.ServletRequest 實例和一個 avax.servlet.ServletResponse實例。 process 方法也構(gòu)建了一個 java.net.URLClassLoader 對象并使用它裝載 servlet 類文件。 在從類裝載器獲得的 Class 對象上,process 方法創(chuàng)建一個 servlet 實例并調(diào)用它的 service 方法。
  
  process 方法
  
  Listing 2.4. ServletProcessor1 類中 process 方法
  
  public void process(Request request, Response response) {
    String uri      = request.getUri();
    String servletName  = uri.substring(uri.lastIndexOf("/") + 1);
    URLClassLoader loader = null;
  
    try {
      // create a URLClassLoader
      URLStreamHandler streamHandler = null;
  
      URL[] urls    = new URL[1];
      File classPath  = new File(Constants.WEB_ROOT);
      String repository = (new URL("file", null,
        classPath.getCanonicalPath() + File.separator)).toString() ;
      urls[0]      = new URL(null, repository, streamHandler);
      loader      = new URLClassLoader(urls);
    }
    catch (IOException e) {
      System.out.println(e.toString());
    }
  
    Class myClass = null;
  
    try {
      myClass = loader.loadClass(servletName);
    }
    catch (Exception e) {
      System.out.println(e.toString());
    }
  
    Servlet servlet = null;
    try {
      servlet = (Servlet) myClass.newInstance();
      servlet.service((ServletRequest) request, (ServletResponse) response);
    }
    catch (Exception e) {
      System.out.println(e.toString());
    }
    catch (Throwable e) {
      System.out.println(e.toString());
    }
  }
  
  process 方法接受兩個參數(shù):一個 ServletRequest實例和一個 ServletResponse 實例。 process方法通過調(diào)用 getRequestUri 方法從 ServletRequest獲取 URI。
  
  String uri = request.getUri();
  切記 URI 的格式:
  
  /servlet/servletName
  servletName 是 servlet 類的名稱。
  
  假如要裝載 servlet 類,則需要使用以下代碼從 URI 獲知 servlet 名稱:
  
  String servletName = uri.substring(uri.lastIndexOf("/") + 1);
  然后 process 方法裝載 servlet。 要做到這些,需要創(chuàng)建一個類裝載器,并告訴裝載器該類的位置, 該 servlet 容器可以指引類裝載器在 Constants.WEB_ROOT 指向的目錄中查找。 在工作目錄下,WEB_ROOT 指向 webroot/ 目錄。
  
  假如要裝載一個 servlet,則要使用 java.net.URLClassLoader 類,它是java.lang.ClassLoader 的間接子類。 一旦有了 URLClassLoader 類的實例,就可以使用 loadClass 方法來裝載一個 servlet 類。 實例化 URLClassLoader 是很簡單的。 該類有三個構(gòu)建器,最簡單的是:
  
  public URLClassLoader(URL[] urls);
  urls 是一組指向其位置 java.net.URL 對象, 當(dāng)裝載一個類時它會自動搜索其位置。 任一以 / 結(jié)尾的 URL 都被假定為一目錄, 否則,就假定其為 .jar 文件,在需要時可以下載并打開。
  
  在一個 servlet 容器內(nèi),類裝載器查找 servlet 類的位置稱為儲存庫 (repository)。
  
  在所舉的應(yīng)用程序中,類裝載器只可在當(dāng)前工作目錄下的 webroot/ 目錄查找,所以,首先得創(chuàng)建一組簡單的 URL。 URL 類提供了多個構(gòu)建器,因此有許多的方法來構(gòu)建一個 URL 對象。 在這個應(yīng)用程序內(nèi),使用了和 TOMCAT 內(nèi)另外一個類所使用的相同的構(gòu)建器。 該構(gòu)建器頭部 (signature) 如下:
  
  public URL(URL context, String spec, URLStreamHandler hander)
    throws MalformedURLException
  可以通過傳遞給第二個參數(shù)一個規(guī)范,傳遞給第一個和第三個參數(shù) null 值來使用這個構(gòu)建器, 但在些有另外一種可接受三個參數(shù)的構(gòu)建器:
  
  public URL(String protocol, String host, String file)
    throws MalformedURLException
  因此,假如只寫了以下代碼,編譯器將不知道是使用的哪個構(gòu)建器:
  
  new URL(null, aString, null);
  當(dāng)然也可以能過告訴編譯器第三個參數(shù)的類型來避開這個問題,如:
  
  URLStreamHandler streamHandler = null;
  new URL(null, aString, streamHandler);
  對于第二個參數(shù),可以傳遞包含儲存庫 (repository) 的 String 。 以下代碼可創(chuàng)建:
  
  String repository = (new URL("file", null,
    classPath.getCanonicalPath() + File.separator)).toString();
  結(jié)合起來,以下是構(gòu)建正確 URLClassLoader 實例的 process 方法的部分代碼:
  
  // create a URLClassLoader
  URLStreamHandler streamHandler = null;
  
  URL[] urls    = new URL[1];
  File classPath  = new File(Constants.WEB_ROOT);
  String repository = (new URL("file", null,
    classPath.getCanonicalPath() + File.separator)).toString() ;
  urls[0]      = new URL(null, repository, streamHandler);
  loader      = new URLClassLoader(urls);
  
  創(chuàng)建儲存庫 (repository)的代碼摘自org.apache.catalina.startup.ClassLoaderFactory內(nèi)的createClassLoader 方法,而創(chuàng)建 URL 的代碼摘自org.apache.catalina.loader.StandardClassLoader 類內(nèi)的 addRepository 方法。 但在此階段您還沒有必要去關(guān)心這些類。
  
  有了類裝載器,您可以使用 loadClass 方法裝載 servlet 類:
  
  Class myClass = null;
  try {
    myClass = loader.loadClass(servletName);
  }
  catch (ClassNotFoundException e) {
    System.out.println(e.toString());
  }
  然后,process方法創(chuàng)建已裝載的 servlet類的實例,傳遞給 javax.servlet.Servlet ,并激活 servlet 的 service 方法:
  
  Servlet servlet = null;
  try {
    servlet = (Servlet) myClass.newInstance();
    servlet.service((ServletRequest) request, (ServletResponse) response);
  }
  catch (Exception e) {
    System.out.println(e.toString());
  }
  catch (Throwable e) {
    System.out.println(e.toString());
  }
  
  編譯并運行該應(yīng)用程序
  假如要編譯該應(yīng)用程序,在工作目錄下鍵入以下命令:
  
  javac -d . -classpath ./lib/servlet.jar src/ex02/pyrmont/*.java
  假如要在 windows 下運行該應(yīng)用程序,在工作目錄下鍵入以下命令:
  
  java -classpath ./lib/servlet.jar;./ ex02.pyrmont.HttpServer1
  在 linux 環(huán)境下,使用冒號來隔開類庫:
  
  java -classpath ./lib/servlet.jar:./ ex02.pyrmont.HttpServer1
  假如要測試該應(yīng)用程序,請在 URL 或瀏覽器地址欄鍵入以下命令:
  
  http://localhost:8080/index.Html
  或者是:
  
  http://localhost:8080/servlet/PrimitiveServlet
  您將會在瀏覽器中看到以下文本:
  
  Hello. Roses are red.
  注重:您不能看到第二行字符 (Violets are blue),因為只有第一行字符送入到瀏覽器。[i] Tomcat 運行工作原理[/i] 隨后的章節(jié)會告訴您怎樣來解決這個問題。

發(fā)表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發(fā)表
主站蜘蛛池模板: 武川县| 绥中县| 无锡市| 蓬莱市| 新昌县| 文化| 台山市| 乌海市| 永吉县| 临安市| 光山县| 禹城市| 许昌县| 伊川县| 天台县| 健康| 镇宁| 通江县| 剑河县| 宁都县| 涿鹿县| 威信县| 梁平县| 青铜峡市| 绥滨县| 黄冈市| 永定县| 高雄县| 颍上县| 霍山县| 方山县| 新民市| 永新县| 深水埗区| 海原县| 宜城市| 泸西县| 双鸭山市| 永州市| 镇雄县| 客服|