posts - 14,  comments - 37,  trackbacks - 0
          在java開發的早期,重點被放在了客戶端開發。語言中對于applet和安全下載的支持
          對于萬維網(WWW)的發布看上去是個不錯的主意。但是現實是java最大的成功在于服務器端,java的強大功能和適應性贏得了服務器端開發者的心。同時,客戶端的開發落后了。棘手的開發問題限制了applet的效用,開發者被迫轉向基于瀏覽器的瘦客戶端。

          Java Network Launching Protocol (JNLP,java網絡加載協議) 承諾改變這個現狀。通過JCP(Java Community Process)的JSR-56的開發,
          JNLP解決了很多先前用java開發針對客戶端的功能的問題。一個JNLP客戶端是一個應用程序或者說服務,它可以從宿主于網絡的資源中加載應用程序。如果你使用JNLP打包一個應用程序,那么一個JNLP客戶端能夠:

          o 為該應用探測,安裝并且使用正確版本的JRE(java運行時環境)
          o 從瀏覽器或者桌面加載應用程序
          o 當新版本的應用出現時自動下載最新的版本。
          o 為了加速啟動速度在本機緩存應用程序需要的類
          o 可以作為applet或者應用程序運行
          o 在必要的情況下下載原始的庫
          o 以安全的方式使用諸如文件系統這樣的本機資源
          o 自動定位和加載外部依賴資源

          Sun 提供了一個實現JNLP的稱為Java Web Start(JWS)的參考實現。讓我們使用它開發一個使用JFC Swing的簡單應用。為了做這個,你需要從http://java.sun.com/products/javawebstart下載JWS。(譯者注:JDK的新版本JDK1.4已經內置JWS,無須另外下載。)

          下面是應用程序的代碼:

          //File HelloJNLP.java
          import javax.swing.*;
          import java.awt.*;
          import java.awt.event.*;

          public class HelloJNLP extends JFrame {
            public HelloJNLP() {
              super("Hello JNLP");
              String loadedFrom = this.getClass().getClassLoader().toString();
              JLabel jl = new JLabel("loaded by " + loadedFrom);
              JEditorPane jtp = new JEditorPane("text/plain",
                                                            "Edit this text");
              getContentPane().add(jl, BorderLayout.NORTH);
              getContentPane().add(jtp, BorderLayout.CENTER);
            }

            public static void main(String [] args) {
              JFrame f = new HelloJNLP();
              f.setBounds(100,100,325,250);
              f.setDefaultCloseOperation(DISPOSE_ON_CLOSE);
              f.setVisible(true);
              f.addWindowListener(new WindowAdapter() {
                public void windowClosed(WindowEvent e) {
                  System.out.println("Shutting down...");
                  System.exit(0);
                }
              });
            }
          }

          JNLP的核心是一個發布清單(deployment manifest)。它是一個使用.jnlp做
          擴展名的XML文件(JNLP規范簡單的稱之為"JNLP 文件")。要發布HelloJNLP,你需要在JNLP文件中描述它,就像下面這樣:

          <?xml version="1.0" encoding="UTF-8"?>
          <!-- file Hello.jnlp -->
          <jnlp codebase="http://staff.develop.com/halloway/TechTips/May2001"
          href="http://staff.develop.com/halloway/TechTips/May2001/Hello.jnlp">
                  <information>
              <title>Hello</title>
              <vendor>Tech Tips Sample May 2001</vendor>
              <icon href="HelloJNLP.jpg"/>
            </information>
            <resources>
              <j2se version="1.2+"/>
              <jar href="HelloJNLP.jar"/>
            </resources>
            <application-desc main-class="HelloJNLP"/>
          </jnlp>

          這個清單包含客戶端需要下載和使用HelloJNLP的所有信息:

          o jnlp元素的codebase屬性指出搜索應用程序資源的頂級URL。
          o information元素指出一個JNLP用戶接口可以顯示給客戶端的信息。
          o j2se元素指出客戶端必須有1.2版本或者更新的J2SE(tm)。(這是對于applet開發的一個大的提高,因為它常常受限于瀏覽器提供的VM(虛擬機))
          o jar元素指出程序的JAR文件的相對于jnlp codebase位置。
          o application-desc元素指出要運行的類。你可以添加子元素用以指定命令行參數或者系統屬性。

          要將這個應用程序發布給一個web服務器,你需要執行以下的步驟:

          1. 修改jnlp的codebase和hrefURL為你自己的web服務器的合適的URL。
             
          2. 將JNLP文件發布到web服務器。

          3. 編譯并打包HelloJNLP.java并發布到web服務器。例如:
            
             jar cvf HelloJNLP.jar HelloJNLP.class HelloJNLP$1.class
            
          4. 創建一個圖標HelloJNLP.jpg并將之安裝在web服務器上。你可以使用
             http://staff.develop.com/halloway/TechTips/May2001/HelloJNLP.jpg
            
          5. 設置你的web服務器的mime-type關聯:.jnlp映射到mime-type application/x-java-jnlp-file。例如,對于Apache,添加如下一行到mime.types:
            
             application/x-java-jnlp-file jnlp
            
             重新啟動web服務器。

          從客戶端執行那個應用程序,首先確認你已經安裝了JWS。然后簡單的在瀏覽器中指向該jnlp文件。JWS客戶端將下載該jnlp文件,下載必要的資源,加載應用程序。你所看到的將是在一個編輯區中顯示的文本"Edit this text" 。如果你在配置web服務器上有問題或者不能使用web服務器,你可以從
          http://staff.develop.com/halloway/TechTips/May2001/Hello.jnlp
          加載這個程序。

          注意HelloJNLP不是作為一個applet運行在瀏覽器中,而是作為一個獨立的應用程序。

          當你關閉程序時,HelloJNLP使用System.out打印消息"Shutting down...",然而沒有控制臺可見。控制臺是JWS的諸多設置中缺省設置為"off"的其中一個。這是你可以修改的一對設置中的一個值,就像下面這樣:

          1. 編輯JWS安裝目錄中的javaws.cfg文件。添加一行"javaws.cfg.forceUpdate=true"。
          這會導致JWS在啟動應用程序前自動檢查更新的版本。
            
          2. 運行JWS。使用菜單File->Preferences,進入Advanced標簽并且選擇"Show Java Console"。(由于JDK1.4中的本機化,JWS將顯示中文的界面,所以此處的因為被自動顯示為對應的中文)同意,選擇"Log Output"將日志輸出到你選擇的文件。當你在調試時并且需要捕獲System.out和System.err時是非常有用的。

          HelloJNLP顯示一個編輯器,但是編輯器的內容在你關閉程序后將丟失。將下面的代碼添加到HelloJNLP.java會自動的將編輯器的狀態存儲到客戶端的硬盤上:

          //changes to HelloJNLP.java
          import java.io.*;
          import java.net.*;
          import javax.jnlp.*;

            //replace the constructor with this new version:
            JEditorPane jtp;
            public HelloJNLP() {
              super("Hello JNLP, Second Version");
              String loadedFrom = this.getClass().getClassLoader().toString();
              JLabel jl = new JLabel("loaded by " + loadedFrom);
              jtp = new JEditorPane("text/plain", "Edit this text");
              readEditorContents();
              getContentPane().add(jl, BorderLayout.NORTH);
              getContentPane().add(jtp, BorderLayout.CENTER);

              addWindowListener(new WindowAdapter() {
                  public void windowClosed(WindowEvent e) {
                    System.out.println("Shutting down...");
                    try {
                      writeEditorContents();
                    }
                    catch (Exception ex) {
                      System.out.println("Yoinks!");
                      ex.printStackTrace();
                    }
                    System.exit(0);
                  }
                });
            }

            //add these helper methods
            private void writeEditorContents() throws
                          UnavailableServiceException, IOException {
                System.out.println("writeEditorContents");
              PersistenceService ps = (PersistenceService)
                ServiceManager.lookup("javax.jnlp.PersistenceService");
              BasicService bs = (BasicService)
                ServiceManager.lookup("javax.jnlp.BasicService");
              URL baseURL = bs.getCodeBase();
              System.out.println("CodeBase was " + baseURL);
              URL editorURL = new URL(baseURL, "Editor");
              try {
                ps.create(editorURL, 1024);
              }
              catch (Exception e) {
                e.printStackTrace();
              }
              FileContents fc = ps.get(editorURL);
              DataOutputStream os = new DataOutputStream(
                                           fc.getOutputStream(false));
              String s = jtp.getText();
              os.writeUTF(s);
              os.flush();
              os.close();
            }

            private void readEditorContents() {
              try {
                PersistenceService ps = (PersistenceService)
                  ServiceManager.lookup("javax.jnlp.PersistenceService");
                BasicService bs = (BasicService)
                  ServiceManager.lookup("javax.jnlp.BasicService");
                URL baseURL = bs.getCodeBase();
                URL editorURL = new URL(baseURL, "Editor");
                FileContents fc = ps.get(editorURL);
                DataInputStream is = new DataInputStream(fc.getInputStream());
                jtp.setText(is.readUTF());
                is.close();
              }
              catch (Exception e) {
                e.printStackTrace();
              }
            }

          (譯者注:正常編譯需要在CLASSPATH中添加javaws.jar的路徑,在windows下為C:Program FilesJava Web Start目錄下)
          JNLP API定義了一套的服務用以繞過安全沙盒使得一些通常的客戶端操作可以使用。
          在writeEditorContents方法中,BasicService查找應用程序的代碼目錄,然后
          PersistenceService將編輯區的內容緩存在本機硬盤上,這些內容被鍵入到一個和應用程序目錄相對的URL下。 PersistenceService提供的名字/值對數據和瀏覽器的cookies很相似。JWS通過一對被稱為"muffins"的東西實現了這個, muffins不時候用來存儲大數據,他們應該用于在客戶端緩存小的標識符。然后這些標識符能被用于在服務器上定位大的信息。

          在web服務器上重新發布修改過的應用程序,然后試著從客戶端運行它--依然通過URL。如果你沒有web服務器,你可以從
          http://staff.develop.com/halloway/TechTips/May2001/Hello2.jnlp 運行這個新版本。JWS自動探測程序被改變并運行新的版本。你可以通過檢查標題條的字符串來證實這點,它現在將顯示"Hello JNLP,Second Version." 修改編輯區的內容,然后關閉它。當你再次加載該程序時,你的改變會出現。(當你第一次運行新版的程序時你會在控制臺看到一個異常,這是因為readEditorContents 第一次不能找到muffin。)
          (譯者注:實際上第一次運行時出現的異常導致程序無法正常結束,從而使得編輯區的內容無法寫入客戶端,下次運行時也相當于第一次運行。即此程序無法展示文章的特性,可能是于筆者的JWS的版本有關,筆者使用的是最新的1.0.1_02(build b03))
          JNLP提供了比這里演示的更多的服務。例如,你可以:

          o 很好的控制程序如何被下載
          o 描述各個JAR之間的依賴關系
          o 下載并運行本機代碼安裝程序
          o 對簽名的代碼授予附件的權限
          o 請求指定版本的程序或者applet

          要了解更多有關JNLP的情況,請到
          http://java.sun.com/products/javawebstart/download-spec.html
          下載JNLP規范。

          要了解更多JWS的情況,請參考http://java.sun.com/products/javawebstart/
          posted on 2007-07-10 10:32 冰封的愛 閱讀(303) 評論(0)  編輯  收藏 所屬分類: J2EE
          <2025年7月>
          293012345
          6789101112
          13141516171819
          20212223242526
          272829303112
          3456789

          常用鏈接

          留言簿(3)

          隨筆檔案

          文章分類

          文章檔案

          相冊

          搜索

          •  

          最新評論

          閱讀排行榜

          評論排行榜

          主站蜘蛛池模板: 双辽市| 九龙城区| 于田县| 密云县| 巩义市| 邮箱| 嵊泗县| 湄潭县| 广南县| 灵台县| 景宁| 绥化市| 丹东市| 盱眙县| 铅山县| 分宜县| 阿城市| SHOW| 勐海县| 永兴县| 锡林浩特市| 大石桥市| 西城区| 临澧县| 东港市| 峨眉山市| 普兰店市| 荔波县| 灵寿县| 周宁县| 仁怀市| 凤山市| 丰县| 大埔县| 金阳县| 嘉义县| 富锦市| 荥经县| 丰宁| 读书| 青河县|