JNLP
( JAVA NETWORK LAUNCHING PROTOCOL)
and
JAVA WEB START TUTORIAL
-----------------------------------
by
R.S.Ramaswamy
(rs.ramaswamy@gmail.com)
--------------------------------------------
These days, we hear so much about RIA (
Rich Internet Applications) and WEB 2.0.
All
these technologies are focused on thin clients with rich gui and
user-interaction as if the user is working in a desktop stand-alone
program.Another assumption is that the user has a browser only and does not
have JDK installed in his system.
If the user does not have JDK in his
system, it is not possible to save specific data to his hard-disk.He can only
save the entire page displayed in the browser.This may not be the best solution
for many corporate desktops.In Intranet environments, each user may be
provided with a browser only and be asked to get/store data only in the server
side files. But, that much of trust is
certainly impossible in Internet. Afterall, we cannot ask a corporate
customer to store all his data in a public server, not his own!
Many
corporate customers fear the insecurity
inherent in the web, especially browser-based applications. While it is
true that ubiquitous access requires that the application is entirely
browser-based, it cannot be the best
solution.Many companies do not use the web-based email system atall
fearing breach of security, loss of data and loss of transcripts for future
reference.Also, a typical requirement is that the user needs to automate the
task by supplying data from his own hard-disk and storing the result too
in his hard-disk. Such things are not possible in the currently popular RIA
technologies be it AJAX, FLEX2 or LASZLO.
If saving the data in user's hard disk is
not required, a simple applet-servlet combination may be the best solution.It
does not need JDK to be present in client's system. The applet is used only for
the gui and the business logic is done
by the servlet. We can use advanced Swing ( library as well as custom
components ) for a powerful gui. The catch here is that it requires a plug-in
for Swing and it takes time to get loaded. Though the delay is present in
Flash-based solutions too, many users object to this.
Ajax
and Ajax-like solutions are therefore being explored by the Java community,as
an alternative.
Howeveer, there is another technology from
SUN, known as JNLP( Java Network Launching Protocol). It has been around for
nearly four years now( since JDK1.4). It is also known as Java Web Start. (
javaws).
Let us assume that a software development
company has its website at 'www.abcxyz.com'.
They
can develop a standalone swing application , much as they would, in the case of
applet and deploy it as a jar file in their webserver. They can then
provide a html file with a link to a jnlp
file, related to the jar file. The user, browsing the web, can click on
this link to download the application. The application gets downloaded to the
user's system and gets executed. It also gets cached in the user's
machine, so that he does not need the
browser anymore to execute the program.
Even
if the server fails later, the user is able to execute the program! This is in contrast to a
servlet which cannot run unless the server is
running. This is a rather stunning revelation, though regrettably, not
very widely-known!
All this assumes that the user is having
JDK and so is meant for the serious corporate user who needs a powerful desktop
application rather than a fancy browser-based application. It is in fact better
than a frame-servlet combination ( by tunnel-method) as the program can work
even if the server is down.
We will now develop a few lessons to
illustarte the exact steps required. In our first example, we are having a very simple demo ( written in jdk1.02
style(!), just to make it simplest.This will enable us to concentrate on the
essentials. Here we have a button and textfield and when the user clicks the
button, a message appears in text1. We should remember to provide an 'exit'
button also.( buttontext.java)
---------------------------------------
//
buttontext.java
import
java.awt.*;
public
class buttontext extends Frame
{
Button button1,button2;
TextField text1;
public static void main(String args[])
{
buttontext
app = new buttontext();
app.resize(600,400);
app.show();
}
buttontext()
{
setLayout(new FlowLayout());
button1 = new Button("click");
text1
= new TextField(20);
button2 = new Button("exit");
add(button1);
add(text1);
add(button2);
setBackground(Color.pink);
button1.setBackground(Color.green);
button2.setBackground(Color.red);
}
public boolean action(Event e, Object o)
{
if(e.target==button1)
{
text1.setText("welcome");
}
if(e.target==button2)
{
System.exit(0); }
return true;
}
}
--------------------------------------------
We
are in c:\
>md
jnlpdemos
>cd
jnlpdemos
set
path=c:\windows\command;d:\jdk1.6\bin
(jdk1.6 has been given in DevIQ CD last month).(
JDK1.5 also is enough).
compile
c:\jnlpdemos\buttontext.java
We
should jar this class file.
>jar
cf buttontext.jar buttontext.class
Let
us copy this jar file to:
c:\tomcat5\webapps\root\jnlpdemos
Now,
we have to create a jnlp file as given below.
--------------------------------------------
// buttontext.jnlp
<?xml
version="1.0" encoding="utf-8"?>
<jnlp
codebase="http://localhost:8080/jnlpdemos/"
href="buttontext.jnlp">
<information>
<title>buttontext</title>
<vendor>rsr</vendor>
<description>trial</description>
<description
kind="short"></description>
<offline-allowed/>
</information>
<resources>
<j2se version="1.6"/>
<jar href="buttontext.jar"/>
</resources>
<application-desc main-class="buttontext"/>
</jnlp>
--------------------------------------------
After creating this jnlp file, we should place
it in :
c:\tomcat5\webapps\root\jnlpdemos'
folder.
The
third step is creating a simple html file which provides a link to the jnlp
file.
-----
//
buttontext.htm
<html>
<body>
click
here
<br>
<a href="buttontext.jnlp">
buttontext </a>
</body>
</html>
-------------
We
should place this file also in:
c:\tomcat5\webapps\root\jnlpdemos'folder.
--
We
are now ready to test our sample.
Start
tomcat5 as follows:
c:\tomcat5\bin>
set
JAVA_HOME=D:\JDK1.6
>startup
---
The
server gets started.
Now
launch the browser and type the URL as:
'http://localhost:8080/jnlpdemos/
buttontext.htm'
---
We
will get the html page with the single link. When we click on that link, we get
the program getting downloaded. We will get a splash screen, 'JAVA STARTING'
(see
splash.doc) and also a brief downlod progress bar and after that we get the
program running. We can close the program, after testing.
--
Now
comes the intersting part. We can shutdown Tomcat5. and then launch the program
from command line from any window after giving path to jdk1.6\bin
>javaws
"http://localhost:8080/
jnlpdemos/buttontext.jnlp"
The
program gets launched quickly from the cache! Thus we are able to run the
program locally without depending on browser or server!
---------
The really important task is saving the data from the program to the
user's hard-disk file. So, to illustrate this aspect, let us write a very
simple text editor orogram as given below.
----
//
editor.java
import
java.awt.*;
import
java.io.*;
import
java.awt.event.*;
public
class editor extends Frame
implements ActionListener
{
MenuBar menubar;
Menu menu1;
MenuItem item1,item2,item3;
TextArea area1;
public static void main(String args[])
{
editor app =
new editor();
app.resize(600,400);
app.show();
}
editor()
{
setLayout(new FlowLayout());
setBackground(Color.pink);
area1 = new TextArea(15,60);
add(area1);
//---
menubar
= new MenuBar();
menu1
= new Menu("file");
item1
= new MenuItem("open");
item2
= new MenuItem("save");
item3
= new MenuItem("exit");
menu1.add(item1);
menu1.add(item2);
menu1.add(item3);
menubar.add(menu1);
setMenuBar(menubar);
item1.addActionListener(this);
item2.addActionListener(this);
item3.addActionListener(this);
}
public void actionPerformed
(ActionEvent e)
{
if(e.getSource()==item1)
{
try
{
FileDialog dlg =new FileDialog
(this,"open",FileDialog.LOAD);
dlg.show();
String
s1 = dlg.getDirectory();
String
s2 = dlg.getFile();
FileInputStream fis =
new FileInputStream(s1+s2);
DataInputStream dis =
new DataInputStream(fis);
String s = dis.readLine();
while(s
!= null)
{
area1.append(s+"\n");
s=dis.readLine();
}
}catch(Exception e1)
{ area1.setText(""+e1);}
}
//------
if(e.getSource()==item2)
{
try
{
FileDialog dlg =new FileDialog
(this,"save",FileDialog.SAVE);
dlg.show();
String
s1 = dlg.getDirectory();
String
s2 = dlg.getFile();
FileOutputStream fos =
new FileOutputStream(s1+s2);
PrintStream ps = new PrintStream(fos);
String s=area1.getText();
ps.println(s);
}catch(Exception e1)
{area1.setText(""+e1);}
}
if(e.getSource()==item3)
{
System.exit(0);
}
}
}
-------------------------------------------
As
before, we compile this using JDK1.6 and then jar the editor.class as editor.jar
Next
we create the jnlp file as given below.( editor.jnlp)
--
<?xml
version="1.0" encoding="utf-8"?>
<jnlp
codebase="http://localhost:8080/jnlpdemos/"
href="editor.jnlp">
<information>
<title>editor</title>
<vendor>rsr</vendor>
<description>trial</description>
<description
kind="short"></description>
<offline-allowed/>
</information>
<security>
<all-permissions/>
</security>
<resources>
<j2se version="1.6"/>
<jar href="editor.jar"/>
</resources>
<application-desc main-class="editor"/>
</jnlp>
--------------------------------------------
We
need to give special attention to the entry regarding security.
JNLP
programs execute within a security sandbox in the client's machine. So,while a
program without this security entry in jnlp file is able to read a local
file, it throws exception when we try to save the content to local file.
It is not enough if we provide this entry.
The developer of the program should sign the jar file.
The
exact steps have been given below.
--
C:\jnlp>keytool
-genkey <-keystore mystore -alias rsr
Enter
keystore password: rsrkey
Re-enter
new password: rsrkey
What
is your first and last name?
[Unknown]:
ram sam
What
is the name of your organizational unit?
[Unknown]:
freelance
What
is the name of your organization?
[Unknown]:
freelance
What
is the name of your City or Locality?
[Unknown]:
mds
What
is the name of your State or Province?
[Unknown]: tn
What
is the two-letter country code for this unit?
[Unknown]:
in
Is
CN=ram sam, OU=freelance, O=freelance, L=mds, ST=tn, C=in correct?
[no]: yes
Enter
key password for <rsr> rsrkey
(RETURN if same as keystore password):
Re-enter
new password: rsrkey
-------------------------------------------
C:\jnlp>jarsigner -keystore mystore editor.jar rsr
Enter
Passphrase for keystore:
rsrkey
Warning:
The
signer certificate will expire within six months.
C:\jnlp>
========================================
The
above steps result in our editor.jar being signed.
As
before we copy the editor.jar, editor.jnlp and editor.htm to :
'c:\tomcat5\webapps\root\jnlpdemos'
folder.
--
Start
the tomcat server.
In
the browser, navigate to :
http://localhost:8080/jnlpdemos/editor.htm'
--
Click
on the link in that html file.
We
get the 'JAVA STARTING' splash screen.
and
also a fleeting downlod progress bar.
This
time a dialog appears. as shown below.
(see
security.doc)
The
user has to trust and click the 'run' button. ( This indeed is objectionable to
many users. But, normally, we will get it certified by a certificate
authority.) . This problem is there for all the companies, afterall!
After
confirmation, the editor program gets launched. Type something in area1 and
save it. We are able to save to local file! We can also open any file in our
local disk.
--
As
before, shutdown the tomcat server and try to run the program without the
server and browser, as you would in a normal standalone program.
how?
We
can give path to jdk1.6 in any convenient window and then at the command
prompt, type
>javaws
"http://localhost:8080/jnlpdemos/editor.jnlp"
As
before, we get the splash screen , a bit quicker now and we are able to work
with our program.
----
The
JNLP method has some very enthusiastic
fans among world-class java programmers.It means a lot for companies which
develop desktop applications in Swing. They can now effortlessly distribute
their desktop applications through the web!
In
closing, a quote from James Hart, a renowned author on JDK is worth noting.
"Java as a GUI and client development platform just keeps
better.The support of complex frameworks like drag-and-drop and Image I/O
help us achieve things that were extremely hazardous before. The
crowning achievement may well be JNLP. By offering a rich user experience,and a
breadth of choice to developers, it could well become an extremely widespread
networked deployment platform for the Internet."
again,
"I would like to
see a really powerful application deploy
across JNLP----something like StarOffice or NetBeans. That would
demonstrate the power ".
( from page-75.
Early Adopter J2SE1.4
by
James Hart
(WROX PRESS).
==========================================