JMSL Chart Programmer's Guide | Web Server Application |
Web Server Application
A JMSL chart can be returned as an image from a Web server using a servlet. The mechanism depends on the version of the Java runtime library being used.
Images are rendered using the standard Java class javax.imageio
.ImageIO.
This class can be used on a headless server—that is, a server running without
graphical interfaces. While most desktop Unix systems run the X Windows System
, Unix servers are often run without it. Java runs in a headless mode if the
system property java.awt.headless
is set to true
.
Overview—Web Servlets
Java Server Pages (JSP) and servlets are the standard mechanism for adding Java functionality to Web servers.
Adding charts to a Web page is complicated by the fact that in response to a request a Web server can return either a text HTML page or a bitmap image. The response to the initial request is an HTML page that contains an image tag. When the browser parses the HTML page and finds the image tag, it makes a second request to the Web server. The Web server then returns the bitmap image in response to this second request.
The JMSL classes JspBean
and ChartServlet
are used to coordinate this
process. During the first request, one or more JMSL chart trees are constructed and
stored in the HttpSession
object, obtained from the HttpServletRequest
object, using the method JspBean.registerChart
. The method Jsp.getImageTag
is used to construct an HTML image tag with an identifier for the chart
in the session object. This image tag refers to the servlet ChartServlet
. The
second browser request is therefore directed to the ChartServlet
, which uses
the identifier to retrieve the chart from the session object.
The use of the session object to hold the chart requires that the user's browser allow cookies, used to track sessions across requests.
Generating a Chart with a JSP
This example consists of a JSP working with a bean (pieChart
) that contains a
JspBean
. The HTML image tag is the value of the imageTag
property from
pieChart
. The following is the JSP.
(Download Code)
1 <%@page contentType="text/html"%> 2 <jsp:useBean id="pieChart" scope="page" class="SampleChartBean"/> 3 <html> 4 <head><title>Pie Chart</title></head> 5 <body> 6 <h1>Pie Chart</h1> 7 <jsp:setProperty name="pieChart" property="*"/> 8 <% pieChart.createChart(request); %> 9 <jsp:getProperty name="pieChart" property="imageTag"/> 10 </body> 11 </html>
In the above JSP, line 1 flags that an HTML page is being generated. Line 2 creates
the object pieChart
, which is an instance of SampleChartBean
. This object
has page scope, so it is discarded after the page has been generated. Line 7 sets
attributes in pieChart
using parameters in the request. Attributes are set in pieChart
using its setter methods, following the usual pattern for Java beans. Line 8
calls the createChart
method to create the chart tree and store it in the session.
This is Java code enclosed in the special delimiters. Line 9 inserts the HTML image
tag obtained by calling pieChart.getImageTag()
.
The class SampleChartBean
uses a JspBean
. It creates a pie chart and registers
it with the session obtained from the request. The getImageTag()
method
returns an HTML tag which refers to the ChartServlet
servlet that returns the
chart image to the browser.
import com.imsl.chart.*; import java.awt.Color; public class SampleChartBean { private JspBean bean; public SampleChartBean() { bean = new JspBean(); bean.setSize(300, 300); } public void createChart(javax.servlet.http.HttpServletRequest request) { Chart chart = new Chart(); bean.registerChart(chart, request); double y[] = {35., 20., 30., 40.}; Pie pie = new Pie(chart, y); pie.setLabelType(pie.LABEL_TYPE_TITLE); pie.setFillOutlineColor(Color.blue); PieSlice[] slice = pie.getPieSlice(); slice[0].setFillColor(Color.red); slice[0].setTitle("Red"); slice[1].setFillColor(Color.blue); slice[1].setTitle("Blue"); slice[1].setFillOutlineColor(Color.yellow); slice[2].setFillColor(Color.black); slice[2].setTitle("Black"); slice[2].setExplode(0.3); slice[3].setFillColor(Color.yellow); slice[3].setTitle("Yellow"); } public String getImageTag() { return bean.getImageTag(); } }
Generating Charts with Client-side Imagemaps
Client-side image maps allow regions of an image to be linked to a URL. Clicking on such a region behaves the same as clicking on a hypertext link. This can be used to create a degree of interactivity. Target regions are created for chart nodes that have the HREF attribute defined.
In this example the sample pie chart as above is generated, but now when the user
clicks on a slice the selected slice is exploded out. Now pieChart
is an instance
of SampleImageBean
. The JSP gets the pieChart
's
imageMap property to
create a map tag in the HTML code.
(Download Code)
<%@page contentType="text/html"%> <jsp:useBean id="pieChart" scope="page" class="SampleImagemapBean" /> <html> <head><title>Pie Chart Imagemap</title></head> <body> <h1>Pie Chart Imagemap</h1> <jsp:setProperty name="pieChart" property="*"/> <% pieChart.createChart(request); %> <jsp:getProperty name="pieChart" property="imageMap"/> <jsp:getProperty name="pieChart" property="imageTag"/> </body> </html>
The code for SampleImagemapBean
is similar to the code for the previous
SampleChartBean
, but with the HREF
attribute defined in each slice. The reference
is back to SampleImagemapJSP
, but with the explode parameter
defined. The second change is the addition of a setter method for explode. The line
<jsp:setProperty name="pieChart" property="*"/>
in the JSP file sets properties in the pieChart from parameters in the request. If explode is defined in the HTTP request, then the JSP calls this setter method.
(Download Code)import com.imsl.chart.*; import java.awt.Color; public class SampleImagemapBean extends JspBean { private JspBean bean; private int explode; public SampleImagemapBean() { bean = new JspBean(); bean.setSize(300,300); bean.setCreateImageMap(true); } public void createChart(javax.servlet.http.HttpServletRequest request) { Chart chart = new Chart(); double y[] = {35., 20., 30., 40.}; Pie pie = new Pie(chart, y); pie.setLabelType(pie.LABEL_TYPE_TITLE); pie.setFillOutlineColor(Color.blue); PieSlice slice[] = pie.getPieSlice(); slice[0].setFillColor(Color.red); slice[0].setTitle("Red"); slice[1].setFillColor(Color.blue); slice[1].setTitle("Blue"); slice[1].setFillOutlineColor(Color.yellow); slice[2].setFillColor(Color.black); slice[2].setTitle("Black"); slice[3].setFillColor(Color.yellow); slice[3].setTitle("Yellow"); for (int k = 0; k < slice.length; k++) { slice[k].setHREF("SampleImagemapJSP.jsp?explode="+k); } try { slice[explode].setExplode(0.3); } catch (Exception e) { // ignore out of range values for explode } bean.registerChart(chart, request); } public void setExplode(int explode) { this.explode = explode; } public String getImageTag() { return bean.getImageTag(); } public String getImageMap() { return bean.getImageMap(); } }
Servlet Deployment
A Web server that supports Java servlets will generally have a directory of Web
applications, one per directory. In each Web application subdirectory there can be
a WEB-INF directory containing the Java classes. This directory contains the subdirectory
classes, containing individual class files, and the subdirectory lib,
containing JAR
files. For the above example, the file structure would be as follows:
webapps/ application_name/ SampleChartJSP.jsp SampleImagemapJSP.jsp WEB-INF/ web.xml classes/ SampleChartBean.class SampleImagemapBean.class lib/ jmsl.jar
© Visual Numerics, Inc. All rights reserved. |