<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    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 冰封的愛 閱讀(299) 評論(0)  編輯  收藏 所屬分類: J2EE
    <2025年5月>
    27282930123
    45678910
    11121314151617
    18192021222324
    25262728293031
    1234567

    常用鏈接

    留言簿(3)

    隨筆檔案

    文章分類

    文章檔案

    相冊

    搜索

    •  

    最新評論

    閱讀排行榜

    評論排行榜

    主站蜘蛛池模板: 成a人片亚洲日本久久| 在线免费中文字幕| 国产免费拔擦拔擦8x| 日本免费人成黄页在线观看视频| 久久香蕉国产线看观看亚洲片| 国产精品亚洲综合天堂夜夜| 亚洲日本中文字幕一区二区三区| 久久久久久久久久国产精品免费| 亚洲中文字幕无码中文字| 久久久久久A亚洲欧洲AV冫| 131美女爱做免费毛片| 男人扒开添女人下部免费视频| 亚洲精品免费视频| 国产精品免费小视频| 一区二区亚洲精品精华液| 亚洲午夜爱爱香蕉片| 黄页网站在线观看免费高清| 午夜在线免费视频| 久久精品国产精品亚洲人人 | 免费的一级黄色片| a成人毛片免费观看| 亚洲精品V欧洲精品V日韩精品| 国产va免费精品观看精品 | AV片在线观看免费| 亚洲日本va在线视频观看| 日本一区二区三区在线视频观看免费 | 婷婷久久久亚洲欧洲日产国码AV | 成在线人直播免费视频| 亚洲日本人成中文字幕| 亚洲码国产精品高潮在线| 免费高清资源黄网站在线观看 | 久久午夜免费视频| 免费久久人人爽人人爽av| 免费无码专区毛片高潮喷水| 亚洲婷婷第一狠人综合精品| 亚洲日韩图片专区第1页| 国产国拍亚洲精品福利 | 波多野结衣中文一区二区免费| 亚洲免费中文字幕| 人妻免费一区二区三区最新| 亚欧国产一级在线免费|