Struts meets Swing (1)
by Keld H. Hansen
Introduction
Jakarta Struts is a framework that facilitates building servlet
applications based upon the Model-View-Controller (MVC) design
paradigm. Most Struts applications use a browser as the client, but
the framework is actually open enough to allow other client types. In
this first article of two, I'll take the browser application from my
JavaBoutique article "Coding your
second Jakarta Struts Application", and prepare it for adding a
Swing client to
it--with only a few changes to the code in the original browser
application. In the second article we'll see how the coding of the
Swing application is done.
So this article is about connecting a Swing client to an
existing servlet application. If you're planning a new Java
application that has to service both a web browser and a Swing
client you should consider other architectural alternatives too, for
example EJB's, or web services, since they may offer simpler
interfaces or additional advantages--all depending on your
application's needs. It's outside the scope of this article to
compare architectures. But if you're interested in the topic you may
find some good opinions at
Sun's discussion forum.
The Struts architecture
Before we dig down into the technical stuff, let's consider how a
browser communicates with a Struts application. This will reveal the
requirements for our Swing application.
- The entry to a Struts application is through a servlet that
accepts GET or POST requests.
- The "action" that the servlet must perform is given through the
URL, for example a "list" action through:
http://myserver/project/list.do
- The Java classes used to handle the action are specified in the
Struts configuration file struts-config.xml.
- The output from Struts is constructed by jsp-pages, whose names
are also specified in the Struts configuration file.
So the first challenges for a non-browser client is to be able to
make a request to a servlet, and to receive and handle an answer from
a jsp-page.
The URLConnection class
The servlet request is easy to code in Java using the
URLConnection class. It's quite a funny class with a somewhat
strange design--if you want to look into the details I'd recommend
you reading "Dodge
the traps hiding in the URLConnection class".
To send a request for the "list" action mentioned above, and
receive and print out the response you may code like this:
URL url = new URL("http://myserver/project/list.do");
URLConnection conn = url.openConnection();
BufferedReader in =
new BufferedReader(new InputStreamReader(conn.getInputStream()));
String line;
while ((line = in.readLine()) != null) {
System.out.println(line);
}
|
- Figure 1: Request, receive, print -
Normally you'll also have to send some data with your
request--like when a browser sends data from an HTML form. These data
must be sent before you read the response:
URL url = new URL("http://myserver/project/list.do");
URLConnection conn = url.openConnection();
conn.setDoOutput(true);
conn.setRequestProperty("user-agent","SWING");
BufferedWriter out =
new BufferedWriter(new OutputStreamWriter(conn.getOutputStream()));
out.write("name1=value1&name2=value2");
out.flush();
out.close();
String c = conn.getHeaderField("Set-Cookie");
BufferedReader in =
new BufferedReader(new InputStreamReader(conn.getInputStream()));
String line;
while ((line = in.readLine()) != null) {
System.out.println(line);
}
|
- Figure 2: Request, write, receive, print -
The example also shows how you can write and read HTTP header
information. A complete working example can be seen
here .
The example in figure 1 corresponds to HTTP method GET, and figure
2 to method POST. You may also use method GET to transfer data to the
servlet, but then you'll have to add the data to the URL, like
this:
URL url = new
URL("http://myserver/project/list.do?name1=value1&name2=value2");
Identifying the client
So now we know how to send and request data, but what about the
data we receive? If the response is meant for a browser, then it'll
contain HTML--and maybe also JavaScript and stylesheets. For our new
Swing client we only need the "raw" data, and nothing that has to do
with the presentation of the data. This brings up a new question: how
does the Struts application recognize whether the client is a web
browser or a Swing client--or something else?
One solution would be to add a parameter to each request giving
the identification of the client. I've chosen to use the
user-agent header field to identify the Swing client--see the
example in figure 2.
When the Struts application is ready to send data back to the
client, it'll therefore have to retrieve the value of the
user-agent field, and then select the jsp-page that matches the
client. This would typically take place where the Struts
Action class sets the forward information:
String client = (String)request.getHeader("user-agent");
// Forward control to the list page
if (client.equals("SWING"))
return (mapping.findForward("swinglist"));
else return (mapping.findForward("list"));
|
The definition of "list" and "swinglist" are placed in Struts'
configuration file:
<forward name="list" path="/list.jsp"/>
<forward name="swinglist" path="/swinglist.jsp"/>
|
list.jsp is the file that will construct the page for a web
browser, and swinglist.jsp must do the same for our Swing
client.
Before we look at how we construct the swinglist.jsp file,
let's look at the demo application, which will be used throughout the
article.
New on the Java Boutique:
New Review:
Time Management Made Easy with the Quartz Enterprise Job Scheduler
Why not just use the Java timer API? This open source scheduling
API boasts simplicity, ease-of-integration, a well-rounded feature
set, and it's free!
New Applet:
Reverse Complement
Reverse Complement is a simple applet that converts DNA or RNA
sequences into three useful formats.
Elsewhere on internet.com:
WebDeveloper Java
Lots of Java information on webdeveloper.com
WDVL Java
Thorough Java resource at the Web Developer's Virtual Library.
ScriptSearch Java
Hundreds of free Java code files to download.
jGuru: Your View of the Java Universe
Customizable portal with online training, FAQs, regular news updates, and tutorials.