<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開發(fā)的早期,重點被放在了客戶端開發(fā)。語言中對于applet和安全下載的支持
    對于萬維網(wǎng)(WWW)的發(fā)布看上去是個不錯的主意。但是現(xiàn)實是java最大的成功在于服務器端,java的強大功能和適應性贏得了服務器端開發(fā)者的心。同時,客戶端的開發(fā)落后了。棘手的開發(fā)問題限制了applet的效用,開發(fā)者被迫轉(zhuǎn)向基于瀏覽器的瘦客戶端。

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

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

    Sun 提供了一個實現(xiàn)JNLP的稱為Java Web Start(JWS)的參考實現(xiàn)。讓我們使用它開發(fā)一個使用JFC Swing的簡單應用。為了做這個,你需要從http://java.sun.com/products/javawebstart下載JWS。(譯者注:JDK的新版本JDK1.4已經(jīng)內(nèi)置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的核心是一個發(fā)布清單(deployment manifest)。它是一個使用.jnlp做
    擴展名的XML文件(JNLP規(guī)范簡單的稱之為"JNLP 文件")。要發(fā)布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開發(fā)的一個大的提高,因為它常常受限于瀏覽器提供的VM(虛擬機))
    o jar元素指出程序的JAR文件的相對于jnlp codebase位置。
    o application-desc元素指出要運行的類。你可以添加子元素用以指定命令行參數(shù)或者系統(tǒng)屬性。

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

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

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

    從客戶端執(zhí)行那個應用程序,首先確認你已經(jīng)安裝了JWS。然后簡單的在瀏覽器中指向該jnlp文件。JWS客戶端將下載該jnlp文件,下載必要的資源,加載應用程序。你所看到的將是在一個編輯區(qū)中顯示的文本"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"將日志輸出到你選擇的文件。當你在調(diào)試時并且需要捕獲System.out和System.err時是非常有用的。

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

    //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將編輯區(qū)的內(nèi)容緩存在本機硬盤上,這些內(nèi)容被鍵入到一個和應用程序目錄相對的URL下。 PersistenceService提供的名字/值對數(shù)據(jù)和瀏覽器的cookies很相似。JWS通過一對被稱為"muffins"的東西實現(xiàn)了這個, muffins不時候用來存儲大數(shù)據(jù),他們應該用于在客戶端緩存小的標識符。然后這些標識符能被用于在服務器上定位大的信息。

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

    要了解更多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)

    隨筆檔案

    文章分類

    文章檔案

    相冊

    搜索

    •  

    最新評論

    閱讀排行榜

    評論排行榜

    主站蜘蛛池模板: 日本高清免费中文字幕不卡| 99国产精品永久免费视频| 亚洲国产中文字幕在线观看| 亚洲欧美黑人猛交群| 成年人免费视频观看| 亚洲AV无码一区二区三区网址| 成年女人午夜毛片免费视频| 亚洲色偷偷综合亚洲av78| 国产精品视_精品国产免费 | 亚洲国产日韩精品| 暖暖在线日本免费中文| 国产亚洲男人的天堂在线观看| 国产在线观看免费完整版中文版 | 亚洲精品无码久久不卡| 国产伦精品一区二区免费| 国产日韩亚洲大尺度高清| 91精品免费高清在线| 91亚洲精品自在在线观看| 性生交片免费无码看人| 亚洲日本VA午夜在线电影| 国产无遮挡吃胸膜奶免费看 | 国产亚洲精品美女久久久久| 亚洲一级片免费看| 小日子的在线观看免费| 亚洲av乱码一区二区三区香蕉| 午夜小视频免费观看| 亚洲视频在线免费| 亚洲综合久久成人69| 无码国模国产在线观看免费| 成人国产精品免费视频| 亚洲日韩乱码中文无码蜜桃臀| 免费精品一区二区三区在线观看| 免费精品视频在线| 亚洲国产成人久久| 久久久久亚洲精品无码网址 | 免费无码又爽又刺激聊天APP| 成人免费观看男女羞羞视频| 亚洲黄网站wwwwww| 亚洲А∨精品天堂在线| 91免费在线播放| 成人a毛片视频免费看|