* Your assessment is very important for improving the workof artificial intelligence, which forms the content of this project
Download JSPandJDBC
Survey
Document related concepts
Transcript
Java Server Pages Java Server Pages • Servlets are nice, but… – It’s a pain to put in all those out.println stmts • JSPs mix Java and HTML – Within the same document • Nice for team based projects – Web page designers don’t need to know Java – Programmers don’t need to know design My First JSP <html> <head> <title>Greetings</title> </head> <body> <% for(int i=0;i<8;i++) { %> <p><font size=<%=i%>>Hello World!</font> <% } %> </body> </html> http://localhost:8080/ServletsAndJSP/HelloWorld.jsp Java Server Pages • Allow you to insert code into the HTML – Expressions <%= expression %> – Scriptlets <% code %> – Declarations <%! code %> • Upon access, the JSP is converted to a servlet then executed – Same life cycle as a servlet JSP Expressions • <%= Java Expression %> – Evaluated, Converted to a string, Inserted • Current Time: <%= new java.util.Date() %> • Predefined Variables – – – – – – – request response session out application config pageContext the HttpServletRequest the HttpServletResponse the HttpSession the PrintWriter the ServletContext the ServletConfig the PageContext JSP Code • <% code %> – Just executed • <% for(int j = 0; j < 8; j++) { %> <p><font size=<%= j %>>Hi</font> <% } %> • <%-- JSP Comment --%> • <!– HTML Comment --> JSP Declarations • <%! Code %> • Variable declarations • <%! private int accessCount = 0; %> Accesses: <%= ++accessCount %> • Variables have class scope – Shared between all instances JSP directives • Affect the overall structure of the page • <%@ directive attribute=“value” %> • The page directive – <%@ page import=“java.util.*” %> – <%@ page contentType=“text/plain” %> – <%@ page session=“true” %> <%-- default --%> • The include directive – <%@ include file=“Navbar.jsp” %> • Translation time – <jsp:include page=“Navbar.jsp” flush=“true”/> • Request time Java Beans Java Beans • What is a bean? – Data structure that conforms to certain rules • Bean rules – – – – Must have a zero argument constructor Generally named xxxBean No public instance variables Persistent values set/accessed through • setXxx • getXxx • Mostly used for persistent storage of data Bean Usage • <jsp:useBean id=“beanvar” class=“pkg.class” /> • Similar to: – <% beanvar = new pkg.class(); %> • More powerful – Scope (page, application, session, request) • Bean Location – Must be in server’s regular class path Bean Usage • Getting values – <jsp:getProperty name=“className” property=“variableName” /> • Setting values – <jsp:setProperty name=“className” property=“variableName” value=“The String Value” /> – Or param=“NumberVariable” /> My First Bean public class MessageBean { private String message = "No String Specified"; public String getMessage() { return (message); } public void setMessage(String theMessage) { message = theMessage; } } The JSP … <jsp:useBean id="myBean" class="MessageBean" scope="session" /> <ol> <li>Initial Value: <i><jsp:getProperty name="myBean" property="message" /></i> <jsp:setProperty name="myBean" property="message" value="Howdy" /> <li>After jsp:setProperty : <i><jsp:getProperty name="myBean" property="message" /></i> <% myBean.setMessage("After Scriptlet"); %> <li>After scriptlet : <i><%= myBean.getMessage() %></i> </ol> http://localhost:8080/ServletsAndJSP/MessageBean.jsp Benefits and Limitations • Benefits – – – – Separates business logic from HTML content Easier maintenance Component Re-usability Can be configured with commercial tools • Limitations – No support for indexed properties JSP Custom Tags Custom JSP Tags • Tags encapsulate complex behaviors – Make them simple and accessible • Tags are essentially function calls to Java code • Consist of three pieces – The Tag Handler (Java code) • Defines the action – The Tag Library Descriptor (xml) • Identifies the tag to the server – The Entry in web.xml (xml) My First Custom JSP Tag Handler package mytaglib; import javax.servlet.jsp.*; import javax.servlet.jsp.tagext.*; import java.io.*; // Simple JSP tag that just inserts the string "Simple Example Tag" public class SimpleTagExample extends TagSupport { public int doStartTag() { try { JspWriter out = pageContext.getOut(); out.print("Simple Example Tag"); } catch(IOException ioe) { System.out.println("Error in ExampleTag"); } return(SKIP_BODY); } } The Entry in web.xml Note: web.xml is in WEB-INF directory <web-app> <servlet> … </servlet> … <taglib> <taglib-uri>SimpleTag</taglib-uri> <taglib-location>SimpleTag.tld</taglib-location> </taglib> … </web-app> The Tag Library Descriptor Note: This is SimpleTag.tld. It goes in the WEB-INF directory <?xml version="1.0" encoding="ISO-8859-1" ?> <!DOCTYPE taglib PUBLIC "-//Sun Microsystems, Inc.//DTD JSP Tag Library 1.1//EN" "http://java.sun.com/j2ee/dtds/web-jsptaglibrary_1_1.dtd"> <taglib> <tlibversion>1.0</tlibversion> <jspversion>1.1</jspversion> <shortname>simpletag</shortname> <urn></urn> <info> My tag example. </info> <tag> <name>example</name> <tagclass>mytaglib.SimpleTag</tagclass> <info>Simple example</info> <bodycontent>EMPTY</bodycontent> </tag> </taglib> The JSP <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transistional//EN"> <html><head> <%@ taglib uri=“SimpleTag" prefix="simpletag" %> <title><simpletag:example /></title> </head> <body> <h1><simpletag:example /></h1> Here is the output from the tag: <i><simpletag:example /></i> </body> </html> http://localhost:8080/ServletsAndJSP/SimpleTagExample.jsp Tag Handler • Must implement the javax.servlet.jsp.tagext.Tag interface • doStartTag() and doEndTag() are key methods • Frequently extend TagSupport Another Tag Handler Example package mytaglib; import javax.servlet.jsp.*; import javax.servlet.jsp.tagext.*; import java.io.*; import javax.servlet.*; /** A tag that includes the body content only if * the "debug" request parameter is set. * <P> */ public class DebugTag extends TagSupport { public int doStartTag() { ServletRequest request = pageContext.getRequest(); String debugFlag = request.getParameter("debug"); if ((debugFlag != null) && (!debugFlag.equalsIgnoreCase("false"))) { return(EVAL_BODY_INCLUDE); } else { return(SKIP_BODY); } } } TLD File <?xml version="1.0" encoding="ISO-8859-1" ?> <!DOCTYPE taglib PUBLIC "-//Sun Microsystems, Inc.//DTD JSP Tag Library 1.1//EN" "http://java.sun.com/j2ee/dtds/web-jsptaglibrary_1_1.dtd"> TLD File (Cont) <taglib> <tlibversion>1.0</tlibversion> <jspversion>1.1</jspversion> <shortname>csajsp</shortname> <info></info> <tag> <name>debug</name> <tagclass>mytaglib.DebugTag</tagclass> <bodycontent>JSP</bodycontent> <info>Includes body only if debug param is set.</info> </tag> </taglib> web.xml entry <taglib> <taglib-uri>Debug</taglib-uri> <taglib-location>DebugTag.tld</taglib-location> </taglib> JSP Usage <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN"> <!-- Taken from Core Servlets and JavaServer Pages from Prentice Hall and Sun Microsystems Press, http://www.coreservlets.com/. © 2000 Marty Hall; may be freely used or adapted. --> <HTML> <HEAD> <TITLE>Using the Debug Tag</TITLE> <LINK REL=STYLESHEET HREF="JSP-Styles.css" TYPE="text/css"> </HEAD> <BODY> <H1>Using the Debug Tag</H1> <%@ taglib uri="Debug" prefix="csajsp" %> Top of regular page. Blah, blah, blah. Yadda, yadda, yadda. <P> <csajsp:debug> <B>Debug:</B> <UL> <LI>Current time: <%= new java.util.Date() %> <LI>Requesting hostname: <%= request.getRemoteHost() %> <LI>Session ID: <%= session.getId() %> </UL> </csajsp:debug> <P> Bottom of regular page. Blah, blah, blah. Yadda, yadda, yadda. </BODY> </HTML> Execute: http://localhost:8080/ServletsAndJSP/DebugTagExample.jsp Using the Debug Tag Top of regular page. Blah, blah, blah. Yadda, yadda, yadda. Bottom of regular page. Blah, blah, blah. Yadda, yadda, yadda. Execute: http://localhost:8080/ServletsAndJSP/DebugTagExample.jsp?debug=true Using the Debug Tag Top of regular page. Blah, blah, blah. Yadda, yadda, yadda. Debug: •Current time: Fri Jan 25 08:29:51 MST 2002 •Requesting hostname: 128.187.172.118 •Session ID: 320162B94289B579C523641021B008A1 Bottom of regular page. Blah, blah, blah. Yadda, yadda, yadda. Tag Complexity • Tags can become very complicated – Can parse body themselves – Can become nested in other tags • Ex. IF/THEN/ELSE – Looping constructs • While beans are generally used for model data and shared information, tags are typically confined to a single page Tag Summary • Tags are a portable extension mechanism for jsp • Can build a library of components – Ex. XSLT renderer of XML data – Bridge to JavaBean model data • Ex. Setting indexed properties • Further eliminates the need for HTML authors to learn Java JDBC Simple JDBC Program • • • • • Load JDBC Driver implementation Obtain connection to driver/database Execute query Process query results Release resources Example Program Step 1 - Load the Driver import java.sql.*; try { Class.forName(“org.gjt.mm.mysql.Driver”); } catch(ClassNotFoundException) { // Couldn’t find JDBC driver to load ! } Example Program Step 2 - Obtain a Connection Connection con = DriverManager.getConnection( “jdbc:mysql:///test”, “user”, “password” ); JDBC URLs • URL specifies the driver (subprotocol) and the data source/database system – Example. jdbc:mysql:///test – jdbc:driver:databasename • Subprotocol specifies a particular kind of database connectivity that may be supported by more than one driver • Database name is free-form and only interpreted by the driver • Examples – jdbc:odbc:datasource;dataoptions – jdbc:oracle:thin:@aplcen.apl.jhu.edu:1521:petStore – jdbc:cloudscape:petStoreDB • The Driver Manager locates an appropriate driver (by calling each driver's getConnection(url) method) and returns a connection from the first driver that handles the subprotocol. Example Program Step 3 - Execute a Query try { Statement st = con.createStatement(); ResultSet rs = st.executeQuery(“SELECT filename FROM Image”); } catch(SQLException sqe) { // Problem } • executeQuery() is used for Select statements • executeUpdate() is used for table creation and table modifications • executeBatch() to execute multiple statements. Example Program Step 4 - Process Results while(rs.next()) { System.out.println(“File: “ + rs.getString(“filename”)); } • The ResultSet cursor was positioned before the first row upon completion of the execute method Example Program Step 5 - Release Resources rs.close(); st.close(); con.close(); Statement • Represents a basic SQL statement • Created from a connection • Use executeQuery for queries – Result rs=st.executeQuery(“SELECT * FROM Image”); • Use executeUpdate for SQL statements that don’t return results – DDL commands for creating, dropping tables – Update/Delete – Returns the number of rows affected Prepared Statement • Pre-compiled SQL Statement • Better performance if a statement will be issued multiple times • PreparedStatement ps = con.prepareStatement(“SELECT * FROM Image WHERE image_id= ?”); for( int i=0; i<10; i++) { ps.setInt(1, i); ResultSet rs = ps.executeQuery(); // Do something with the result set } ResultSet • Encapsulates query results while(rs.next()) { String fname = rs.getString(“filename”); } • Column name is case-insensitive • JDBC 1.0 only allows forward-navigation • Column number may be used instead of name. (Column numbers start at 1) ResultSet Navigation • New ResultSet Operations – first(), last(), next() – previous(), beforeFirst(), afterLast() – absolute(int), relative(int) • Rows may be updated and inserted – rs.update( 3, “new filename”); rs.updateRow(); • Rows may be deleted Dynamic Programs • Most programs know the database schema they are operating upon. • Some generic programs e.g. database table viewer need to discover the schema dynamically • DatabaseMetaData from Connection • ResultSetMetaData from ResultSet DatabaseMetaData • DatabaseMetaData md = con.getMetaData(); • Operations include: – – – – get database product name get driver version get all tables get all indexes ResultSetMetaData • ResultSetMetaData md = rs.getMetaData(); • Operations to get: – Number of columns (getColumnCount()) – Column Name (getColumnLabel()) – Column Type (getColumnTypeName()) Transactions • Grouping of statements into one logical unit of work • Each statement must succeed or the transaction is rolled back • Steps – start transaction – execute statements – commit or rollback the transaction JDBC Transaction API • Responsibility of the Connection Object • By default, each operation is a transaction – con.setAutoCommit(true) • To perform multiple statements in a transaction: con.setAutoCommit(false); // execute statements con.commit(); SQL Types and Java • • • • • INTEGER -> int NUMERIC -> java.sql.Numeric FLOAT(n) -> double REAL -> float DOUBLE -> double CHAR(n) -> String BOOLEAN -> boolean ARRAY -> java.sql.Array Date,Time, and Timestamp correspond to the sql types – java.sql.Date, java.sql.Time, java.sql.Timestamp • Large results can be treated as streams – getAsciiStream(), getBinaryStream() – Useful for images, etc. • getBlob and getClob added in JDBC 2.0 • getObject() added for Java-aware databases Batch Updates con.setAutoCommit(false); Statement s = con.createStatement(); s.addBatch(….); s.addBatch(…..); …… s.executeBatch(); con.commit(); JDBC Summary • Thin Java API for access to SQL databases • Allows portable access to databases from different vendors • Still need to know SQL • Different driver implementation strategies • With extensions, JDBC 2.0 has taken a large step forward References • Developing Java Enterprise Applications • Sun Educational Services - Distributed Programming with Java (SL-301) • Java Enterprise in a Nutshell • Sun's JDBC website (http://java.sun.com/products/jdbc) • Object/Relational Database Mapping by Claude Duguay. Java Pro, January 2000