亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 學院 > 開發設計 > 正文

Servlet 容器的工作原理 ( 三 )

2019-11-18 12:32:18
字體:
來源:轉載
供稿:網友

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

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
亚洲国产欧美在线成人app| 欧美日韩免费一区| 最近2019中文字幕第三页视频| 国产激情综合五月久久| 欧美午夜www高清视频| 5278欧美一区二区三区| 久久九九有精品国产23| 黄色91在线观看| 国内外成人免费激情在线视频| 国产精品久久久久久久9999| 亚洲欧美国产精品va在线观看| 亚洲欧美日韩中文视频| 亚洲国产另类 国产精品国产免费| 亚洲性视频网址| 97视频在线免费观看| 亚洲人成网站免费播放| 精品免费在线观看| 97国产suv精品一区二区62| 久久久久久久久爱| 国产精品久久久久免费a∨| 亚洲欧美中文日韩v在线观看| 日韩高清有码在线| 欧美成人亚洲成人| 国产精品v日韩精品| 欧美日韩免费在线观看| 久久亚洲一区二区三区四区五区高| 久久亚洲私人国产精品va| 国产欧美精品一区二区| 热re99久久精品国产66热| 精品国产乱码久久久久久虫虫漫画| 欧美日韩在线一区| 欧美午夜精品久久久久久久| 91亚洲va在线va天堂va国| 国语自产精品视频在免费| 亚洲国产精品99久久| 欧美日韩视频免费播放| 日韩av在线免费观看一区| 动漫精品一区二区| 日韩小视频网址| 久久久中精品2020中文| 成人免费看吃奶视频网站| 日韩精品视频免费在线观看| 国产小视频91| 国产精品美乳在线观看| 国产精品美腿一区在线看| 色综合久久88色综合天天看泰| 亚洲欧美日韩中文视频| 日韩麻豆第一页| 日本aⅴ大伊香蕉精品视频| 国产精品一区=区| 国产女人精品视频| 欧美日韩精品在线| 欧美日韩国产一中文字不卡| 日韩欧美一区二区三区久久| 亚洲人成自拍网站| 狠狠躁夜夜躁人人爽天天天天97| 精品福利免费观看| 久久视频在线免费观看| 久久久久成人精品| 亚洲日本aⅴ片在线观看香蕉| 日韩欧美成人免费视频| 日韩av影视综合网| 国产综合在线看| 第一福利永久视频精品| 岛国av一区二区在线在线观看| 97人人爽人人喊人人模波多| 日韩av不卡在线| 亚洲国产成人在线视频| 亚洲激情免费观看| 欧美日韩国产在线播放| 日韩成人中文电影| 久久这里有精品| 欧美精品18videosex性欧美| 色综合久久88色综合天天看泰| 国产精品极品美女粉嫩高清在线| 尤物yw午夜国产精品视频明星| 日韩欧美国产成人| 国产精品一区二区女厕厕| 欧美国产亚洲视频| 97热精品视频官网| 成人免费午夜电影| 91精品免费看| 久久精品视频免费播放| 精品久久久久人成| 亚洲图片欧美午夜| 亚洲aⅴ日韩av电影在线观看| 97视频免费在线看| 91精品久久久久久久久久久久久| 欧美色欧美亚洲高清在线视频| 色综合久久悠悠| 欧美日韩国产成人在线观看| 日韩欧美在线免费| 九九久久精品一区| 久久九九有精品国产23| 日韩av电影国产| 91极品女神在线| 中文字幕日韩在线观看| 亚洲免费人成在线视频观看| 91牛牛免费视频| 亚洲第一偷拍网| 蜜月aⅴ免费一区二区三区| 亚洲欧美国产精品专区久久| 亚洲国产一区二区三区在线观看| 91精品国产沙发| 国产女同一区二区| 成人黄色av免费在线观看| 成人福利视频在线观看| 亚洲性无码av在线| 亲子乱一区二区三区电影| 久久精品国产精品亚洲| 欧美成在线视频| 亚洲成人三级在线| 午夜精品久久久久久久久久久久久| 91色p视频在线| 97成人精品区在线播放| 精品视频在线播放免| 日本高清+成人网在线观看| 日韩免费在线看| 中文字幕在线亚洲| 国产精品久久久久久久美男| 亚洲精品综合精品自拍| 日韩av在线精品| 欧美大肥婆大肥bbbbb| 国产精品69久久| 久久久亚洲福利精品午夜| 91夜夜未满十八勿入爽爽影院| 久国内精品在线| 亚洲美女av在线| 久久久久成人网| 久久九九亚洲综合| 日韩欧美有码在线| 色偷偷av亚洲男人的天堂| 欧美大片在线影院| 深夜福利日韩在线看| 不卡av日日日| 久久视频这里只有精品| 亚洲激情在线观看| 国产亚洲精品激情久久| 欧美性理论片在线观看片免费| 国自产精品手机在线观看视频| 91精品国产综合久久香蕉| 中文字幕欧美日韩在线| 国内精品久久久久久中文字幕| 日韩一区二区欧美| 最近2019年中文视频免费在线观看| 18一19gay欧美视频网站| 国产在线观看精品一区二区三区| 国产一区二区激情| 精品少妇一区二区30p| 成人夜晚看av| 国产91ⅴ在线精品免费观看| 国产精品久久激情| 日韩成人久久久| 国产一区二区三区精品久久久| 久久久久免费视频| 日韩有码视频在线| 久久免费视频在线观看| 色综合影院在线| 日韩欧美在线网址| 亚洲精品自拍第一页| 欧美在线影院在线视频| 欧美日韩福利在线观看| 日韩在线观看免费av| 国产精品久久久久国产a级|