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

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關(guān)于我們
? 蟲蟲下載站

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

?? 一個(gè)很好的JAVA學(xué)習(xí)文檔 包括很多JAVA學(xué)習(xí)有關(guān)的文本文檔
?? TXT
字號:
作者:sonymusic
email: sonymusic@china.com
日期:2000-12-6 23:50:12
將 Microsoft 的 Internet Information Server 用作 Java servlet 引擎
用 Microsoft 的 IIS 運(yùn)行 Java servlet -- 而不犧牲可移植性

Thomas E. Davis 
Nutrio.com 首席技術(shù)官
2000 年 7 月

內(nèi)容: 
 
 
 IIS 
 適配器設(shè)計(jì)模式 
 Servlet 
 ASP 
 Java SDK 
 請求適配器 
 會(huì)話適配器 
 響應(yīng)適配器 
 結(jié)論 
 正式請求 
 參考資料 
 作者簡介 
 


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

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

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

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

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

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

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

 


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

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

Active Server Page 
當(dāng)您從 ASP 中調(diào)用 servlet 時(shí),您正是在調(diào)用 doGet 方法,并傳入適當(dāng)?shù)恼埱蠛晚憫?yīng)對象。從這時(shí)起,servlet 就具有了完全的控制權(quán)。ASP 腳本用作 servlet 的引導(dǎo)程序。但在您可以傳入請求和響應(yīng)對象之前,您必須用相應(yīng)的適配器類來包裝它們(稍后我對此將有詳細(xì)分析)。

我將從頭開始講下去。客戶機(jī)要請求的 URL 看起來與 http://localhost/servlet.asp 類似。.asp 擴(kuò)展名意味著所請求的文檔是一個(gè) 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

 

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

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

這個(gè)特定的腳本具有相當(dāng)大的局限性,因?yàn)樗粏?dòng)一個(gè)特定的 servlet。您很可能希望將其擴(kuò)展,以啟動(dòng)一整套 servlet,這樣您就需要做幾處小小的修改。假定您的所有 servlet 都在同一個(gè)包內(nèi),您就可以將目標(biāo) 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
 

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

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

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

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

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

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

public class RequestAdapter implements HttpServletRequest
{
    private Request request;

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

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

請求對象的最常用方法是 getParameter。此方法用于檢索客戶機(jī)預(yù)計(jì)要提供的一段數(shù)據(jù)。例如,如果客戶機(jī)剛填好了一個(gè)表單并將其提交給服務(wù)器,則 servlet 將調(diào)用 getParameter 來檢索每個(gè)表單項(xiàng)的值。

在請求對象的 ASP 版本中,Microsoft 將區(qū)分通過 GET 到達(dá)的參數(shù)和通過 POST 到達(dá)的參數(shù),您必須分別調(diào)用 getQueryString 或 getForm。在 servlet 版本中,在請求級別上不存在這種差別,因?yàn)橛?GET 模式還是用 POST 模式,是在調(diào)用 doGet 或 doPost 時(shí)才規(guī)定的。因此,當(dāng)您改編 getParameter 方法時(shí),對于所需的值,您必須既查看查詢字符串,又查看表單集合。

還有一點(diǎn)需要注意,當(dāng)參數(shù)不存在時(shí),Microsoft 版本中將返回一個(gè)空字符串,而 Sun 版本中將返回 null。考慮到這一點(diǎn),您必須檢查空字符串并在相應(yīng)位置使返回值為 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 );
}
 

這樣做相當(dāng)簡單,但期望值不要太高,因?yàn)槭虑榧磳⒆兊酶鼮閺?fù)雜。這是因?yàn)椋?servlet 中,請求對象也引出一個(gè)稱為 getParameterNames 的方法,對于客戶機(jī)提供的每段數(shù)據(jù),它都會(huì)返回關(guān)鍵字的一個(gè) Enumeration。如上所述,就 servlet 而論,它是一個(gè)單一入口點(diǎn),但是 ASP 則要區(qū)分 GET 提供的數(shù)據(jù)和 POST 提供的數(shù)據(jù)。為了向 servlet 返回單一的 Enumeration,必須將 ASP 請求對象的查詢字符串和表單集合這兩種 Enumeration 組合起來。下面是我為了解決這個(gè)問題臨時(shí)編寫的一個(gè)方便的小工具。此工具稱為 EnumerationComposite(請不要將它與 Composite 設(shè)計(jì)模式相混淆),它使用一個(gè) RequestDictionary(ASP 版本的 Hashtable)數(shù)組,并將這兩種 Enumeration 連接起來,形成一個(gè)大的 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() );
    }
}

未完.....

?? 快捷鍵說明

復(fù)制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
日韩免费成人网| 欧美日韩精品电影| 国产精品色噜噜| 成人av在线网站| 亚洲天堂精品在线观看| 91麻豆福利精品推荐| 亚洲另类中文字| 欧美性xxxxx极品少妇| 亚洲午夜久久久久久久久电影院| 欧美视频在线一区| 麻豆国产精品视频| 久久久久国产精品麻豆| 成人av在线资源网站| 一区二区三区资源| 91精品欧美一区二区三区综合在| 蓝色福利精品导航| 国产精品视频一二| 欧美吻胸吃奶大尺度电影| 日韩成人伦理电影在线观看| 精品嫩草影院久久| 99久久伊人网影院| 香蕉成人啪国产精品视频综合网| 日韩网站在线看片你懂的| 高清不卡一二三区| 亚洲一区二区三区影院| 欧美一区二区女人| 成人久久18免费网站麻豆 | 欧美熟乱第一页| 另类小说视频一区二区| 国产精品毛片久久久久久| 欧美日韩中文精品| 国产精品资源在线| 午夜影院在线观看欧美| 国产丝袜美腿一区二区三区| 一本一道波多野结衣一区二区| 亚洲高清三级视频| 国产精品久久久久aaaa| 欧美一卡二卡三卡| 91色porny在线视频| 久久机这里只有精品| 亚洲精品ww久久久久久p站| 日韩女优毛片在线| 欧美色涩在线第一页| 国产99精品视频| 毛片基地黄久久久久久天堂| 亚洲激情在线播放| 欧美激情综合五月色丁香| 欧美高清精品3d| 色综合天天在线| 国产成人自拍网| 美女一区二区久久| 视频一区二区中文字幕| 亚洲欧美偷拍卡通变态| 欧美激情一区二区三区不卡 | 亚洲婷婷综合色高清在线| 日韩小视频在线观看专区| 欧美亚洲一区二区在线| 成人av在线资源| 国产成人免费高清| 黄色资源网久久资源365| 日韩精品视频网站| 亚洲成人一区二区| 亚洲精品大片www| 亚洲精品大片www| 中文字幕亚洲一区二区av在线| 精品少妇一区二区三区日产乱码| 欧美日韩一区小说| 在线观看日产精品| 色婷婷综合激情| 91国产福利在线| 色婷婷综合久久久久中文一区二区| 成人免费毛片app| 国产成人亚洲综合色影视| 韩国成人在线视频| 久久99国产精品麻豆| 日本一不卡视频| 日本成人在线看| 日韩制服丝袜av| 美腿丝袜亚洲一区| 激情国产一区二区| 国产精品99久久久久久久女警| 国产一区激情在线| 国产成人午夜视频| 成人不卡免费av| 色综合天天天天做夜夜夜夜做| 91亚洲永久精品| 91黄视频在线| 欧美日韩电影一区| 日韩一二三四区| 欧美精品一区二区在线观看| 26uuu另类欧美亚洲曰本| 久久亚洲精品小早川怜子| 中文字幕乱码久久午夜不卡| 亚洲欧美综合另类在线卡通| 一区二区三区中文字幕在线观看| 亚洲第一在线综合网站| 久久精品国产一区二区三| 国产成人精品一区二 | 91九色02白丝porn| 欧美美女视频在线观看| 日韩美女一区二区三区| 中文字幕av一区二区三区| 亚洲欧美另类久久久精品| 午夜久久久影院| 国产伦精一区二区三区| 国产精品18久久久久| 99在线热播精品免费| 欧美日韩三级一区二区| 欧美成人性福生活免费看| 国产精品私人影院| 亚洲成a人片在线不卡一二三区| 久久精品av麻豆的观看方式| 国产美女在线精品| 欧美午夜片在线看| 久久先锋影音av鲁色资源| 最好看的中文字幕久久| 日韩电影一区二区三区| 不卡的av电影| 日韩亚洲欧美一区| 亚洲欧美日韩国产另类专区| 美女在线观看视频一区二区| 91免费精品国自产拍在线不卡| 91精品国模一区二区三区| 国产精品卡一卡二卡三| 爽爽淫人综合网网站| 成人精品一区二区三区四区| 欧美精品免费视频| 中文字幕中文字幕中文字幕亚洲无线| 亚洲丶国产丶欧美一区二区三区| 国产激情视频一区二区在线观看| 欧美日韩精品一区二区天天拍小说| 久久久久一区二区三区四区| 亚洲一本大道在线| 成人午夜激情视频| 精品三级av在线| 亚洲va欧美va人人爽午夜| 成人激情文学综合网| 精品国产一区久久| 亚洲国产cao| 99久久久久久| 欧美精品一区二区在线播放| 亚洲国产精品久久久久婷婷884| 丁香五精品蜜臀久久久久99网站| 日韩三级免费观看| 亚洲高清免费一级二级三级| 99精品久久久久久| 国产拍揄自揄精品视频麻豆| 免费视频一区二区| 欧美日韩一级二级| 亚洲三级电影网站| 风间由美中文字幕在线看视频国产欧美 | 国产精品福利电影一区二区三区四区| 免费观看成人鲁鲁鲁鲁鲁视频| 欧美视频在线观看一区| 中文字幕在线观看一区二区| 国产伦精品一区二区三区免费迷 | 午夜精品久久久久久| 色老汉av一区二区三区| 亚洲日本在线a| 不卡的电影网站| 国产精品久久久爽爽爽麻豆色哟哟| 国产一区二区三区精品欧美日韩一区二区三区 | 中文字幕在线免费不卡| 丁香啪啪综合成人亚洲小说 | 国产精品福利av| 不卡av免费在线观看| 国产精品蜜臀在线观看| 国产成人av一区二区三区在线观看| 久久亚洲影视婷婷| 国精产品一区一区三区mba视频| 精品少妇一区二区三区在线播放| 麻豆91小视频| 欧美成人精品3d动漫h| 久久精品久久精品| 精品国产一区二区三区四区四| 精品一区二区免费看| 精品国产自在久精品国产| 国产毛片一区二区| 国产精品第五页| 91国偷自产一区二区开放时间| 亚洲一区二区视频在线观看| 欧美日韩久久久| 老司机精品视频线观看86| 久久久精品一品道一区| av在线这里只有精品| 亚洲已满18点击进入久久| 欧美日韩激情一区二区三区| 麻豆久久久久久久| 国产亚洲短视频| av亚洲精华国产精华精| 亚洲影视在线观看| 日韩免费电影一区| 成人综合在线网站| 亚洲午夜在线观看视频在线| 日韩视频永久免费| 国产乱码精品一区二区三区av| 中文字幕永久在线不卡| 欧美日韩一二三| 国产自产高清不卡| 1024成人网色www|