前言:
關(guān)于 JWS
JWS 是作為 JSR-56 的一部分而創(chuàng)建的,目的是提供一種方法來分發(fā)在客戶端上的 JVM 中運行的 Java 應(yīng)用程序。JWS 包括以下特征:
部署
運行 JWS 應(yīng)用程序包括選擇 HTML 鏈接,與打開新的頁面沒有什么區(qū)別,惟一的不同之處在于 Web 服務(wù)器頁面是 .jnlp 文件,該文件啟動 JWS 插件來在客戶端上本地下載和執(zhí)行應(yīng)用程序。
緩存
一旦應(yīng)用程序下載完畢,就可以把它緩存在客戶端電腦上。每當(dāng)應(yīng)用程序重新啟動時,JWS 就檢查服務(wù)器,查看是否有更新的版本要下載。如果沒有,就運行本地的版本,從而避免再次下載。如果存在一個新的版本,就自動檢索新的版本,因此管理員從來就不必?fù)?dān)心舊的客戶端連接到已更新的服務(wù)器程序 API 上。
獨立于瀏覽器 JRE
JWS 允許您精確地指定您想在什么客戶端 JRE 級別中運行它(獨立于瀏覽器是如何配置的)。這一特征避免了 Applet 標(biāo)記和瀏覽器 JRE 級別的問題(比如用 Microsoft Internet Explorer)。與 Applet 標(biāo)記共享單一的用于瀏覽器的 JVM 實例不同,每個 JWS 應(yīng)用程序都有自己獨立的 JVM,并通過它自己的 main(String[] args) 方法啟動。
安全性驗證
Java 安全性模型用于驗證 JWS 應(yīng)用程序的來源并限制對易受攻擊的系統(tǒng)服務(wù)(比如 I/O 和通信)的訪問。 必須通過認(rèn)證已簽署的 JAR 文件來授予每個 JWS 程序顯式訪問這些服務(wù)的權(quán)限。
桌面集成
一旦 JWS 應(yīng)用程序從 .jnlp 文件下載完畢,就可以把它集成在桌面上作為獨立的圖標(biāo)。這樣該應(yīng)用程序就可以重新啟動而不用通過 Web 瀏覽器。
如果您有 JRE 1.4.1 或更新的版本,那么您已經(jīng)安裝了 Java Web Start 。如果您沒有 JRE 1.4.1 或更新的版本,可以從 Sun 下載頁面下載并安裝 JRE。
與介紹 GUI 編程的新方法的文章的傳統(tǒng)一樣,第一步是創(chuàng)建 Web 啟動應(yīng)用程序,它顯示帶有“Hello World”的對話框:這分兩步進(jìn)行:首先創(chuàng)建類并將其部署在 Web 服務(wù)器中,接著客戶端個人計算機(jī)訪問該 URL,這樣就可以通過 JWS 下載和調(diào)用它。
Sun 提供了一個實現(xiàn)JNLP的稱為Java Web Start(JWS)的參考實現(xiàn)。讓我們使用它開發(fā)一個使用JFC Swing的簡單應(yīng)用。為了做這個,你需要從http://java.sun.com/products/javawebstart下載JWS。(譯者注:JDK的新版本JDK1.4已經(jīng)內(nèi)置JWS,無須另外下載。)
操作步驟:
一.一般的應(yīng)用發(fā)布
1)創(chuàng)建要發(fā)布的應(yīng)用程序;
創(chuàng)建例子文件HelloJNLP.java 文件
//------------------------------------------------------
/*
* Created on 2004-11-10
*
* TODO To change the template for this generated file go to
* Window - Preferences - Java - Code Style - Code Templates
*/
/**
* @author Jackey
*
* TODO To change the template for this generated type comment go to Window -
* Preferences - Java - Code Style - Code Templates
*/
//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 ");
try {
jtp.setPage("http://127.0.0.1:8080/");
} catch (Exception e) {
// TODO: handle exception
System.err.println("Error: "+e.getMessage() );
}
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);
}
});
}
}
//------------------------------------------------------
2)編譯和打包成.jar文件;
d:>javac HelloJNLP.java
D:\eclipse\workspace\jnlp\bin 的目錄
2004-11-10 09:49 <DIR> .
2004-11-10 09:49 <DIR> ..
2004-11-10 14:49 1,889 HelloJNLP.class
2004-11-10 14:49 651 HelloJNLP$1.class
2004-11-10 12:57 2,091 HelloJNLP.jar
2004-11-10 10:32 422 HelloJNLP.jnlp
2004-11-10 13:53 178 index.html
2004-11-10 14:45 1,211 joestore
2004-11-10 14:46 3,403 sHelloJNLP.jar
7 個文件 9,845 字節(jié)
2 個目錄 3,277,553,664 可用字節(jié)
D:\eclipse\workspace\jnlp\bin>jar cvf HelloJNLP.jar *.class
標(biāo)明清單(manifest)
增加:HelloJNLP$1.class(讀入= 651) (寫出= 422)(壓縮了 35%)
增加:HelloJNLP.class(讀入= 1889) (寫出= 1079)(壓縮了 42%)
3)發(fā)表應(yīng)用到web server上
將生成的HelloJNLP.jar 文件copy到Tomcat的webapp目錄之下.
4)創(chuàng)建.jnlp文件;
使用文本編輯器來編輯一下內(nèi)容.保存HelloJNLP.jnlp文件
<?xml version="1.0" encoding="UTF-8"?>
<!-- file Hello.jnlp -->
<jnlp codebase="http://127.0.0.1:8080/" href="HelloJNLP.jnlp">
<information>
<title>Hello jackey</title>
<vendor>jackey jiao Sample May 2004</vendor>
<icon href="photo1.JPG"/>
</information>
<resources>
<j2se version="1.2+"/>
<jar href="sHelloJNLP.jar"/>
</resources>
<application-desc main-class="HelloJNLP"/>
</jnlp>
5)編輯html頁面
保存為index.html文件.
<!doctype html public "-//W3C//DTD HTML 4.0 Transitional//EN">
<html>
<head>
<title> New Document </title>
<meta name="Generator" content="EditPlus">
<meta name="Author" content="">
<meta name="Keywords" content="">
<meta name="Description" content="">
</head>
<body>
<ul>
<li><a href="HelloJNLP.jnlp">HelloJNLP</a>
<li><a href="ShowDSB.jnlp">ShowDSB</a>
</ul>
</body>
</html>
6)啟動java web start

在java web start 應(yīng)用程序管理器的地址里輸入我們的web applicatoin 發(fā)布的地址
http://127.0.0.1:8080/index.html
運行成功!

二.有訪問外部資源的應(yīng)用發(fā)布

安全性:
一些 JWS 應(yīng)用程序可能希望訪問客戶端個人計算機(jī)上的服務(wù),比如 用于讀取和寫入文件或打開套接字
并進(jìn)行連接的 IO。為了安全性的目的,您不想惡意程序無限制地訪問您的個人計算機(jī)上的這些工具,為此,
JWS 使用 Java 安全性模型和 JAR 文件認(rèn)證。在缺省情況下,JWS 虛擬機(jī)是一個受限的沙箱(Sandbox),
它拒絕對這些服務(wù)的訪問。如果您試圖超出安全性管理器的許可,比如執(zhí)行一些文件 IO ,就會產(chǎn)生一個異常。
操作的步驟:
1)修改.jnlp文件
<?xml version="1.0" encoding="UTF-8"?>
<!-- file Hello.jnlp -->
<jnlp codebase=" <information>
<title>Hello jackey</title>
<vendor>jackey jiao Sample May 2004</vendor>
<icon href="photo1.JPG"/>
</information>
<security>
<all-permissions/><!--加入安全權(quán)限-->
</security>
<resources>
<j2se version="1.2+"/>
<jar href="sHelloJNLP.jar"/><!--修改此處-->
</resources>
<application-desc main-class="HelloJNLP"/>
</jnlp>
2)創(chuàng)建簽署的.jar文件
為了簽署 JAR 文件,您可以使用 JDK 附帶的 keytool 命令,即使您將把您的
JWS 應(yīng)用程序放在完整的產(chǎn)品中,也還是推薦您從像 Thawte 或 VeriSign 這樣的結(jié)構(gòu)獲得認(rèn)證。
D:\eclipse\workspace\jnlp\bin>keytool -genkey -alias helloAlias -keypass wsddjws
-keystore joestore -storepass richjavaclient
您的名字與姓氏是什么?
[Unknown]: Jackey
您的組織單位名稱是什么?
[Unknown]: wbx
您的組織名稱是什么?
[Unknown]: china
您所在的城市或區(qū)域名稱是什么?
[Unknown]: hz
您所在的州或省份名稱是什么?
[Unknown]: zj
該單位的兩字母國家代碼是什么
[Unknown]: cn
CN=Jackey, OU=wbx, O=china, L=hz, ST=zj, C=cn 正確嗎?
[否]: y
D:\eclipse\workspace\jnlp\bin>
D:\eclipse\workspace\jnlp\bin>jarsigner -keystore joestore -signedjar sHelloJNL
P.jar HelloJNLP.jar helloAlias
Enter Passphrase for keystore: richjavaclient
Enter key password for helloAlias: wsddjws
D:\eclipse\workspace\jnlp\bin>
3)發(fā)布新的應(yīng)用
copy index.html 和 sHelloJNLP.jnlp文件我Tomcat下面.
運行的情況如圖.


結(jié)束語
本文展示了可以如何使用 Java Web Start 來分發(fā) WebSphere 中豐富的 Java 應(yīng)用程序,以便它們運行在客戶端個人計算機(jī)上。通過使用 .jnlp 文件來指定關(guān)于應(yīng)用程序的信息可以做到這一點。本文還展示了如何在客戶端個人計算機(jī)上緩存這些應(yīng)用程序以及可以如何以桌面快捷方式的形式安裝它們。當(dāng)應(yīng)用程序需要更新時,它是在服務(wù)器上的一個單獨的位置進(jìn)行更改的,因而所有的客戶端都可以根據(jù) .jnlp 文件的日期和時間戳在它們下一次連接時獲取新的副本。另外,本文展示了可以如何用 JnlpDownloadServet 來軟復(fù)制 jnlp 文件的代碼庫以及如何提供顯式的日期和時間戳,從而允許 .jnlp 文件在分布式環(huán)境中的 WebSphere 的多個副本之間復(fù)制,而同時作為單個程序定義出現(xiàn)在客戶端中。我們希望您會發(fā)現(xiàn) JWS 是一種強(qiáng)大而靈活的管理豐富的實際 Java 客戶端應(yīng)用程序的工具.
Trackback: http://tb.blog.csdn.net/TrackBack.aspx?PostId=175896