Professional JSP Excerpt Part Four : Servlets versus
JSPs
JSPs
can be used for most purposes, but there are some scenarios where Servlets
are more appropriate. As well as components such as the "mediator"
Servlets used earlier in this chapter, Servlets are well suited for
handling binary data dynamically (for example, uploading files or creating
dynamic images), since they need not contain any display logic.
Consider the
following: a JSP needs to display a banner image based on who is referring
the user to the site. This can be done by using the IMG tag like this:
<%@ page import="com.ibm.jspredbook.*;" errorPage="error.jsp" %> <body bgcolor="#FFFFFF"> <!--the referer header is used to trap the url the user is coming from --> <IMG SRC="/servlets/ImgServlet?from=<%=request.getHeader("Referer")%>"> </body> </html>
The Servlet referenced
in the IMG tag, ImgServlet, is coded as:
package com.ibm.projsp;
import javax.servlet.*;
import javax.servlet.http.*;
import java.util.*;
import java.io.*;
public class ImageServlet extends HttpServlet {
private String docHome = ".";
public void service(HttpServletRequest request,
HttpServletResponse response)
throws ServletException, IOException {
HttpSession session = request.getSession(true);
ServletConfig config = getServletConfig();
ServletContext application = config.getServletContext();
File file = findFile(request, response);
if (file == null) {
return;
} else {
response.setContentType(application.getMimeType(file.getName()));
response.setContentLength((int) file.length());
sendFile(file, response);
}
}
protected File findFile(HttpServletRequest request,
HttpServletResponse response) throws IOException {
// We should store a flow-to-image mapping and return the appropriate
// File, without any platform-specific paths. Right now we will just
// return a GIF file.
File file = new File("c://weblogic//images/myimage.gif");
return file;
}
protected void sendFile(File file, HttpServletResponse response)
throws IOException {
int c = 0;
FileInputStream fileinputstream = null;
try {
ServletOutputStream servletoutputstream =
response.getOutputStream();
fileinputstream = new FileInputStream(file);
while ((c = fileinputstream.read()) != -1) {
servletoutputstream.write(c);
}
servletoutputstream.flush();
}
finally {
if (fileinputstream != null) {
fileinputstream.close();
}
}
}
}
This image can be
cached in memory and updated every minute or so as needed. Keeping the
data in memory and using a servlet can save time and improve performance
by not requiring access to the file system every time a request is
made.
Summary
We have examined how we architect systems using JSPs,
Servlets, and JavaBeans, discussed benefits and limitations of various
approaches and actually seen an example that evolves to satisfy the
constraints of the various architectures.
We discussed a variety of architectural patterns, each
of which we categorized as either a Page-Centric or Dispatcher type of
architecture. Page-Centric architectures have a JSP handling the request
directly, while Dispatcher architectures include a Servlet that handles
the request and delegates to a JSP.
The architectural patterns we examined are:
-
Page-View
(Page-Centric)
-
Page-View
with Bean (Page-Centric)
-
Mediator-View
(Dispatcher)
-
Mediator-Composite
View (Dispatcher)
-
Service-to-Workers
(Dispatcher)
As we continue to investigate new ways to build our
systems, we will continue to realize new architectural patterns.
Additionally, the specifications for these technologies continue to be
refined and improved in ways that will potentially demand modifications to
current architectural patterns and the realization of additional ones. The
ability (in the post-1.0 JSP specifications) to factor code and
implementation details into a Custom Tag that might be used in place of a
JavaBean is simply one example. The integration of these technologies more
closely with XML and XSLT is another.
This is certainly an exciting and important area of
technology that continues to change at a rapid pace. Hopefully, this
information will help you better understand the current state of affairs
with respect to JSP architectures, and thus feel better positioned to
follow the evolution of these architectural issues in the future.
We hope you enjoyed this excerpt. Professional
JSP is published by Wrox Press. |