前言:
關(guān)于 JWS
JWS 是作為 JSR-56 的一部分而創(chuàng )建的,目的是提供一種方法來(lái)分發(fā)在客戶(hù)端上的 JVM 中運行的 Java 應用程序。JWS 包括以下特征:
部署
運行 JWS 應用程序包括選擇 HTML 鏈接,與打開(kāi)新的頁(yè)面沒(méi)有什么區別,惟一的不同之處在于 Web 服務(wù)器頁(yè)面是 .jnlp 文件,該文件啟動(dòng) JWS 插件來(lái)在客戶(hù)端上本地下載和執行應用程序。
緩存
一旦應用程序下載完畢,就可以把它緩存在客戶(hù)端電腦上。每當應用程序重新啟動(dòng)時(shí),JWS 就檢查服務(wù)器,查看是否有更新的版本要下載。如果沒(méi)有,就運行本地的版本,從而避免再次下載。如果存在一個(gè)新的版本,就自動(dòng)檢索新的版本,因此管理員從來(lái)就不必擔心舊的客戶(hù)端連接到已更新的服務(wù)器程序 API 上。
獨立于瀏覽器 JRE
JWS 允許您精確地指定您想在什么客戶(hù)端 JRE 級別中運行它(獨立于瀏覽器是如何配置的)。這一特征避免了 Applet 標記和瀏覽器 JRE 級別的問(wèn)題(比如用 Microsoft Internet Explorer)。與 Applet 標記共享單一的用于瀏覽器的 JVM 實(shí)例不同,每個(gè) JWS 應用程序都有自己獨立的 JVM,并通過(guò)它自己的 main(String[] args) 方法啟動(dòng)。
安全性驗證
Java 安全性模型用于驗證 JWS 應用程序的來(lái)源并限制對易受攻擊的系統服務(wù)(比如 I/O 和通信)的訪(fǎng)問(wèn)。 必須通過(guò)認證已簽署的 JAR 文件來(lái)授予每個(gè) JWS 程序顯式訪(fǎng)問(wèn)這些服務(wù)的權限。
桌面集成
一旦 JWS 應用程序從 .jnlp 文件下載完畢,就可以把它集成在桌面上作為獨立的圖標。這樣該應用程序就可以重新啟動(dòng)而不用通過(guò) Web 瀏覽器。
如果您有 JRE 1.4.1 或更新的版本,那么您已經(jīng)安裝了 Java Web Start 。如果您沒(méi)有 JRE 1.4.1 或更新的版本,可以從 Sun 下載頁(yè)面下載并安裝 JRE。
與介紹 GUI 編程的新方法的文章的傳統一樣,第一步是創(chuàng )建 Web 啟動(dòng)應用程序,它顯示帶有“Hello World”的對話(huà)框:這分兩步進(jìn)行:首先創(chuàng )建類(lèi)并將其部署在 Web 服務(wù)器中,接著(zhù)客戶(hù)端個(gè)人計算機訪(fǎng)問(wèn)該 URL,這樣就可以通過(guò) JWS 下載和調用它。
Sun 提供了一個(gè)實(shí)現JNLP的稱(chēng)為Java Web Start(JWS)的參考實(shí)現。讓我們使用它開(kāi)發(fā)一個(gè)使用JFC Swing的簡(jiǎn)單應用。為了做這個(gè),你需要從http://java.sun.com/products/javawebstart下載JWS。(譯者注:JDK的新版本JDK1.4已經(jīng)內置JWS,無(wú)須另外下載。)
操作步驟:
一.一般的應用發(fā)布
1)創(chuàng )建要發(fā)布的應用程序;
創(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 個(gè)文件 9,845 字節
2 個(gè)目錄 3,277,553,664 可用字節
D:\eclipse\workspace\jnlp\bin>jar cvf HelloJNLP.jar *.class
標明清單(manifest)
增加:HelloJNLP$1.class(讀入= 651) (寫(xiě)出= 422)(壓縮了 35%)
增加:HelloJNLP.class(讀入= 1889) (寫(xiě)出= 1079)(壓縮了 42%)
3)發(fā)表應用到web server上
將生成的HelloJNLP.jar 文件copy到Tomcat的webapp目錄之下.
4)創(chuàng )建.jnlp文件;
使用文本編輯器來(lá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頁(yè)面
保存為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)啟動(dòng)java web start

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

二.有訪(fǎng)問(wèn)外部資源的應用發(fā)布

安全性:
一些 JWS 應用程序可能希望訪(fǎng)問(wèn)客戶(hù)端個(gè)人計算機上的服務(wù),比如 用于讀取和寫(xiě)入文件或打開(kāi)套接字
并進(jìn)行連接的 IO。為了安全性的目的,您不想惡意程序無(wú)限制地訪(fǎng)問(wèn)您的個(gè)人計算機上的這些工具,為此,
JWS 使用 Java 安全性模型和 JAR 文件認證。在缺省情況下,JWS 虛擬機是一個(gè)受限的沙箱(Sandbox),
它拒絕對這些服務(wù)的訪(fǎng)問(wèn)。如果您試圖超出安全性管理器的許可,比如執行一些文件 IO ,就會(huì )產(chǎn)生一個(gè)異常。
操作的步驟:
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/><!--加入安全權限-->
</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 應用程序放在完整的產(chǎn)品中,也還是推薦您從像 Thawte 或 VeriSign 這樣的結構獲得認證。
D:\eclipse\workspace\jnlp\bin>keytool -genkey -alias helloAlias -keypass wsddjws
-keystore joestore -storepass richjavaclient
您的名字與姓氏是什么?
[Unknown]: Jackey
您的組織單位名稱(chēng)是什么?
[Unknown]: wbx
您的組織名稱(chēng)是什么?
[Unknown]: china
您所在的城市或區域名稱(chēng)是什么?
[Unknown]: hz
您所在的州或省份名稱(chēng)是什么?
[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ā)布新的應用
copy index.html 和 sHelloJNLP.jnlp文件我Tomcat下面.
運行的情況如圖.


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


