520 likes | 753 Views
JSP and web applications. Java 2 Enterprise Edition. J2EE Edition of Java Architecture specially designed for server-based applications Including web applications Highly compatible with M-V-C Client Tier Middle Tier Enterprise Information System Tier. J2EE Overview. EJB Container.
E N D
Java 2 Enterprise Edition • J2EE • Edition of Java • Architecture specially designed for server-based applications • Including web applications • Highly compatible with M-V-C • Client Tier • Middle Tier • Enterprise Information System Tier
J2EE Overview EJB Container application EJB EJB Database Web Container JMS JavaIDL RMI JNDI XML servlet servlet browser JSP JDBC JTA/JTS Client Tier Middle Tier EIS Tier
Which J2EE components? • Pure JSP • Simple applications • Prototyping • Use M-V-C • Business logic pages (model) • presentation pages (view) • Request processing pages (controller) • Enhance with JavaBeans components and custom tags
Tomcat web container Tomcat subdirectories: • bin • scripts to run Tomcat • common/lib • jar archives with javax.servlet class files • src • interface definitions for javax.servlet classes • conf • configuration files (Tomcat parameters)
Tomcat web container • docs • HTML documentation about Tomcat • work • a working directory for temporary files and generated servlets • webapps • all web applications run on Tomcat are placed in subdirectories of this
deploying a web application • create a subdirectory of webapps, e.g. myDir • create a WEB-INF subdirectory of myDir • WEB-INF contains • web.xml file • specifies deployment parameters for the web application • lib directory (optional) • contains any special class libraries (.jar files) needed • .classes directory • class files for servlet and helper classes defined for the specific application
the web.xml file • written in XML and contains environment data • descriptions of servlet names and locations • custom tag libraries • security constraints on particular servlets • multiple url aliases for servlets • etc
custom tags • used to farm out processing to specialised classes or Beans • identified by a tag library directive • basic JSP tag library • e.g. <jsp:useBean … /> • Apache Taglib custom tag library • JavaServerFaces, struts libraries • can define your own custom tags
custom tags • defined as Java classes that extend base classes in javax.servlet.jsp.tagext package • represented in a JSP using the syntax • <lib:tag att1=“...” att1=“...” att1=“...” /> • (can also have element content) • custom tag in JSP replaced by code in the servelet on translation
custom tag example package myPack; import java.util.*; import java.io.*; import javax.servelet.jsp.*; import javax.servelet.jsp.tagext .*; public class DateStamper extends TagSupport { protected String comment = null; public String getComment () { return comment; }
public void setComment (String cm) { comment = cm; } public int doEndTag () { try { String dateStr = (new Date()).toString (); pageContext.getOut ().println ( “<hr>This page entitled, “ + comment + “, was printed on “ + dateStr + “<br>”); } catch (Exception e) {//error handling} return EVAL_PAGE; }}
<taglib> <tlibversion>1.0 </tlibversion> <jspversion>1.1 </jspversion> <shortname>myTags</shortname> <tag> <name>DateStamper</name> <tagclass>myPack.DateStamper</tagclass> <bodycontent>empty</bodycontent> <attribute> <name>comment</name> <required>true</required> </attribute> </tag> </taglib> tag library definition file, myTags.tld
deployment in a web application <web-app> <taglib> <taglib-uri> /myTags </taglib-uri> <taglib-location> /WEB-INF/tlds/myTags.tld </taglib-location </taglib> </web-app>
using the tag in a JSP <%@ taglib uri=“/myTagLibrary” prefix = “myTags” %> <html><head><title>Using a custom tag</title></head> <body bgcolor = “FFFFFF”> <h1>Using a custom tag</h1> <p>Hello World. My custom tag has the following to say: <myTags:DateStamper comment=“This is a custom tag” /> </body></html>
description • football league result web application • users request match results • different requests possible • database search • html front end • user interaction through web-browser • servelet/JSP request handling and data processing
system architecture holds a single table Teams containing match data football.jsp highly graphic interactive results page football.html Database handles the request, submits SQL and processes result FootballSearchBean represents football game data contained in a DB table FootballGame static page to request results helper class to create the DB connection DBInfo tomcat
call JSP with a search parameter call JSP with a search parameter football.html <html><head><title>Football Search</title></head> <body bgcolor = “white”> <h1>Search the football league table</h1> <ul><li> <a href = “http://localhost:8080/jspeg/football.jsp?searchType=all”> List all games </a> </li><li> <a href = http://localhost:8080/jspeg/football.jsp?searchType=drawn> List drawn matches </a> </li></ul> </body></html>
to handle results of data query loads DB query result into the FootballGame object FootballGame class package football; import java.sql; public class FootballGame { private String team1,team2 private int score1, score2; public String getTeam1 () {return team1;} // similar methods to get team2, score1, score2 public void loadFromResultSet (ResultSet r) throws SQLException { team1 = r.getString (“TEAM1”); // ditto for team2 score1 = r.getInt (“SCORE1”); // ditto for score2 } }
handle DB queries to use Java Iterator class set up SQL query strings searchType query parameter from football.html ends up here FootballSearchBean package football; import java.sql; import java.util; public class FootballSearchbean { private static final allstr = “select * from TEAMS”; private static final drawstr = “select * from TEAMS where SCORE1=SCORE2”; private String searchType; public void setSearchType (String type) { searchType = type; }
contains results from the DB query for manipulating retrieved data counts the number of results FootballSearchBean private Vector results; public Iterator games () { if (results != null) return results.iterator (); else return null; } public int numGames () { if (results != null) return results.size (); else return 0; }
connect to the database create a Statement object (SQL query) to be fired at the DB FootballSearchBean public void doSearch () { results = new Vector (); try { Connection db = DBInfo.connectToDatabase (); Statement stmt = db.createStatement (); String request = allstr; if (“drawn”.equals (searchType)) request = drawstr; // else add code for other search options
fire the query at the DB and store the retrieved rows create a FootballGame object for each retrieved table row add the FootballGame to the results Vector FootballSearchBean ResultSet r = stmt.executeQuery (request); while (r.next ()) { FootballGame fg = new FootballGame (); fg.loadFromResultSet r; results.addElement (fg); } r.close (); stmt.close (); db.close (); } catch (Exception e) {// error-handling code here} } }
util package for the Iterator class football package with its classes Bean created and given an Id searchType property from football.html passed to Bean here football.jsp <%@ page import = “java.util.*” %> <%@ page import = “football.*” %> <html><head><title>League Results</title></head><body> <!-- cool and flashy DHTML content inserted here by the web designer. Embedded amongst that will be: --> <h1>Results</h1> <jsp:useBean id = “theLeague” class = “football.FootballSearchBean” /> <jsp:setProperty name = “theLeague” property = “*”/>
searches the database with the user selected search option determines the size of the result set and acts accordingly football.jsp <% theLeague.doSearch (); %> <% if (theLeague.numGames () == 0) { %> <p> No games played yet </p> <% } else { %> <!-- there are results so set up a table --> <table> <caption>Results</caption> <tr> <th align = “center”>Home Team</th> <th align = “center”>Home Team Score</th> <th align = “center”>Away Team</th> <th align = “center”>Away Team Score</th> </tr>
creates an Iterator containing FootballGame objects explicit typecast of each object to access the get methods use expressions to insert names and scores for each game in table cells football.jsp <% Iterator it = theLeague.games (); while (it.hasNext ()) { FootballGame fg = (FootballGame) it.next (); %> <tr> <td><%= fg.getTeam1 () %> </td> <td><%= fg.getScore1 () %> </td> <td><%= fg.getTeam2 () %> </td> <td><%= fg.getScore2 () %> </td> </tr> <% } %> </table> <% } %> </body></html>
some design issues • Java code in the JSP fragmented through the HTML • difficult to trace errors • brackets • parameter declarations • incorrect program logic • web designer could unwittingly break the code
revised system architecture Match Report.jsp No Result.jsp football.html Database FootballSearchBean web.xml preprcessing servelet FootballGame hyperlinks now go to a pre-processing servelet DBInfo tomcat
web.xml <web-app> <servelet> <servelet-name>FootballServelet</servelet-name> <servelet-class>PreprocessServelet</servelet-class> </servelet> <servelet-mapping> <servelet-name>FootballServelet</servelet-name> <url-pattern>/FootballInfo</url-pattern> </servelet-mapping> </web-app>
PreprocessServelet // import all the usual servelet stuff import football.*; public class preprocessServelet extends HttpServelet { private static final String allstr = “no results available yet”; private static final String drawstr = “there have been no drawn games”; private static final String homestr = “there have been no home wins”; private static final String awaystr = “there have been no away wins”; private static final String jspFailPage = “NoResult.jsp”; private static final String jspReportPage = “MatchReport.jsp”;
PreprocessServelet public void doGet () {HttpServeletRequest req, HttpServeletresponse res) throws ServeletException, IOException { String search = req.getParameter (“searchType”); FootballSearchBean fsb = new FootballSearchBean (); fsb.setSearchType (search); fsb.doSearch (); if (fsb.numGames () == 0) { doSearchFail (search, req, res); else doSuccess (fsb, req, res); }
PreprocessServelet private void doSearchFail (String search, HttpServeletRequest req, HttpServeletresponse res) throws ServeletException, IOException { String reason = allstr; if (“drawn”.equals (search)) reason = drawstr; // add similar clauses for other possible reasons req.setAttribute (“Message”, reason); RequestDispatcher d = req.getRequestDispatcher (jspFailPage); d.forward (req, res); }
PreprocessServelet private void doSuccess (FootballSearchBean fsb, HttpServeletRequest req, HttpServeletresponse res) throws ServeletException, IOException { req.setAttribute (“theLeague”, fsb); RequestDispatcher d = req.getRequestDispatcher (jspReportPage); d.forward (req, res); } // end of PreprocessServelet }
revised JSP pages // NoResult.jsp <!-- contains the following minimal content --> <jsp:useBean scope=“request” id=“Message” class=“String”> <%= Message %> ********************************************************** //MatchReport.jsp <jsp:useBean scope=“request” id=“theLeague” class=“football.FootballSearchBean”> ... <% Iterator it = theLeague.games (); while (it.hasNext ()) { FootballGame fg = (FootballGame) it.next (); %> <tr><td><%= fg.getTeam1 () %> </td> <!-- etc. -->