WebStart Swing 论坛客户端

两个月前由于想弄弄swing,给cnjbb论坛做了一个客户端版本。

客户端用swing实现ui界面 ,要求客户端安装webstart来运行此软件。

客户端和服务器端通讯采用xml数据格式进行交互。

客户端把封装好的xml数据通过HTTP协议提交到远程的servlet,远程的servlet根据命令的不同,解析xml字符,然后执行相关的命令。同时返回xml格式的信息。

前几天修改了一下机制,当客户端发送命令的时候,启动2个线程,一个线程在后端向远程发送数据,另一个线程在ui上显示一个等待的窗口,当处理命令的线程结束后,等待窗口关闭。

前段时间有很多朋友向我咨询关于webstart项目的发布,今天做一个整理。

以下文字绝对是原创,不经本人同一请勿转载。
假设你已经做好了自己的swing程序。
比如已经把swing程序大包成zhanglihai.jar
假设您当前使用的系统是Win32系统,并且配置好了java变量,以及安装了WebStart。
一、签字程序
首先把一下代码copy下来,在本地建立一个文件如:createKey.bat

keytool -genkey -keystore myKeystore -alias myself
keytool -selfcert -alias myself -keystore myKeystore 
keytool -list -keystore myKeystore

然后执行createKey.bat文件。如下界面:

按照上面的提示输入,记住你输入的密码,本例子中的密码是12345678。

执行完,dos窗口会自动关闭,在与createKey的同一目录下生成一个文件:myKeystore

copy此文件到zhanglihai.jar目录下,然后copy以下内容建立一个文件如:signjar.bat

jarsigner -keystore myKeystore zhanglihai.jar myself

到此为止签字的准备工作已经完成。

二、为jar包进行签字

如果您的swing工程中引入了其他的jar包,应该先把引用的所有jar包解开,然后按照java的package规范整理出一个目录。
然后把zhanglihai.jar也接开,严格按照java的package规范把以上两个class文件以及目录合并在一起,然后重新打包。
我通常是这样做的,把工程所引用的所有jar包解开,按照java的package规发整理好,放到一个目录下。然后用winrar打开
zhanglihai.rar然后把目标文件导入进入。然后保存退出。如下图(我导入的是jdom包,其实没有用的class都可以不导入进去以便减少jar的Size)。

如果先对zhanglihi.rar签字然后再导入所需要的jar就等于破坏了签字,我曾经尝试过用jb把所需要的jar包和我自己的程序打成一个
jar包,但是签字也失败。后来我就采用winrar的方法来处理。

接下来是对新的jar包签字了,执行signjar.bat,输入密码,本例子中的密码是 12345678。
到此jar的签字结束。

三、工程的部署

WebStar工程要求有服务器端支持JNLP配置,一般的servlet引擎都支持这种类型。如果不支持,你可以在你的web.xml里面加入如下代码.

   <mime-mapping>
        <extension>class</extension>
        <mime-type>application/java</mime-type>
    </mime-mapping>    
    <mime-mapping>
        <extension>jar</extension>
        <mime-type>application/java-archive</mime-type>
    </mime-mapping>
    <mime-mapping>
        <extension>jnlp</extension>
        <mime-type>application/x-java-jnlp-file</mime-type>
    </mime-mapping>

然后我们建立jnlp文件如:zhanglihai.jnlp
如下代码:

 
<?xml version="1.0" encoding="utf-8"?> 
<!-- JNLP File for SwingSet2 Demo Application --> 
<!--
codebase:是以下文件的一个根URL,所有的文件都是从这个路径算起的。
以下文件中还有几个是webstart启动时候的图标以及工程标题,工程描述
-->
<jnlp 
  spec="1.0+" 
  codebase="http://localhost:9090/cnjbb/swing"  href="zhanglihai.jnlp"> 
  <information> 
    <title>CnJBB论坛桌面应用程序 </title> 
    <vendor>ZhangLiHai.Com</vendor> 
   <description>CnJBB论坛桌面应用程序</description> 
    <description kind="short">CnJBB论坛桌面应用程序</description> 
    <icon href="cnjbbicon.gif"/>
    <icon kind="splash" href="cnjbbicon.gif"/> 
    <offline-allowed/> 
  </information> 
  <security> 
      <all-permissions/> 
  </security> 
  <resources> 
    <j2se version="1.4+" href="http://localhost:9090/cnjbb/swing"/>
    <j2se version="1.4+"/>
    <jar href="zhanglihai.jar" main="true" />
  </resources> 
  <!--
  jar包中main函数的类全路径名
  -->
  <application-desc main-class="org.cnjbb.client.WebDesktop"/>
  <!--
    <applet-desc 
      documentBase="http://localhost:9090/cnjbb/swing/" 
      name="WebDesktop" 
      main-class="org.cnjbb.client.WebDesktop" 
      width="600" 
      height="500"> 
   </applet-desc> 
   -->
</jnlp>

然后建立一个index.html文件如下:

<html>
 <head>
 <SCRIPT LANGUAGE="JavaScript"> 
          var javawsInstalled = 0; 
          isIE = "false";
 
          if (navigator.mimeTypes && navigator.mimeTypes.length) { 
             x = navigator.mimeTypes['application/x-java-jnlp-file']; 
             if (x) javawsInstalled = 1; 
          } else { 
             isIE = "true"; 
          } 
          function insertLink(url, name) { 
          if (javawsInstalled || navigator.family == 'gecko') { 
                document.write("<a href=" + url + ">"  + name + "</a>"); 
             } else { 
               document.write("<a href=http://dlres.java.sun.com/PluginBrowserCheck?pass=http://www.cnjbb.org/swing/index.html&fail=http://java.sun.com/cgi-bin/javawebstart-platform.sh>点这里下在并且安装WebStart</a> ");
             } 
          } 
      </SCRIPT> 
      <SCRIPT LANGUAGE="VBScript"> 
          on error resume next 
          If isIE = "true" Then 
            If Not(IsObject(CreateObject("JavaWebStart.IsInstalled"))) Then 
                  javawsInstalled = 0 
            Else 
                  javawsInstalled = 1 
            End If 
          End If 
      </SCRIPT> 
  </head>
  <body >
  <h1>欢迎使用CnJBB论坛客户端版本,如果您的机器上没有安装webstart请点下面的连接下在并安装!</h1>
    <SCRIPT LANGUAGE="Javascript"> 
        <!-- 
        insertLink("zhanglihai.jnlp","CnJBB Swing DownLoad"); 
        // --> 
    </SCRIPT> 
  </body>
  </html>

这段脚本会自动检测机器上是否安装webstar,如果没有安装就提示安装。

启动Servlet引擎,至此webstart工程发布完毕。

询问是否启动,情选择“是”。图中的例子是我用ZhangLiHai做的签字,因为本地程序的原因,我调用远程的程序测试的。

预览地址:http://www.cnjbb.org/swing/

分享到: 更多