Posted: 2005/2月/16 12:09下午 | IP記錄
|
|
|
用J++創建服務器端組件
J++同C++很相似,都是面向對像語言,Java同C最大區別就在於它的獨立平台性,雖然有人爭論現在的Internet產品 生命週期太短,你根本就沒時間在它變得過時之前在不同的平台上編譯他們。C++對於J++來說仍有速度優勢,雖然之間差距是很小 的。
這節將使用Visual J++ 1.1 作為開發環境,因為Java是可移植的,任何基於Windows的Java編輯器都都適用。唯一特殊的方面是你的組件必需註冊為 一個COM對象,它將引入COM庫,使用Javareg來在 Windows NT中註冊組件。
注意
COM是Microsoft的一種技術。出於這種原因,為IIS組件編寫的代碼不能在其它平台上運行。這可能不成問題,因為II S只是在NT上運行。
Java組件開發過程遵循以下步驟:
安裝類庫,如果需要的話。
編寫源代碼。
創建項目。
註冊你的組件。
在ASP頁中引用組件。
注意
這章將介紹如何用Java來創建組件,而同JavaScript或JScript有很大不同,JavaScript和Jscri pt都是解釋性編程語言,與Java或 J++沒有或很少聯繫。
安裝類庫
要為ASP編寫Java應用程序,你必須首先創建類型庫,任何關於 Import asp的引用都會失敗,除非你完成這步操作。(import.asp)是一個Java類庫,它同C裡的以.h結尾的includ e文件類似。
在Visual J++ IDE中選擇Tools|Java|Type Library Wizard,然後選擇Active Server Pages 1.0 Library,單擊OK產生類庫。
內建對像接口
在前一段中安裝的類庫支持通過IScriptingContext接口與ASP內建對像之間的通信,表28.2列出了類庫所提供 的接口。這些對象的詳細信息將在第三部分Section B-Active Sever Objects中介紹。
表28.2 內建對像接口
接口 用途 IApplication Object 調用應用程序對象的方法和屬性 IRequest 調用請求對象的方法和屬性 IResponse 調用響應對象的方法和屬性 IReadCookie 返回CooKie集合的內容(只讀) IRequestDictionary 通過IRequest接口實現對Request對像集合的索引 IScriptingContext 返回同Application,Request,Response,Server或Session 對象的接口 IServer 調用Server對象的方法和屬性 IsessionObject 調用Session對象的方法和屬性 IStringList 從Querystring,Form或Server集合中返回字符串值 IwriteCookie 設置Cookie的內容
建立組件
使用Explorer創建一個Asp Unleashed 文件夾,它假設在C盤上以c:\AspUnleashed的形式出現。
啟動Visual Studio或J++,選擇File|new顯示工作區對話框,單擊Workspace表欄,輸入Chaper28作為工作區名 稱,將路徑設為:c:\AspUnleashed\chapter28,如圖28.1所示。(如果你已嘗試了Visual Basic例子的話,這個工作區已存在)。
在工作裡需要一個Java項目工程,選擇File|New,單擊Projects表頭,從列表中選擇Java Project並輸入JavaSoaringSites作為項目工程名,如圖28.2所示,確保選擇Add to Current Workspace單選按鈕。
最後創建Java源文件,再次選擇File|New,單擊Files表頭,從列表中選擇JavaSource File並輸入JsoaringSites作為文件名,如圖28.3所示。
圖28.1 創建chapter28工作區
圖28.2 在chapter28工作區內創建JavaSoaringSites項目工程
列表28.1是一個簡單的Java日程表組件,錯誤-陷阱在例子中省略,為的是突出重點,在列表28.4只將顯示用Visual Basic編寫的組件代碼。
表28.1 JsoaringSites.java
------------------------------------------------------------ -------------------- // JSoaringSites// This small Java example demonstrates how to create an// ASP component in Java
import com.ms.com.*;import asp.*;
class JSoaringSites{ IResponse m_iResponse = null; IRequest m_iRequest = null; String m_sReturnString = "";
public void OnStartPage(IScriptingContext objScriptContext) { m_iResponse = objScriptContext.getResponse(); m_iRequest = objScriptContext.getRequest(); }
public void OnEndPage() { m_iResponse = null; m_iRequest = null; }
public void ListSoaringSites(String sState) { Variant vOutput = new Variant(); vOutput.putString("Requested State: "+sState); m_iResponse.Write(vOutput); m_sReturnString = "<P>"; if (sState.equalsIgnoreCase("WA")) { m_sReturnString += "Arlington, WA<BR>"; m_sReturnString += "Burlington, WA<BR>"; m_sReturnString += "Pullman, WA<BR>"; m_sReturnString += "Richland, WA<BR>"; m_sReturnString += "Wenatchee, WA<BR>"; m_sReturnString += "Yakima, WA<BR>"; } else if (sState.equalsIgnoreCase("WI")) m_sReturnString += "<BR>West Bend, WI<BR>"; else m_sReturnString += "No sites found for "+sState; vOutput.putString(m_sReturnString); m_iResponse.Write(vOutput); }}
------------------------------------------------------------ -------------------- 其中的兩行代碼是Java 的基本組成元素。import com.ms.com.*和import asp.*語句同C中的include文件相似,這個兩語句分別引用了你先前安裝的COM和ASP類庫。
On Start Page和On End Page是兩個特殊的事件,它們在當組件初始化和終止時自動執行。ASP自動調用它們,而不需要你為它們特殊考慮。事實上,這個 組件可以根本不改動這兩個事件的內容。但是,在這個例子裡你可以修改其代碼以便特定的需要,例如你可能希望當網頁打開時組件初始 化就進行數據庫打開操作。
通過使用equalsIgnoreCase 我們就可以將任何大小寫組合匹配作為有效輸入,因此wa,Wa,和WA都可以作為Washington的縮寫。
我們的例子中只涉及到兩個州的信息,所以通過選擇語句可以避免許多不必要的代碼,但在現實生活中,不可能用大量的if語句來列出 開展滑翔機活動的州,這個組件代碼應重新改寫使用數據庫查詢語句,但在這裡我們可以這樣寫
當輸入這些代碼或從CD上拷貝之後,接下來構建此Java組件,然後將這個組件拷貝到WinNT\Java\TrustLib目 錄下,以命令行形式顯示(確信在TrustLib目錄下):
「\Program Files\DevStudio\VJ\Bin\Javareg」
/register/class:JsoaringSites/progid:chapter28.JSoaringSites
注意
如果你已經註冊登記了組件,不要忘記在登記最近的組件之前首先鍵入以下的命令行來註銷先前的組件:
「\ProgvamFiles\DevStudio\VJ\Bin\Javareg」 /unregister/calss:JsoaringSites/progid:chapter28.JsoaringSit es
通過使用OLEView.exe確保沒有其它的組件在你的Java\bin中註冊。出於某些原因,可能與Visual J++ 1.1不能從所有目錄都註冊成功組件有關——所以註銷工作有時不起作用。如果你在OLEView中發現對這個class的其它引 用,唯一的辦法是搜索到所有的引用這個class的登記文件,然後手來工地刪除它們。每個class有三個引用文件。
技巧
OleView是一個很好的跟蹤工具。但有時區分問題很困難,究竟是註冊/構造問題,還是ASP的問題呢?當你在OleView 中雙擊一個class時,你創建了COM對象的一個實例。
如果對像註冊正確,OleView將顯示與組件相聯繫的COM接口,如果OleView顯出一個錯誤信息,可能是一個構造/註冊 問題。
注意
在Java1.1或更高版本裡,你不需要將你的組件複製到一個公共目錄中去,因為註冊過程將產生一個你實際所在註冊路徑的映射, 這樣你就可以避免將你所有組件都保存在同一公共目錄中去時可能碰到的麻煩。因為沒有一種工具可以顯示組件是在哪個路徑下註冊的。
以下的兩個ASP頁將使用組件,第一頁是一個簡單的表單,用來接受用戶輸入的不同州的選擇。第二頁將處理請求並將其傳遞給Jav a組件,因為在Java組件中只有兩個州(Washigton 和Wisconsin),所以大多數查詢簡單地返回No Sites found信息。
列表28.2說明了Soaring Sites組件是如何使用的。其中的HTML代碼詢問用戶選擇一個要搜尋滑翔運動俱樂部的州,然後用戶的請求通過HTML的FO RM對像傳遞到列表28.3的代碼。
列表28.2 JavaSoaringSites.asp
------------------------------------------------------------ --------------------
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Final//EN"><HTML><HEAD> <TITLE>Soaring Sites Results</TITLE></HEAD>
<BODY BGCOLOR="#FFFFFF"><FONT SIZE="2" FACE="Verdana, Arial, Helvetica">
<CENTER><H1>Soaring Sites</H1></CENTER>
<HR Color="Red"><FORM ACTION="JavaSoaringSitesAction.asp"> Enter a state abbreviation to search for a site: <INPUT NAME="State" SIZE="2"><BR> <INPUT TYPE="SUBMIT"></FORM>
------------------------------------------------------------ -------------------- </BODY></HTML>
列表28.3顯示了Jsoaring Sites真正的調用過程,HTML代碼從REQUEST對像(一個內建ASP組件)獲得用戶的請求並將信息通過調用ListS oaringSites方法,來傳遞給在定制的組件。組件本身將格式化的結果以HTML代碼形成返回給頁面。
列表28.3 JavaSoaringSitesAction.asp
------------------------------------------------------------ --------------------
<% Option Explicit %><!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 3.2 Final//EN"><HTML><HEAD> <TITLE>Soaring Sites Results</TITLE></HEAD>
<BODY BGCOLOR="#FFFFFF"><FONT SIZE="2" FACE="Verdana, Arial, Helvetica">
<CENTER><H1>Soaring Sites</H1></CENTER><HR Color="Red">
<%Dim SoaringSitesSet SoaringSites = Server.CreateObject("Chapter28.JSoaringSites")SoaringSites.L istSoaringSites Request("State")Set SoaringSites = Nothing%>
</BODY></HTML>
技巧
你可以跳過組件註冊,Microsoft已經將這個功能附加在Java 組件中,通過以下形式實現。
Set SoaringSites=Server.Create Object(「Java:Chapter28.JsoaringSites」)
當這本書出版的時候,這項功能還沒有,所以在這章中的例子沒有使用這種增強功能。
|