文章詳情頁
從Firefox訪問Java Plug-in
瀏覽:12日期:2024-06-16 15:32:59
內容: 摘要這篇文章與Jeff Friesen前一篇關于Java Plug-in的文章'Plug into Java with Java Plug-in' (JavaWorld, 6月 1999)是一個系列的。它專注于Firefox Web瀏覽器的最近的Java Plug-in其中之一。在篇文章中,你能學會從Firefox怎樣訪問Java Plug-in。你也能學到一些關于Java Plug-in文件對象模塊(DOM),applet狀態持久化,和cookie。除此以外,你還可以學習applet,它在Firefox中的運行,這將加強你對這些內容的理解。但那僅僅是開始。難道你曾經不想去探求Firefox是怎樣與Java Plug-in(在后臺)交互的嗎?繼續讀下去你就會找到答案的。版權聲明:任何獲得Matrix授權的網站,轉載時請務必保留以下作者信息和鏈接作者:Jeff Friesen;leo173(作者的blog:http://blog.matrix.org.cn/page/leo173)原文:http://www.javaworld.com/javaworld/jw-06-2005/jw-0627-plugin.html譯文:http://www.matrix.org.cn/resource/article/44/44251_Firefox+Java+Plug-in.html關鍵字:Firefox;Java;Plug-in 從我在JavaWorld 上寫'Plug into Java with Java Plug-in' 開始,9年已經過去了。我的前一篇文章給Java Plug-in下了定義,講到了怎樣在Netscape Communicator 4.5 和 Internet Explorer 3.02 上怎樣安裝版本1.2,描述了與Java Plug-in相關的Windows注冊表設置,了解了Java Plug-in的控制面版,考查了兩個java主控臺,討論了HTML 的 和 標簽,還發布了一個基于Swing的用于Demo的applet。自從我寫了那篇文章后,java和Java Plug-in已經相繼發布了許多個版本。看來那篇文章已顯老態,所以我已經寫好它的系列篇,它專注于針對Firefox Web瀏覽器的最近的Java Plug-in其中之一。這篇文章首先為你講解從Firefox怎樣訪問Java Plug-in。然后討論Java Plug-in文件對象模塊(DOM), applet狀態持久化 和cookie。比如在Firefox上運行的各種applet,當你在學習這些內容時,將會強化你已經掌握的知識。這篇文章通過探尋Firefox 和Java Plug-in之間的聯系,再做歸納。因為對于Java Plug-in而言,在其他地方會比我在這里所講的要詳細得多,所以我建議可以學習Sun的Java Plug-in文檔,你將會學到更多的技術。這篇文章的實驗環境是Mozilla Firefox 1.0, J2SE 5.0, 和Windows 98 SE。即使你沒有這些軟件,我仍然建議你讀完這篇文章。真誠地希望你能發現一些對你來說還是未知的有興趣的東西。Java Plug-in 和FirefoxJava Plug-in象橋一樣服務于瀏覽器和一個外部的 java運行環境(JRE)之間。Java Plug-in對于在Firefox 中運行的applet而言是相當重要的,因為瀏覽器不能自身為其提供一個JRE——其中包括一個JVM。因為這篇文章描述的applet會涉及到不同多個不同的Java Plug-in內容,還有就是這些applet都是在Firefox的環境中運行的,所以我們首先應該看一下如何從Firefox中訪問Java Plug-in。對于初學者來說,你必須確認在你的平臺上已經安裝了J2SE 5.0 和 JRE。在我的windows平臺上,我用jdk-1_5_0-windows-i586.exe安裝文件把J2SE 和 JRE都安裝好了。確定你已經安裝了JRE,因為JRE包含了Java Plug-in。在安裝好J2SE 5.0后,連接Firefox 到 Java Plug-in;首先從Firefox的工具菜單中選擇Options,然后選擇Web Features,最后點擊Enable Java checkbox。一般情況下,標簽 和 應該指向在Java Plug-in下運行的applet。這對Java Plug-in 5.0來說不是必要的,它能運行由簡單的標簽指定的applet。在安裝時,你有機會屏蔽Internet Explorer 和 Mozilla (Firefox)/Netscape Web瀏覽器對applet的執行,如果它們遇到了標簽,而轉交給Java Plug-in處理。如果你放棄這個選項,遲些時候你可以通過Java Plug-in的控制面版來完成這個變化。比如,打開控制面版,選擇標簽Advanced。然后點擊 Tag Support左邊的“+,再選擇Mozilla and Netscape選項。關閉這個面版后,當Firefox遇到標簽時,它就會交給Java Plug-in執行。圖1給出了這些必要的改變。 選擇Mozilla and Netscape,所以當Firefox遇到標簽時,它就會交給Java Plug-in執行提示 我發現在我的平臺上選擇Mozilla and Netscape不是必須的。我的Firefox Web瀏覽器不會去管那個復選框的設置,當遇見時,它就會讓Java Plug-in來執行。Java Plug-in 5.0的文檔談到這是個奇怪的行為:“如果Mozilla 和 Netscape 7都被安裝好了,負責管理對標簽是否支持的Mozilla and Netscape選項沒有被選中的情況下,標簽中的內容照樣可以在Sun VM上運行。這是與Netscape 7的自動掃描功能相關的一個bug。因為我已經安裝過Netscape 6.2.3,所以我認為我找到了這個bug。如果在你的平臺上遇到了這個問題,記住這點就行了。平臺上能駐留多個JRE,當Firefox遇到標簽時,到底哪一個JRE來實現Java Plug-in?可以從Java Plug-in控制面版上的Java標簽上找到答案。在二選一的情況下,我用來進行版本測試的applet給出了答案,同時也證明了Firefox是連接了 Java Plug-in的。圖2顯示我當前使用的JRE版本是1.5.0。(版本1.5.0是J2SE 5.0的內部版本號)圖2. 我已經配置好使用JRE 1.5.0的Java Plug-inListing 1給出了該applet的VersionDemo.java文件的源代碼。這些代碼在系統屬性java.version 中設置了JRE 的版本。Listing 1. VersionDetect.java // VersionDetect.javaimport java.awt.*;public class VersionDetect extends java.applet.Applet{ public void paint (Graphics g) { int width = getSize ().width; int height = getSize ().height; g.setColor (Color.orange); g.fillRect (0, 0, width, height); String version = 'JRE ' + System.getProperty ('java.version'); FontMetrics fm = g.getFontMetrics (); g.setColor (Color.black); g.drawString (version, (width-fm.stringWidth (version))/2, height/2); }} 為了簡潔,在這篇文章中我將不會給出運行這個或者其他applet的HTML。參見這篇文章中的source code 。提示 Firefox只支持Java Plug-in 1.3.0_01和更高版本。調用DOM根據WWW 聯合會 (W3C)所說,文件對象模塊(DOM)是一個API,它針對“有效的HTML和合式的XML文檔。它定義了文檔的邏輯結構,訪問和操作文檔的方法。 Java Plug-in提供了兩種方法來調用DOM:類netscape.javascript.JSObject和Common DOM API。JSObject為Java applet 和Web 瀏覽器的JavaScript實現之間提供了接口,包含使用了DOM 的JavaScript 對象。這些對象的例子:Document, Link, 和 Window。我將不會深入JSObject,因為在我早期的文章'Talk with Me Java'中,我已經討論了這個類。因此我專注于在一個applet中,通過Common DOM API來遍歷DOM 。在J2SE 版本1.4中已經介紹過Common DOM API,它是一個類和接口的集合,通過這些接口可以讓applet遍歷DOM實例。因為一個瀏覽器通過幀和窗口能夠顯示多個文檔,所以會有許多DOM實例以備遍歷。一般一個applet就遍歷它自己的DOM實例—這個與文檔相聯系的DOM實例指定了這個applet。訪問DOM實例的起點就是靜態方法getService(Object obj),該方法位于類com.sun.java.browser.dom.DOMService中。一般情況下,一個被喚醒applet的this指針會被作為一個參數傳遞給getService()。這個方法要么返回一個 DOMService對象(為這個applet和它的DOM實例之間提供接口),要么拋一個異常:com.sun.java.browser.dom.DOMUnsupportedException (the DOM service is not available to the object) 或者 com.sun.java.browser.dom.DOMAccessException (a security violation has resulted)。例子:DOMService service = DOMService.getService (this);。因為web瀏覽器提供了不同的DOM實現,所以訪問一個DOM實例不是線程安全的,除非那個訪問是發生在DOM access dispatch線程。為了確保線程安全性,DOMService提供了兩個方法來保證訪問只是發生在DOM access dispatch線程—invokeLater() 和 invokeAndWait()。兩種方法都用實現了接口com.sun.java.browser.dom.DOMAction的對象作為參數,來提供方法run()。invokeLater()在DOM dispatch線程中異步執行run(),invokeAndWait()在DOM dispatch線程中同步執行run()。方法run()用實現了接口com.sun.java.browser.dom.DOMAccessor的對象作為其唯一參數,然后返回一個基本的Object引用。方法run()經常喚醒DOMAccessor的getDocument()方法,傳遞一個applet的指針做getDocument()的Object參數。作為回應,getDocument()會返回一個實現org.w3c.dom.Document接口的對象。那個對象中就包含了這個文檔的信息。對于HTML文檔而言,它會把Document向下轉型為HTMLDocument(位于org.w3c.dom.html中),然后調用HTMLDocument的方法去獲取這個文檔的標題,域,applet集,和一些其他的。在調用屬性方法后,run()返回一個包含文檔信息(比如HTMLDocument的標題)的Object對象。那個Object隨后又從invokeAndWait()和invokeLater()方法中返回。為了梳理上面討論的內容,我寫了一個從一個HTML文檔中提取標題的applet,然后把標題顯示給用戶。下面就是它的代碼。Listing 2. TitleExtract.java // TitleExtract.javaimport com.sun.java.browser.dom.*;import java.applet.Applet;import java.awt.*;import org.w3c.dom.html.*;public class TitleExtract extends Applet{ private String title = 'unknown'; public void init () { try { DOMService service = DOMService.getService (this); title = (String) service.invokeAndWait (new DOMAction () {public Object run (DOMAccessor accessor){ HTMLDocument doc = (HTMLDocument) accessor.getDocument (TitleExtract.this); return doc.getTitle ();} }); } catch (DOMUnsupportedException e) { System.out.println ('DOM not supported'); } catch (DOMAccessException e) { System.out.println ('DOM cannot be accessed'); } } public void paint (Graphics g) { int width = getSize ().width; int height = getSize ().height; g.setColor (Color.cyan); g.fillRect (0, 0, width, height); FontMetrics fm = g.getFontMetrics (); g.setColor (Color.black); g.drawString (title, (width-fm.stringWidth (title))/2, height/2); }} DOMAction的run()方法調用了HTMLDocument的getTitle()方法去獲取HTML文檔的標題。隨后顯示該標題。例如,當在TitleExtract.html(參見本文的source code)中遇到元素時,getTitle()返回“Extract the title。圖3中顯示了Firefox中的結果。圖3。 顯示一個文檔的標題注意 當從標簽 中調用TitleExtract時,Firefox要求mayscript屬性需要被給出。否則,由于Firefox的DOM實現依賴于JSObject,Java Plug-in會拋出各種異常。Applet在Firefox session中的持久狀態Java Plug-in 5.0的文檔提到許多有趣的課題。其中之一就是applet的持久性API,它可以讓一個applet保存其狀態以備在后來的相同的web瀏覽器session中使用。State被保存在由Java Plug-in控制的一個內部持久性存儲數據結構中;一個session是指某個web瀏覽器被打開運行開始到這個瀏覽器被關閉結束。在J2SE 1.4中介紹的applet持久性API ,由聲明在接口java.applet.AppletContext中的三個方法構成:· void setStream(String key, InputStream stream) throws IOException 需要當前applet上下文的一個具體key和具體的stream作為參數。如果一個新的stream對應了當前的key,這個新stream將會取代那個舊的stream。如果新stream的size超出了內部size的限制,將會拋出一個異常IOException。· InputStream getStream(String key)返回與當前applet key相聯系的InputStream。如果沒有指向該key的stream就返回null。· Iterator getStreamKeys()返回一個迭代器,它包括了指向當前applet中stream的所有key。通過調用setStream()來保存狀態。這個方法把一個key(它可以方便地標識一個輸入流)和一個InputStream的引用存儲到一個內部數據結構中去,比如一個HashMap。取出某狀態可以通過相應的標識key調用getStream()。它會返回一個InputStream(如果這個key存在)以恢復到這個狀態。因為Java Plug-in5.0文檔沒有提供例子來指出怎樣使用applet持久性API,所以我準備了一個例子。它給出了一個消息傳送applet的兩個實例,其中的一個使用applet持久性API發送消息給另一個。圖4中,用戶在左邊實例的 Message To Send文本框中輸入一個消息,然后點擊該實例的Send按扭。然后用戶點擊右邊實例的Receive按扭,這個消息就會在該實例的Message Received文本框中顯示。圖4 .applet的持久性API使applet之間相互發送消息給對方。點擊“最大化消息發送發生在下面代碼的action listener中。Listing 3. MessageTransfer.java // MessageTransfer.javaimport java.applet.*;import java.awt.*;import java.awt.event.*;import java.io.*;import javax.swing.*;public class MessageTransfer extends JApplet implements ActionListener{ private TextField txtRecvMsg, txtSendMsg; public void init () { // Build the applet's GUI. setLayout (new GridLayout (3, 1)); JPanel pnl = new JPanel (); pnl.setLayout (new FlowLayout (FlowLayout.LEFT)); pnl.add (new JLabel ('Message to send:')); txtSendMsg = new TextField (20); pnl.add (txtSendMsg); getContentPane ().add (pnl); pnl = new JPanel (); pnl.setLayout (new FlowLayout (FlowLayout.LEFT)); pnl.add (new JLabel ('Message received:')); txtRecvMsg = new TextField (20); pnl.add (txtRecvMsg); getContentPane ().add (pnl); pnl = new JPanel (); pnl.setLayout (new FlowLayout (FlowLayout.LEFT)); JButton btnSend = new JButton ('Send'); btnSend.addActionListener (this); pnl.add (btnSend); JButton btnReceive = new JButton ('Receive'); btnReceive.addActionListener (this); pnl.add (btnReceive); getContentPane ().add (pnl); } public void actionPerformed (ActionEvent e) { JButton btn = (JButton) e.getSource (); if (btn.getText ().equals ('Send')) { String text = txtSendMsg.getText (); try { // Output the String object to a byte array output stream. ByteArrayOutputStream baos = new ByteArrayOutputStream (); ObjectOutputStream oos = new ObjectOutputStream (baos); oos.writeObject (text); oos.close (); // Extract the String object from the byte array output stream // as an array of bytes. byte [] data = baos.toByteArray (); // Convert the array of bytes to a byte array input stream. When // the setStream() method is invoked, it caches the input stream // reference and key in the applet persistent store. InputStream is = new ByteArrayInputStream (data); getAppletContext ().setStream ('text', is); } catch (Exception e2) { System.out.println (e2.toString ()); } } else { InputStream is = getAppletContext ().getStream ('text'); if (is != null) try { // Input the cached String object. ObjectInputStream ois = new ObjectInputStream (is); String text = (String) ois.readObject (); txtRecvMsg.setText (text); } catch (Exception e2) { System.out.println (e2.toString ()); } } }} 這個消息發送applet把消息持久化為一個string對象,通過把這個對象序列化到ByteArrayOutputStream,轉化這個stream到一個byte數組,基于這個byte數組構建一個ByteArrayInputStream,然后通過這個stream和一個名為text的key調用方法setStream()。該applet用這個名為text的key調用getStream()取回這個消息,然后反序列化這個InputStream。在Firefox中,被持久化后的消息對在不同窗口或面版上運行的applet都是可以被訪問的。這種消息對不同session(也就是說,Firefox的不同實例)中運行的applet是不能被訪問的,因為每個session只與它自己的Java Plug-in實例和內部持久性存儲數據結構進行通信。提示 出于安全考慮,使用不同codebase的applet不能訪問對方的stream。了解cookieWeb瀏覽器和web服務器經常發送小的數據包給對方進行交互。這些包,也就是大家知道的cookie,可以被用來跟蹤用戶的喜好,幫用戶自動登錄站點等。Java Plug-in結合web 瀏覽器可以讓applet訪問cookie。例如,Java Plug-in讓簽名applet去查看從web服務器發送到web瀏覽器的cookie。Java Plug-in5.0文檔中談及對cookie的支持時,給出了幾個與cookie交互的代碼片段。因為你可能想在applet中測試這些代碼片段,還有就是可能你不確定該怎樣把它們轉變成簽名applet,所以下面我給出了一個用來查看cookie的簽名applet。在討論完這些重要的代碼后,我將帶你學習怎樣建立和簽名applet。最后,我們會在Firefox web瀏覽器中運行這個applet。下面就是代碼。Listing 4. CookieDetect.java// CookieDetect.javaimport java.awt.BorderLayout;import java.awt.event.*;import java.net.*;import java.util.*;import javax.swing.*;public class CookieDetect extends JApplet implements ActionListener{ private JTextArea txtaStatus; private JTextField txtURL; public void init () { // Build the applet's GUI JPanel pnl = new JPanel (); pnl.add (new JLabel ('Enter URL:')); txtURL = new JTextField (20); txtURL.addActionListener (this); pnl.add (txtURL); getContentPane ().add (pnl, BorderLayout.NORTH); txtaStatus = new JTextArea (10, 40); getContentPane ().add (new JScrollPane (txtaStatus)); } public void actionPerformed (ActionEvent e) { try { URL url = new URL (txtURL.getText ()); URLConnection conn = url.openConnection (); conn.connect (); Map headers = conn.getHeaderFields (); List values = headers.get ('Set-Cookie'); if (values == null) { txtaStatus.setText ('No cookies detectedn'); return; } txtaStatus.setText (''); for (Iterator iter = values.iterator (); iter.hasNext();) txtaStatus.setText (txtaStatus.getText () + iter.next () + 'n'); txtaStatus.setText (txtaStatus.getText () + 'n'); } catch (Exception e2) { System.out.println (e2); } }} CookieDetect.java生成的GUI主要由兩個條目構成:一個接受URL的文本框,和一個顯示cookie的文本域。無論何時用戶按下Enter鍵和這個文本框獲得了輸入的光標,文本框的action listener的方法actionPerformed()都會被調用。方法actionPerformed()首先用文本框中的URL建立一個URL對象。然后調用這個對象的openConnection()方法返回一個表示該applet和該URL相互連接的URLConnection對象。繼續往下面看,URLConnection()的方法connect()建立這個連接,它的getHeaderFields()方法可以得到不會改變的一組HTTP頭和相對應的值,Map的方法get()返回與頭Set-Cookie相對應的值組成的List。一個循環列舉出了該List中的值;每個值表示一個cookie,被陸續加入文本區域中。假使CookieDetect.java存放在當前目錄c:appletsCookieDetect中,完成下面的操作,建立和簽名這個查看cookie的applet:· 編譯 CookieDetect.java: javac CookieDetect.java. · 把上步得到的CookieDetect.class替換成一個jar文件,jar cvf CookieDetect.jar CookieDetect.class。· 在一個新keytore中創建一個新key:keytool -genkey -keystore ks -alias me。當彈出來后,輸入testtest作為keystore的密碼,你的姓和名,你所在行業(比如IT),你公司的名字,你所在城市名,所在州或省的名字,你的行業代碼 ,不管你剛才輸入的信息是否真實,當彈出窗口時選擇Yes。當彈出窗口讓你輸入me的密碼 時,單擊Enter。這樣可以讓密碼與keystore 中的密碼(testtest)相同。所有這些信息都被放在文件ks中,這個文件需要我們自己簽名的測試認證。· 創建一個簽名的測試認證:keytool -selfcert -alias me -keystore ks。當被彈出后,輸入testtest作為keystore的密碼。這個認證就被放進ks中了。Alias me (在前一步,這步,和下一步中)提醒你這個認證已被簽名,僅僅用來被測試。換句話說,不要在公共站點上用這個測試認證來發布簽名applet。· 用這個測試認證來簽名這個jar文件:jarsigner -keystore ks CookieDetect.jar me。當彈出后,輸入testtest作為keystore的密碼。這個工具更新該jar文件的META-INF目錄以包含認證信息和CookieDetect.class的一個數字簽名。讓我們運行這個applet。從本文附的代碼中找到CookieDetect.html,然后放進目錄c:appletsCookieDetect下。該HTML文件的中包含一個archive屬性來標識CookieDetect.jar文件。打開Firefox,然后輸入該HTML文件的URL:c:appletsCookieDetectCookieDetect.html。一段時間后,圖5的安全對話框就會出現在你眼前。 Figure 5. 安全對話框讓你有權信任這個簽名的applet。單擊yes鍵響應該安全對話框。然后這個applet被顯示。輸入URL:http://javaworld.com,然后按下回車。如圖6所示,網站JavaWorld 不會發送cookie。 Figure 6. 你不會從 JavaWorld 取得cookie與JavaWorld 相比,網站JavaLobby會發送一個cookie。輸入http://javalobby.org,圖7中就會顯示有這樣一個cookie,id 是SESSIONID。 Figure 7. JavaLobby 發送了一個簡單的cookie一些網站會發送出大量的cookie,比如像kasssamba。如圖8所顯示的,該站點發送了4個cookie到web瀏覽器。 Figure 8. Kasamba 發送了不少的cookie到web瀏覽器我極力建議你繼續去體會cookie的使用,把余下的三段代碼(來源于Java Plug-in 5.0文檔中對cookie支持的標題)也轉換成簽名applet。小竅門 訪問 http://www.cookiecentral.com/faq/ 可以學到更多關于cookie的內容。 理解 hood 許多人在讓Firefox識別Java Plug-in時會遇到困難。說來說去,就是指applet不能運行。通過理解Firefox與Java Plug-in怎樣進行交互,你能避開許多類似的麻煩。在后續部分,我會為你講解Firefox如何探測Java Plug-in,JRE的 NP*.dll 插件文件,和一些被稱為OJI的東西。探測Java Plug-in在前面你已經安裝了一個簡單的JRE(它包含了Java Plug-in),現在要安裝Firefox。你可以運行那個瀏覽器,上網沖浪,打開那些使用了applet的網頁,那些applet就會運行起來了。。不久后,你會思考Firefox是怎樣找到Java Plug-in,讓applet運行起來的。畢竟說來,Firefox只檢索它自己的插件列表來查找插件,而JRE把它自己的Java Plug-in放在它自身的bin目錄下。在這樣的安排下,Firefox怎么可能檢測到Java Plug-in呢?當Firefox開始運行時,它的目錄服務提供器就接到一個任務,在windows平臺上的安裝目錄中去找adobe Acrobat, Apple Quicktime, Microsoft Windows Media Player, 和 Sun Java plug-in。Java Plug-in的安裝目錄一經找到,目錄服務提供器將會傳遞以下信息給plugin.scan.SunJRE:用戶的個人設置名稱和該設置的值(要求的最低JRE版本)。更進一步,security.enable_java 這個用戶設置必須存在,而且它的布爾值必須為true。假如plugin.scan.SunJRE 和 security.enable_java存在,還假設security.enable_java的值是true,目錄服務提供器會在windows的注冊表中列出所有版本號作為HKEY_LOCAL_MACHINESoftwareJavaSoftJava Plug-in的子鍵。最新版本號識別出Firefox所使用的JRE/Java Plug-in,這個版本號必須要比plugin.scan.SunJRE的值要大或相等.版本號子鍵自身的JavaHome子鍵包含了被識別出的JRE根目錄路徑。目錄服務提供器把bin附加在這個目錄后,這時Firefox就知道了Java Plug-in的安裝路徑了。有點糊涂了?我會用一個例子來撥開這一層霧。我的Firefox瀏覽器給出我的plugin.scan.SunJRE值為1.3。它同時也指定security.enable_java值為真。在啟動時,目錄服務提供器掃描我的windows注冊表;相關的設置如下:HKEY_LOCAL_MACHINE Software JavaSoft Java Plug-in 1.5.0 JavaHome 'C:Program FilesJavajre1.5.0'目錄服務提供器列舉出所有版本號的子鍵,在Java Plug-in子鍵下面,那個子鍵所示的最高版本號就大于或等于1.3了。我僅有一個子鍵大于或等于1.3:1.5.0。因此,目錄服務提供器含有子鍵值為1.5.0的JavaHome子鍵—C:Program FilesJavajre1.5.0—然后把bin附加在這個值的后面。這就意味著Firefox會在目錄c:Program FilesJavajre1.5.0bin下去找Java Plug-in。因為Firefox1.0的plugin.scan.SunJRE用戶設置用1.3作為它的默認值,所以Java Plug-in版本低于1.3的不會被識別。這就是為什么Firefox只支持Java Plug-in 1.3.0_01和更高的版本。NP*.dll文件仔細查看你的JRE的 bin目錄,你會發現不少文件名以NP開頭,以.dll結尾的文件。例如,我的平臺下就列出了下面這些文件:NPJava11.dllNPJava12.dllNPJava13.dllNPJava14.dllNPJava32.dllNPJPI150.dllNPOJI610.dll 上面列出的文件是Netscape的插件文件。加上你可能在你的JRE的bin目錄下發現的其他NP*.dll文件,和也應該被列出的若干個jpi*.dll文件,他們一起構成了Java Plug-in。每個NP*.dll文件有相同的大小,因為他們基本上都是做的同樣的事情:它與jpi*.dll文件中的一個協同工作,下載虛擬機,讓java環境運行起來。每一個NP*.dll文件能識別一種或多種MIME(多用途網際郵件擴展協議)類型。當遇到某種MIME類型時,這種類型會告訴Firefox去裝載一個相應的具體NP*.dll文件。例如,思考下面的標簽: 注意type屬性的application/x-java-applet;version=1.1 MIME類型。當Firefox遇到這種MIME類型,它就會選擇相應的NP*.dll文件。因為NPJava11.dll標記了那種MIME類型,NPJava11.dll會去裝載——而不是其他的NP*.dll裝載。NPJava11.dll與jpi*.dl文件一起讓java環境運行。當Firefox遇見標簽時,它到底表示的是哪種MIME類型?我認為當Firefox 遇到 標簽時,application/x-java-vm就是MIME類型:測試顯示出只有擁有那個MIME類型的NPOJI610.dll會去裝載。什么是OJI?你可能已經注意到在NPOJI610.dll中有OJI,想知道這三個字母代表什么。OJI表示Open JVM Integration ,這是個Mozilla project/API,它允許外部的JVM能夠插入一個 Mozilla瀏覽器(就像Firefox這樣)。除了沒有被綁定在內部虛擬機上,這個瀏覽器也沒有被綁定在sun指定的外部虛擬機上——瀏覽器能夠通過其他途徑與虛擬機進行交互,只要這些虛擬機支持OJI。OJI有許多特性,包括允許用戶通過web瀏覽器來顯示java主控臺。OJI也會更改一個applet的生命周期:一旦一個applet網頁被打開,這個applet的init() 和 start()方法就會被調用。為了讓你能看到這個過程,先編譯Listing 5的 LifeCycle.java源代碼,在Firefox下運行這個applet,打開java主空臺,然后不停在網頁之間進行切換。在你每次進入這個applet網頁的時候,你將注意到對這個applet構造器的調用,它表明一個新的LifeCycle對象被生成了。Listing 5. LifeCycle.java // LifeCycle.javapublic class LifeCycle extends java.applet.Applet{ public LifeCycle () { System.out.println ('constructor called'); } public void init () { System.out.println ('init() called'); } public void start () { System.out.println ('start() called'); } public void stop () { System.out.println ('stop() called'); } public void destroy () { System.out.println ('destroy() called'); }} 總結即使講完上面所有的內容,我也僅僅是做了淺層次的講解。其實還有很多東西我想寫下來。可能只有在以后,我再寫另一篇后續文章來完成了。或者你也可以寫那篇文章。不管怎樣,都讓我們繼續拓展我們對Sun的 Java Plug-in技術的理解吧。 關于作者Jeff Friesen 是軟件發展的自由撰稿人,同時也是C, C++, 和 Java技術的研究員。資源列表 · 下載這篇文章中的代碼: http://www.javaworld.com/javaworld/jw-06-2005/plugin/jw-0627-plugin.zip · 瀏覽Java Plug-in 5.0的文檔: http://java.sun.com/j2se/1.5.0/docs/guide/plugin/index.html · 學習Mozilla.org的 nsPluginDirServiceProvider.cpp 目錄服務提供器C++ 寫的代碼 : http://lxr.mozilla.org/mozilla1.7/source/modules/plugin/base/src/nsPluginDirServiceProvider.cpp · 查看 Mozilla.org的 OJI站點 : http://www.mozilla.org/oji/ · 'Plug into Java with Java Plug-in,' Jeff Friesen (JavaWorld, June 1999): http://www.javaworld.com/javaworld/jw-06-1999/jw-06-plugin.html · 查看 Sun的 Java Plug-in 主頁: http://java.sun.com/products/plugin/index.html · Jeff Friesen, 'Talk with Me Java,' (JavaWorld, June 2004): http://www.javaworld.com/javaworld/jw-06-2004/jw-0621-talk.html · 非官方的 Cookie FAQ: http://www.cookiecentral.com/faq/ Java, java, J2SE, j2se, J2EE, j2ee, J2ME, j2me, ejb, ejb3, JBOSS, jboss, spring, hibernate, jdo, struts, webwork, ajax, AJAX, mysql, MySQL, Oracle, Weblogic, Websphere, scjp, scjd 摘要這篇文章與Jeff Friesen前一篇關于Java Plug-in的文章'Plug into Java with Java Plug-in' (JavaWorld, 6月 1999)是一個系列的。它專注于Firefox Web瀏覽器的最近的Java Plug-in其
標簽:
Java
相關文章:
1. react axios 跨域訪問一個或多個域名問題2. vue 項目中當訪問路由不存在的時候默認訪問404頁面操作3. Django media static外部訪問Django中的圖片設置教程4. Django 允許局域網中的機器訪問你的主機操作5. Springboot通過url訪問本地圖片代碼實例6. 關于IDEA使用jsp可以訪問頁面轉換為html彈出頁面為404的問題7. Springboot過濾器禁止ip頻繁訪問功能實現8. Spring boot基于JPA訪問MySQL數據庫的實現9. Java類的訪問權限關鍵字用法說明10. 三步解決python PermissionError: [WinError 5]拒絕訪問的情況
排行榜
