August 2004
Hello World Rich Internet Application (RiA) Recipe
Background
This spring I completed a Friendster like site for Ziff-Davis to host 5 gaming
magazines and 10 million members. Their old site was based on ASP and did not
have Friendster like capabilities. (In between gigs, Google contacted me about
a job but it did not pan out). Then I find out that Friendster's implementation
of Java was poor and they switched to PHP, a bit of a black eye for the Java community
that was discussed on TheServerSide.com. (Too bad they did not subcontract someone
with production Java experience to help recover, not everyone “knows”
Java hand on, some “know of” Java from books. This is why the Java community
is sometimes perceived as “academic crap” )
Around this time, I began to realize that 80's technology such as HTML will
go the way of the VT-100, as more and more people have broadband and larger
screens, they want an MTV like experience. That's right, it makes no sense now
to develop any HTML application that will be deployed in '05 and operated into
'06. People are starting to expect rich content, such as http://january.rr.com/flash
. HTML is legacy to me. Let's see.
I even held a seminar, where we talked about RiA, Rich Internet Applications
(http://jroller.com/page/jcarreira/20040403
)
I also spent time writing Flex (by Neville), such as:
<mx:DataGrid id="dg" dataProvider="{empD}"
initialize="initSO()"
cellPress="openDetail(dg.selectedItem.lname)"
/>
<mx:RemoteObject id="empSO" source="com.bPe.play.empDAO"
result="empD=event.result" />
<mx:Script> <![CDATA[
var empD;
function initSO() {
empSO.populate(); }
function openDetail( o ) {
ldr.load(); }
</mx:Script>
<mx:Loader id="ldr" source="zoom.mxml.swf" autoLoad="false" />
This code creates a datagrid, loads it via a service object called empSO and
on the cellPress event, opens a popup of the details for that row. The datagrid
can sort on the client which is one of the features that makes this an RiA app.
I found Flex slow to render for non-trivial forms, therefore not a good enough
candidate for RiA.
Overview
Java Desktop (by Davidson) (JDNC) is one example of an Open Source RiA toolkit,
but ... we are jumping ahead.
RiA applications get deployed via the Internet and execute on the user's desktop
and provide a rich media experience. One example of a futuristic killer app
is iTunes.
Grid sorting and rendering executes on the client, not the server. Also, the
UI is not sent back and forth to the server with each request, only data is
sent.
Ok, back to Java Desktop. Java Desktop is sponsored by Sun, and it's open source
under LGPL (so Sun is slowly open sourcing Java). Please do not confuse this
with poor old Swing. You might say, “What does Java Desktop have to do
with the server side?”. Unlike Client/Server, there is no DLL hell and
upgrades of the application are cheap and effective. What makes it superior
to MS technologies is Network Launcher (JNLP – aka WebStart, the annoying
icon that gets installed when you install the JDK). It's so easy to install, upgrade
and deploy, that in no time at all your desktop could be filled with little
Network Launcher icons (and dare I say, Java would then own the desktop, right?).
So the Java Desktop is great – it can be deployed, managed and upgraded by
a remote network server.
The other thing about iTunes is that the software is free. Users now expect
software to be free. Thanks to Apache, Firebird, OpenOffice and the like, the
precedent has been set. And while it's becoming increasingly difficult to charge
for software, one can charge for usage (per transaction, per month, etc.) so
monitoring the RiA/SoA applications becomes key. Not only monitoring for security
and performance, but also for money. As developers become operators of applications,
new fortunes will be made.
Take for example SalesForce.com. It provides a CRM service for its customers
but rather than a big upfront price tag, users are charged by the month. The
software itself is free. The way software is sold today is akin to the way factories
produced electricity in the days before there were electric utilities. Factories
had their own electric generators such as a water wheel. These days of course,
factories don't generate their own electricity; they buy what they need from
the electric company.
From a business point of view, applications will soon become a utility just
like electricity. They'll be offered on a pay-as-you-go basis, with RiA basically
installed on demand, and disposable like a box of tissues.
Hello World
So since I found Flex too slow, let's do a hello world using Java Desktop (JDNC),
notice I used JXFrame (Java Desktop), not JFrame (Swing):
JXFrame frame = new JXFrame("RIA");
JPanel tabCms = new JPanel(new BorderLayout());
JButton butCms = new JButton("Populate CMS");
_gridCms = new JNTable();
tabCms.add(_gridCms);
tabCms.add(butCms, BorderLayout.NORTH);
JTabbedPane tab = new JTabbedPane();
tab.add("Cms", tabCms);
frame.getContentPane().add(tab);
//events
butCms.addActionListener(this); //onClick
display(frame); // standard pack and show
}
public void actionPerformed(ActionEvent arg0) { //onClickExec
DefaultTableModel model = new DefaultTableModel(10, 6);
_gridCms.setHasColumnControl(true);
_gridCms.setModel(model);
}
Your Table could be more complex. You could for example use Google's API to
show something more interesting. Take a look at the JavaDoc for JavaDesktop
to do more.
This can run in an IDE for testing. For real development you can use http://www.caucho.com/burlap
(by Ferguson) to send messages or even SOAP (warped Doc/Lit for cross platform
middleware). And you can use JGoodies (by Lentzsch ) for more advanced use.
I found Spring is getting a bit more complicated and could be simplified. For
example, it's more effective to use collections, the writing of getters and
setters in lots of cases and be more loosely coupled.
For people that are learning Java, they can use something like this:
http://www.computersinmotion.com/cgi-bin/homeframeload.pl?formname=products
To deploy it on the server ... well there is a client piece we have to build,
and a WAR, and I do it using Ant like this:
<project name="hello" default="war" basedir="..">
<target name="war" depends="helloria" >
<path id="classpath">
<pathelement location="hellosoa/misc/servlet-api.jar"/>
<pathelement location="hellosoa/web/WEB-INF/lib/commons-beanutils.jar"/>
<pathelement location="hellosoa/web/WEB-INF/lib/commons-chain.jar"/>
<pathelement location="hellosoa/web/WEB-INF/lib/commons-collections.jar"/>
<pathelement location="hellosoa/web/WEB-INF/lib/commons-digester.jar"/>
<pathelement location="hellosoa/web/WEB-INF/lib/commons-logging.jar"/>
<pathelement location="hellosoa/web/WEB-INF/lib/log4j.jar"/>
</path>
<javac srcdir= "hellosoa/src"
destdir="hellosoa/web/WEB-INF/classes"
/>
<war destfile = "helloria.war"
basedir="hellosoa/web"
webxml="hellosoa/web/WEB-INF/web.xml"
/>
</target>
<target name="helloria">
<path id="classpath">
<pathelement location="hellosoa/web/ria/jdnc.jar"/>
<pathelement location="hellosoa/web/ria/jgoodies_forms.jar"/>
</path>
<javac srcdir= "helloria/src"
destdir="helloria/classes"
/>
<jar destfile = "hellosoa/web/ria/riarun.jar"
basedir="helloria/classes"
/>
</target>
</project>
The task above makes a JAR, and puts the client JAR in the WAR. For real development,
I run commons-chains (by McClanahan; instead of IoC) on the server to send out
DAO responses and go through a management layer.
Intranet users
A user would just surf to the WAR, and this index.jsp would “fire”:
<%@ page contentType="application/x-java-jnlp-file" %>
<%
StringBuffer codebaseBuffer = new StringBuffer();
codebaseBuffer.append("http://");
codebaseBuffer.append(request.getServerName());
codebaseBuffer.append(':');
codebaseBuffer.append(request.getServerPort());
codebaseBuffer.append(request.getContextPath());
%>
<?xml version="1.0" encoding="UTF-8"?>
<jnlp codebase="<%=codebaseBuffer.toString()%>" href="index.jsp">
<information>
<title>RiA-SoA</title>
<vendor>Vic</vendor>
<icon href="ria/splash.jpg"/>
<icon kind="splash" href="ria/splash.jpg" />
</information>
<resources>
<j2se version ="1.4.2+" />
<jar href="ria/riarun.jar"/>
<jar href="ria/jdnc.jar"/>
<jar href="ria/jgoodies_forms.jar"/>
<property name="srvc" value="<%=codebaseBuffer.toString()+"/soasrv"%>" />
</resources>
<application-desc main-class="com.bp.ria.Start"/>
</jnlp>
The reason I say Internet users is that while the “new” Sun has
open source the Java Desktop, the “old” Sun is keeping Network Launcher
proprietary and buggy.
(Ex: http://sourceforge.net/mailarchive/forum.php?thread_id=5034226&forum_id=8428
or
http://forum.java.sun.com/thread.jsp?forum=38&thread=372291&start=15&range=15&hilite=false&q=
)
Unfortunately, IBM is driving behind Sun, and not getting into the passing
lane to fix the issues and give people an alternative. Sun may not have the
resources anymore. Open source does not wait, and there are several Network
Launchers. I use netx.jar for Network Launcher like this:
java -jar netx.jar -jnlp http://host/webappfolder
People that have distaste for open source should not use this on the extra
net. You can read more on: http://www.vamphq.com/jwsfaq.html
(by Bauer). The Sun Network Launcher does need to improve the requirements (
sandbox security is too restrictive)
Getting Started with the IDE
If you have a working environment that you are happy with, then you can just
type in the code I showed. And if you don't... What I started doing is zipping
up an environment and just unzipping a working one whenever I need it. The zipped
folder includes everything I need, even the JDK.
You can download a working environment with the above source, but it is 300MB
download from sf.net. Just go to
- http://sourceforge.net/project/showfiles.php?group_id=105547
- download and unzip to c:\
- Unistall all the Java from your machine. In inst there is jdk1.5.exe, run
and install in provided folders. Set up ANT_HOME and JAVA_HOME. Done! (FAQ:
What if it does not work? A: It works for me.)
- You can now edit in Eclipse and hit http://localhost/manager/reload?path=/
to reload the classes, without re-starting Tomcat.
This way you can do RiA/SoA quickly. Why is it so big? It's everything I use
to develop, including pgSQL, so I do not have to download or configure.
Conclusion
JSF made a lot of promises a year ago related to UI, and now those promises
have all come true... but in the form of the Java Desktop. With RiA/SoA, we
have a return to a Client/Server of sorts, but this time with better deployment
and better management capabilities.
With modem use declining in favor of DSL and broadband, and monitors getting
above 21” and more, people expect to have a “Cinematic” (by
Laslo) experience and more of an MTV look and feel. No need to develop skills
in portlets or Tapestry or other html areas, there is no ROI. Welcome RiA! No
more cross browser and back button issues.
It does not make sense anymore to develop additional HTML legacy applications;
HTML is done for.
The future will bring more declarative programing, such as Longhorn's XAML
and the like: http://javadesktop.org/jdnc/0_5/docs/tutorial/index.html
(But some people will keep writing C code inside of C++, ie, you should start
getting used to doing UI declaratively, just like in Struts we do validation
declaratively, just more things are in XML). People interested in the operation
of RiA/SoA applications can join an RiA/SoA forum community at basicPortal.com.
Yes, it's a PHP forum. One of the goals of the site is to re-implement the entire
site in the Java Desktop, replacing PHP. The other goal of the site is to find
clients that want us to operate RiA/SoA applications for a monthly maintenance/admin
fee. Development is free. (No, we don't do html) Send us a paper mock up and
1st month's check (ex: $100 per month per screen for 3 years, includes operation
and free development). Qualified developers that want in can contact me. (Again,
the example of iTunes is good, they too have free software, just to underline
a possible new business model).
I plan to publish an advanced example based on a forum using the Java Desktop.
Thanks to the Java Desktop, Java has a fine opportunity to own the desktop, once the
Network Launcher issues are tunned.
About the Author
Vic Cekvenich has been in software development and consulting for almost 20
years. He wrote the 1st book on Struts a year before anyone else and his new
book is coming out in 3 languages: http://www.amazon.de/exec/obidos/ASIN/3898642844/qid%3D1092073443/028-2613131-5504542
Edited by B. Dunklau
PRINTER FRIENDLY VERSION
|