亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關于我們
? 蟲蟲下載站

?? 將 microsoft 的 internet information server 用作 java servlet 引擎 一 (給學過asp的朋友).txt

?? Java技術收集很多各種技術總結
?? TXT
字號:
作者:sonymusic
email: sonymusic@china.com
日期:2000-12-6 23:50:12
將 Microsoft 的 Internet Information Server 用作 Java servlet 引擎
用 Microsoft 的 IIS 運行 Java servlet -- 而不犧牲可移植性

Thomas E. Davis 
Nutrio.com 首席技術官
2000 年 7 月

內容: 
 
 
 IIS 
 適配器設計模式 
 Servlet 
 ASP 
 Java SDK 
 請求適配器 
 會話適配器 
 響應適配器 
 結論 
 正式請求 
 參考資料 
 作者簡介 
 


您是陷在僅有 Microsoft 產品的商店中的 Java 狂熱分子嗎?僅使用 Microsoft 的 Internet Information Server 和純 Java,您就可以運行 Java servlet,而無須任何第三方產品的幫助。請不要馬上就放棄 Microsoft 產品 -- 不妨試試本文中說明的方法,并仍然保持為無專有權的可移植代碼。

您知不知道,無須第三方產品,就可以用 Microsoft 的 Internet Information Server (IIS) 運行 JavaServlet?您的全部所需僅僅是簡明的舊式 IIS 和純 Java。盡管您需要使用 Microsoft 的 Java SDK(原因我將在下面解釋),但盡可放心,您的代碼將不需要任何專用權擴展,同時又保持對其它 servlet 引擎的完全可移植性。

Microsoft 的 Internet Information Server 
但您為什么要做這樣的傻事,讓 Java servlet 運行在并非為它設計的環境中呢?首先,由于我們無法控制的情況,許多像我們這樣頑固的 Java 狂熱分子都陷在了僅有 Microsoft 產品的商店里。我們全都把 Linux 軟件盒子藏在桌子下面,運行 IBM 最新的 JDK 和 Apache 最新的 servlet 引擎,但是,要是老板不讓我們在這樣一個系統上部署一些產品,這時可就真的不好過了。您當然可以找到運行于 Microsoft 平臺上的商業性 servlet 引擎,但購買它們要花大把大把的錢。試一試向您的老板解釋:您需要幾千美金購買一種新的 Web 服務器,因為您想要廢棄操作系統附帶的那個免費產品(或者只將它用作簡單的傳遞代理,這正是許多產品目前的工作方式)。然后,等您的老板詛咒完畢,您就不妨問一問自己,您是不是有點太急于放棄 Microsoft 的產品了?Microsoft 和 Sun 都有他們的問題,但這并不能改變這樣一個事實:IIS 是一種值得尊敬的軟件。并且既然您知道它可以運行 Java servlet,它的吸引力也就更大了一點。

適配器設計模式 
將這兩種技術粘合在一起的魔法是適配器設計模式的一種簡單的應用程序。不妨引用一下一個不大出名的四人團伙(Erich Gamma、Richard Helm、Ralph Johnson 和 John Vlissides)所寫的書《Design Patterns: Elements of Reusable Object-Oriented Software》(參考資料),里面說:適配器模式的意圖就是將一個類的接口轉換為客戶機期望的另一種接口。但哪些類是您必須改編的呢?答案是 Java Servlet 用來與其環境交互的幾個核心類 -- 尤其是 Request、Response 和 Session 對象。幸運的是,您不必改編 Cookie 類 -- 這一轉換將由其它適配器內部處理。

IIS,或者更具體地說,它的 Active Server Page (ASP) 環境,包含了一組核心類,它們實際上反映了 Java Servlet 規范的類。事實上我應該說,servlet 反映了 ASP 的框架,因為 IIS 在 servlet 規范制定以前早就有了產品,但我不想在 Microsoft 與 Sun 之間的爭論中推波助瀾。

兩種框架中都存在 Request、Response、Session 和 Cookie 對象。唯一的問題是,這些對象的接口在兩種環境之間不兼容。這正是適配器設計模式起作用的地方。您必須改編(或包裝)對象的 IIS 版本,使它們的外觀和行為都類似于 servlet 版本。

一個快捷而不夠清晰的 servlet 概覽 
按最低要求,servlet 只須實現單個方法: public void doGet( HttpServletRequest request, HttpServletResponse response );

 


從技術上講,如果 servlet 希望處理的客戶機請求,使用的是 HTTP 的 POST 命令而不是 GET 命令,則 servlet 還必須實現 doPost 方法。但為了使本文保持簡潔,您可以假定所有客戶機請求都屬于 GET 類型。

doGet 方法取得兩個對象:請求和響應。請求對象將客戶機發送給服務器的所有數據,以及有關客戶機本身的一些元信息,都封裝在一起。使用響應對象將數據發回客戶機。這是非常抽象的說明,但本文并不是 servlet 的引論,所以我不想涉及更多的細節。有關 servlet 的優秀初級讀本,我推薦 Jason Hunter,William Crawford 和 Paula Ferguson 合著的《Java Servlet Programming》 (O'Reilly & Associates)。

Active Server Page 
當您從 ASP 中調用 servlet 時,您正是在調用 doGet 方法,并傳入適當的請求和響應對象。從這時起,servlet 就具有了完全的控制權。ASP 腳本用作 servlet 的引導程序。但在您可以傳入請求和響應對象之前,您必須用相應的適配器類來包裝它們(稍后我對此將有詳細分析)。

我將從頭開始講下去。客戶機要請求的 URL 看起來與 http://localhost/servlet.asp 類似。.asp 擴展名意味著所請求的文檔是一個 Active Server Page 腳本。下面就是完整的 servlet.asp 腳本:

dim requestAdapter
set requestAdapter = getObject( "java:com.nutrio.asp.RequestAdapter" )

dim responseAdapter
set responseAdapter = getObject( "java:com.nutrio.asp.ResponseAdapter" )

dim servlet
set servlet = getObject( "java:com.nutrio.servlet.HelloWorldServlet" )

servlet.doGet requestAdapter, responseAdapter

 

分析上一段腳本,您將發現,它是從聲明一個稱為 requestAdapter 的變量入手的。dim 是 Visual Basic 中對變量進行聲明的命令。在 Visual Basic 中,變量沒有固定類型,各種變量實際上是由 Variant 對象進行包裝的,這可使變量以調用代碼所要求的任何一種類型(例如,數字、字符串,等等)出現。這樣做確實非常方便,但有可能使代碼容易混淆,而且也不安全。這正是為什么要發明“匈牙利表示法”(Hungarian Notation) 的原因(請參閱參考資料)。不過,這完全是另外一場爭論。

聲明變量以后,就應該使用 ASP 的 getObject 方法實例化您的第一個適配器類,并相應地為其賦值。getObject 方法是 IIS 版本 4 中新增的。它被稱為 moniker (一種 COM 對象,用于創建其它對象的實例,請參閱參考資料),但它使您能夠訪問 Java 對象,而沒有注冊任何組件對象模型(COM,請參閱參考資料)這類令人頭痛的事。然后,您依次聲明、實例化響應封裝并為其賦值,然后對 servlet 做同樣的事情。最后,您調用 servlet 的 doGet 方法,并傳入改編了的請求和響應對象。 

這個特定的腳本具有相當大的局限性,因為它只啟動一個特定的 servlet。您很可能希望將其擴展,以啟動一整套 servlet,這樣您就需要做幾處小小的修改。假定您的所有 servlet 都在同一個包內,您就可以將目標 servlet 的類名作為變量傳遞給 URL,例如 http://localhost/servlet.asp?class=HelloWorldServlet。然后您必須更改腳本的末尾來加載指定的類。下面是新的代碼:


dim className
set className = Request.QueryString( "class" )

dim servlet
set servlet = getObject( "java:com.nutrio.servlet." & className )

servlet.doGet requestAdapter, responseAdapter
 

這就行了!您已經將 Microsoft 的 Internet Information Server 變成了 Java Servlet 引擎。正如您將在下面看到的那樣,它雖然不是一個完美的引擎,但已相當接近完美。剩下要討論的全部內容就是適配器類的本質了。

為簡潔起見,在每種適配器中,我將只討論如何實現那些較流行的方法。對流行程度的度量是以我的個人經驗和看法為依據的;沒有比這更科學的了(這是我引用的原話)。

Microsoft 的 Java SDK 
從請求的封裝開始,對象必須做的第一件事情就是,獲取其 ASP 對應物的一個引用。這是通過 com.ms.iis.asp 包中的 AspContext 對象完成的。您問是什么包嗎?對了,這里我正要解釋您為什么需要安裝 Microsoft 的 Java SDK。

Microsoft 的 Java SDK 可以免費下載(請參閱參考資料)。要確保您獲得的是最新版本,我寫這篇文章時為 4.0。按照簡單的安裝說明進行操作,并在出現提示時重新啟動(令人嘆息!)。安裝 SDK 之后,相應調整您的 PATH 和 CLASSPATH 環境變量。采取點聰明的小技巧,在您的系統中搜索 jview.exe 的全部實例,然后確保最新版本在您的 PATH 中最先解析。 

不幸的是,Microsoft 的 Java SDK 附帶的文檔和樣例代碼中涉及 IIS/ASP 集成的內容非常少。當然有許多夸夸其談 -- 您得到了有關這一主題的整個已編譯的 HTML 文檔,但在大多數地方,它給人的感覺與其說是說明性的,不如說是自相矛盾的和含混不清的。謝天謝地,SDK 的 Samples 目錄中有一個 aspcomp 包,它實際上反映了 com.ms.iis.asp 包,并提供了源代碼。您在安裝 SDK 時確實安裝了這些樣例文件,對嗎?這個 aspcomp 包幫助我反向設計出許多 API 邏輯。

請求適配器 
既然您有了可隨意使用的 Microsoft 的 SDK,您就可以回頭繼續實現適配器類了。下面是請求適配器的最基本的版本。我已省略了包聲明和 import 語句,以便您可將注意力集中在代碼的實質部分。

public class RequestAdapter implements HttpServletRequest
{
    private Request request;

    public RequestAdapter()
    {
        this.request = AspContext.getRequest();
    }
 

請注意,該類引出了一個單一的 public 構造函數,它不帶任何參數。這是 ASP 腳本將該類實例化為一個 moniker 所必需的(通過 getObject 方法)。此構造函數只須從 AspContext 對象取得 ASP 的請求對象的一個引用,并存儲指向它的一個指針。此適配器實現 HttpServletRequest 接口,它允許您在一種真實的 servlet 環境的外觀之下,將其傳遞給您的 servlet。

請求對象的最常用方法是 getParameter。此方法用于檢索客戶機預計要提供的一段數據。例如,如果客戶機剛填好了一個表單并將其提交給服務器,則 servlet 將調用 getParameter 來檢索每個表單項的值。

在請求對象的 ASP 版本中,Microsoft 將區分通過 GET 到達的參數和通過 POST 到達的參數,您必須分別調用 getQueryString 或 getForm。在 servlet 版本中,在請求級別上不存在這種差別,因為用 GET 模式還是用 POST 模式,是在調用 doGet 或 doPost 時才規定的。因此,當您改編 getParameter 方法時,對于所需的值,您必須既查看查詢字符串,又查看表單集合。

還有一點需要注意,當參數不存在時,Microsoft 版本中將返回一個空字符串,而 Sun 版本中將返回 null。考慮到這一點,您必須檢查空字符串并在相應位置使返回值為 null。


public String getParameter( String str )
{
    String result = request.getQueryString().getString( str );

    if( ( result != null ) && result.trim().equals( "" ) )
    {
        result = request.getForm().getString( str );

        if( ( result != null ) && result.trim().equals( "" ) )
        {
            return( null );
        }
    }

    return( result );
}
 

這樣做相當簡單,但期望值不要太高,因為事情即將變得更為復雜。這是因為,在 servlet 中,請求對象也引出一個稱為 getParameterNames 的方法,對于客戶機提供的每段數據,它都會返回關鍵字的一個 Enumeration。如上所述,就 servlet 而論,它是一個單一入口點,但是 ASP 則要區分 GET 提供的數據和 POST 提供的數據。為了向 servlet 返回單一的 Enumeration,必須將 ASP 請求對象的查詢字符串和表單集合這兩種 Enumeration 組合起來。下面是我為了解決這個問題臨時編寫的一個方便的小工具。此工具稱為 EnumerationComposite(請不要將它與 Composite 設計模式相混淆),它使用一個 RequestDictionary(ASP 版本的 Hashtable)數組,并將這兩種 Enumeration 連接起來,形成一個大的 Enumeration。下面是完整的代碼:

public class EnumerationComposite implements Enumeration
{
    private RequestDictionary[] array;
    private int stackPointer = 0; 

    public EnumerationComposite( RequestDictionary[] array )
    {
        this.array = array;
    }

    public boolean hasMoreElements()
    {
        if( this.stackPointer >= this.array.length ) 
        {
            return( false );
        }
        else if( this.array[ this.stackPointer ].hasMoreItems() )
        {
            return( true );
        }
        else
        {
            this.stackPointer += 1;
            return( this.hasMoreElements() );
        }
    }

    public Object nextElement()
    {
        return( this.array[ this.stackPointer ].nextItem() );
    }
}

未完.....

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
懂色av噜噜一区二区三区av| 蜜臀精品一区二区三区在线观看| 欧美一级生活片| 日韩欧美精品在线| 欧美伦理电影网| 欧美一区日本一区韩国一区| 欧美系列亚洲系列| 欧美精品乱码久久久久久 | 国产精品乱码一区二区三区软件| 精品欧美一区二区在线观看 | 久久久久久久久久看片| 精品播放一区二区| 国产人成一区二区三区影院| 国产精品免费av| 亚洲精选视频免费看| 亚洲va国产天堂va久久en| 日韩高清在线不卡| 国产在线视频一区二区三区| 国产乱码精品一区二区三| www.激情成人| 精品婷婷伊人一区三区三| 日韩一区二区麻豆国产| 久久综合成人精品亚洲另类欧美| 欧美国产日本韩| 一区二区三区在线看| 日韩二区三区在线观看| 狠狠色综合播放一区二区| 国产成人午夜片在线观看高清观看| 成人精品免费网站| 欧美性猛交xxxx黑人交| 日韩精品中文字幕在线不卡尤物| 国产精品丝袜一区| 亚洲国产精品尤物yw在线观看| 裸体健美xxxx欧美裸体表演| 国产成人免费9x9x人网站视频| 91丨porny丨最新| 日韩小视频在线观看专区| 国产午夜精品一区二区| 亚洲一区电影777| 国产一区二区三区不卡在线观看| 色综合天天做天天爱| 日韩女优av电影| 亚洲欧美日韩久久| 国产精品资源网站| 欧美日韩国产片| 亚洲婷婷综合久久一本伊一区| 日韩av中文字幕一区二区三区| 国产宾馆实践打屁股91| 337p亚洲精品色噜噜| 国产精品福利av| 麻豆精品久久久| 欧美伦理影视网| 亚洲三级在线免费观看| 国产一区二区视频在线| 欧美视频完全免费看| 国产精品国产三级国产普通话三级| 日本欧美在线观看| 精品视频免费在线| 一区二区国产视频| 成人av手机在线观看| 久久看人人爽人人| 日韩高清不卡在线| 欧美性大战久久久| 一区二区三区四区高清精品免费观看| 国产精品影视在线观看| 日韩免费一区二区三区在线播放| 五月天亚洲精品| 欧美性生活久久| 亚洲激情图片qvod| 91免费版pro下载短视频| 国产精品无码永久免费888| 美女一区二区在线观看| 91精品国产高清一区二区三区| 亚洲一卡二卡三卡四卡五卡| 91久久香蕉国产日韩欧美9色| 亚洲丝袜精品丝袜在线| 成人av第一页| 亚洲精品写真福利| 91精品福利在线| 亚洲一二三四久久| 7777精品伊人久久久大香线蕉超级流畅 | 91黄色免费版| 亚洲精品中文在线| 日本高清成人免费播放| 亚洲.国产.中文慕字在线| 在线区一区二视频| 日韩综合小视频| 欧美成人video| 国产精品18久久久久久久久| 国产午夜久久久久| a亚洲天堂av| 亚洲亚洲人成综合网络| 欧美一级二级三级乱码| 精品一区二区三区在线观看国产 | 国产成人av影院| 久久久精品日韩欧美| 成年人国产精品| 亚洲精品国产第一综合99久久 | 亚洲国产精品精华液ab| 99国产麻豆精品| 亚洲成人激情综合网| 日韩久久久久久| 91网站视频在线观看| 五月天中文字幕一区二区| 久久久91精品国产一区二区精品| 99精品久久只有精品| 日韩va亚洲va欧美va久久| 国产日韩亚洲欧美综合| 欧美亚洲图片小说| 国产综合成人久久大片91| 亚洲美女淫视频| 精品蜜桃在线看| 91福利在线看| 国产一区二区三区四区五区入口 | 亚洲国产成人av网| 欧美tk丨vk视频| 日本伦理一区二区| 国产成人超碰人人澡人人澡| 亚洲综合在线视频| 精品国产在天天线2019| 欧美日韩三级视频| 成人动漫av在线| 国内精品伊人久久久久av一坑| 亚洲精选视频在线| 日本一区二区三区四区| 91精品国产一区二区人妖| 91免费视频网| 国产精品一级片在线观看| 亚洲成人动漫精品| 亚洲视频在线一区观看| 日韩欧美色综合| 欧美年轻男男videosbes| av在线一区二区三区| 国产伦理精品不卡| 丝袜亚洲精品中文字幕一区| 亚洲精品久久久蜜桃| 国产日韩精品一区二区浪潮av| 91精品国产综合久久福利| 欧亚洲嫩模精品一区三区| 不卡一区二区三区四区| 国产盗摄一区二区三区| 精品在线你懂的| 久久狠狠亚洲综合| 日本视频免费一区| 日韩电影免费一区| 日韩av高清在线观看| 天天综合天天做天天综合| 亚洲精品免费电影| 亚洲一区二区三区精品在线| 亚洲毛片av在线| 亚洲老司机在线| 亚洲色图欧美在线| ㊣最新国产の精品bt伙计久久| 日本一区二区三区视频视频| 日本一区二区三区免费乱视频 | 国产精品激情偷乱一区二区∴| 久久麻豆一区二区| 国产日韩精品视频一区| 国产日产欧美一区二区视频| 久久婷婷久久一区二区三区| 久久综合精品国产一区二区三区| 精品国产乱码久久久久久久 | 国产高清一区日本| 成人国产亚洲欧美成人综合网| 成人av集中营| 色域天天综合网| 欧美日韩一区二区三区不卡| 欧美精品久久一区二区三区| 欧美zozo另类异族| 国产无遮挡一区二区三区毛片日本| 久久精品欧美一区二区三区麻豆| 国产农村妇女毛片精品久久麻豆 | 国产成人午夜精品影院观看视频| 国产成人午夜精品影院观看视频| 成人黄色免费短视频| 91福利社在线观看| 日韩精品一区国产麻豆| 欧美国产日本韩| 亚洲成av人片一区二区| 美国欧美日韩国产在线播放| 国产精品77777竹菊影视小说| 91视频观看视频| 91精品婷婷国产综合久久竹菊| 亚洲精品一区二区三区在线观看 | 成人av网站在线观看免费| 日本精品一区二区三区高清 | 亚洲国产婷婷综合在线精品| 亚洲一区二区影院| 久久er精品视频| 成人av在线影院| 欧美一区二区三区在线观看| 中文字幕第一区第二区| 亚洲第一成人在线| 国产乱码精品一区二区三区忘忧草| 91亚洲午夜精品久久久久久| 日韩三级在线观看| 亚洲男人天堂av网| 国产麻豆精品在线| 5858s免费视频成人| 国产精品久久久久久久久搜平片|