J2EE Java Server Pages (JSP) Avanceret Internetteknologi 2 (ITNET2)
Ingeniørhøjskolen i Århus Slide 2 af 58 Indhold i denne præsentation Java Server Pages (JSP): –Simpelt eksempel hvor vi gør brug af en database sammen med JSP –Brug af custom tags samt JSTL –Brug af Expression Language (EL)
Ingeniørhøjskolen i Århus Slide 3 Action Vi tager endnu et DEITEL eksempel –Eksemplet er en gæste bog (GuestBook) Der benytter sig af en database til at gemme data I kapitel 30 i DEITEL fik I et eksempl på hvordan en Servlet kunne tilgå en JDBC database – dette var et klassisk skolebogs eksempel Dog bør man ikke tillade så tæt kobling i større Web Applikationer Hos DEITEL eksemplet afkobles der derfor vha. to JavaBeans, en value-bean og en data-bean Klassen GuestBean og klassen GuestDataBean
Ingeniørhøjskolen i Århus Slide 4 af 24 Guest- Bean.java Define Bean GuestBean Storage Bean 3 package com.deitel.advjhtp1.jsp.beans; 4 5 public class GuestBean { 6 private String firstName, lastName, ; 7 8 // set the guest's first name 9 public void setFirstName( String name ) 10 { 11 firstName = name; 12 } public String getFirstName() 16 { 17 return firstName; 18 } public void setLastName( String name ) 22 { 23 lastName = name; 24 } public String getLastName() 28 { 29 return lastName; 30 } public void set ( String address ) 34 { 35 = address; } 39 public String get () 40 { 41 return ; 42 } 43 }
Ingeniørhøjskolen i Århus Slide 5 af 24 Guest- DataBean.java Define Class GuestDataBean Set up database 1 // Fig : GuestDataBean.java 2 // Class GuestDataBean makes a database connection and supports 3 // inserting and retrieving data from the database. 4 package com.deitel.advjhtp1.jsp.beans; 5 6 // Java core packages 7 import java.io.*; 8 import java.sql.*; 9 import java.util.*; public class GuestDataBean { 12 private Connection connection; 13 private PreparedStatement addRecord, getRecords; // construct TitlesBean object 16 public GuestDataBean() throws Exception 17 { 18 // load the Cloudscape driver 19 Class.forName( "COM.cloudscape.core.RmiJdbcDriver" ); // connect to the database 22 connection = DriverManager.getConnection( 23 "jdbc:rmi:jdbc:cloudscape:guestbook" ); getRecords = 26 connection.prepareStatement( 27 "SELECT firstName, lastName, FROM guests" 28 ); addRecord = 31 connection.prepareStatement( 32 "INSERT INTO guests ( " + 33 "firstName, lastName, ) " + 34 "VALUES ( ?, ?, ? )" 35 ); Defines the database driver, URL, and SQL statements.
Ingeniørhøjskolen i Århus Slide 6 af 24 Guest- DataBean.java Database access methods 36 } // return an ArrayList of GuestBeans 39 public List getGuestList() throws SQLException 40 { 41 List guestList = new ArrayList(); // obtain list of titles 44 ResultSet results = getRecords.executeQuery(); // get row data 47 while ( results.next() ) { 48 GuestBean guest = new GuestBean(); guest.setFirstName( results.getString( 1 ) ); 51 guest.setLastName( results.getString( 2 ) ); 52 guest.set ( results.getString( 3 ) ); guestList.add( guest ); 55 } return guestList; 58 } // insert a guest in guestbook database 61 public void addGuest( GuestBean guest ) throws SQLException 62 { 63 addRecord.setString( 1, guest.getFirstName() ); 64 addRecord.setString( 2, guest.getLastName() ); 65 addRecord.setString( 3, guest.get () ); addRecord.executeUpdate(); 68 } // close statements and terminate database connection Obtain the guest list from the database. Return each guest in a bean.
Ingeniørhøjskolen i Århus Slide 7 af 24 Guest- DataBean.java Close database 71 protected void finalize() 72 { 73 // attempt to close database connection 74 try { 75 getRecords.close(); 76 addRecord.close(); 77 connection.close(); 78 } // process SQLException on close operation 81 catch ( SQLException sqlException ) { 82 sqlException.printStackTrace(); 83 } 84 } 85 }
Ingeniørhøjskolen i Århus Slide 8 af 24 GuestBook- Login.jsp useBean action 1 2 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" 3 " <jsp:useBean id = "guest" scope = "page" 12 class = "com.deitel.advjhtp1.jsp.beans.GuestBean" /> 13 <jsp:useBean id = "guestData" scope = "request" 14 class = "com.deitel.advjhtp1.jsp.beans.GuestDataBean" /> Guest Book Login body { 23 font-family: tahoma, helvetica, arial, sans-serif; 24 } table, tr, td { 27 font-size:.9em; 28 border: 3px groove; 29 padding: 5px; 30 background-color: #dddddd; 31 } Obtain an instance of each bean. Assigns the bean name within the JSP.
Ingeniørhøjskolen i Århus Slide 9 af 24 GuestBook- Login.jsp Obtain information from user <% // start scriptlet if ( guest.getFirstName() == null || 41 guest.getLastName() == null || 42 guest.get () == null ) { %> Enter your first name, last name and 48 address to register in our guest book First name Last name Use to extract the parameters from the request – and save them in the “guest” bean Check for data
Ingeniørhøjskolen i Århus Slide 10 af 24 GuestBook- Login.jsp Add new guest to book <input type = "submit" 78 value = "Submit" /> <% // continue scriptlet } // end if 87 else { 88 guestData.addGuest( guest ); %> <% // continue scriptlet } // end else %> Calls the guestData Bean to write this new guest into the address book. Then forward the client to the guestBookView JSP.
Ingeniørhøjskolen i Århus Slide 11 af 24 GuestBook- View.jsp 1 2 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" 3 " <jsp:useBean id = "guestData" scope = "request" 14 class = "com.deitel.advjhtp1.jsp.beans.GuestDataBean" /> Guest List body { 23 font-family: tahoma, helvetica, arial, sans-serif; 24 } table, tr, td, th { 27 text-align: center; 28 font-size:.9em; 29 border: 3px groove; 30 padding: 5px; 31 background-color: #dddddd; 32 } Obtain an instance of the GuestDataBean class with useBean action.
Ingeniørhøjskolen i Århus Slide 12 af 24 GuestBook- View.jsp Guest List Last name 43 First name <% // start scriptlet List guestList = guestData.getGuestList(); 53 Iterator guestListIterator = guestList.iterator(); 54 GuestBean guest; while ( guestListIterator.hasNext() ) { 57 guest = ( GuestBean ) guestListIterator.next(); %> "> Obtain, then Iterate through the guestList and display its contents.
Ingeniørhøjskolen i Århus Slide 13 af 24 GuestBook- View.jsp <% // continue scriptlet } // end while %>
Ingeniørhøjskolen i Århus Slide 14 af 24 GuestBook- ErrorPage.jsp Error page 1 2 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" 3 " Error! bigRed { 19 font-size: 2em; 20 color: red; 21 font-weight: bold; 22 } <% // scriptlet to determine exception type 30 // and output beginning of error message 31 if ( exception instanceof SQLException ) 32 %> An SQLException 35
Ingeniørhøjskolen i Århus Slide 15 af 24 GuestBook- ErrorPage.jsp 36 <% 37 else if ( exception instanceof ClassNotFoundException ) 38 %> A ClassNotFoundException <% 43 else 44 %> An exception occurred while interacting with the guestbook database The error message was: Please try again later
Ingeniørhøjskolen i Århus Slide 16 Custom Tag Libraries Indkaplser kompleks JSP funktionalitet i et skræddersyet tag Scriptlets kan være svære at forstå for HTML udviklere Defineret i Tag i pakken javax.servlet.jsp.tagtext Extender normalt TagSupport eller BodyTagSupport Tillader udviklere at udvikle JSP sider uden Java viden Kan manipulere JSP sider direkte Der kan købes tag libraries Jeg har blandede følelser – der er pro et contra her … JSPs tilgang via taglib direktivet –DEITEL tabel viser sammenhængene
Ingeniørhøjskolen i Århus Slide 17 Eksempel fra DEITEL Der skal laves en klasse der extender TagSupport klassen Her kan der laves ny funktionalitet Der skal laves et XML dokument (.tld ) der kaldes en tag library descriptor file. Ligesom ved Servlets kobler dette dokument til én eller flere klasser der extender TagSupport Herefter skal der blot bruges direktivet: – Der så kan bruge: –
Ingeniørhøjskolen i Århus Slide 18 af 24 CustomTagWel come.jsp Custom tag example Program Output 1 2 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" 3 " Simple Custom Tag Example The following text demonstrates a custom tag: Specify the location of the tag library with the taglib directive. Call custom tag.
Ingeniørhøjskolen i Århus Slide 19 af 24 WelcomeTagHa ndler.java Define tag handler WelcomeTagHa ndler Implements custom tag functionality 1 // Fig : WelcomeTagHandler.java 2 // Custom tag handler that handles a simple tag. 3 package com.deitel.advjhtp1.jsp.taglibrary; 4 5 // Java core packages 6 import java.io.*; 7 8 // Java extension packages 9 import javax.servlet.jsp.*; 10 import javax.servlet.jsp.tagext.*; public class WelcomeTagHandler extends TagSupport { // Method called to begin tag processing 15 public int doStartTag() throws JspException 16 { 17 // attempt tag processing 18 try { 19 // obtain JspWriter to output content 20 JspWriter out = pageContext.getOut(); // output content 23 out.print( "Welcome to JSP Tag Libraries!" ); 24 } // rethrow IOException to JSP container as JspException 27 catch( IOException ioException ) { 28 throw new JspException( ioException.getMessage() ); 29 } return SKIP_BODY; // ignore the tag's body 32 } 33 } Load tag and print welcome.
Ingeniørhøjskolen i Århus Slide 20 af 24 advjhtp1- taglib.tld Define tag information 1 2 <!DOCTYPE taglib PUBLIC 3 "-//Sun Microsystems, Inc.//DTD JSP Tag Library 1.1//EN" 4 " advjhtp A simple tab library for the examples welcome com.deitel.advjhtp1.jsp.taglibrary.WelcomeTagHandler empty Inserts content welcoming user to tag libraries Custom tag library descriptor file (advjhtp1-taglib.tld). Required taglibrary meta information Designate the tags name and location, and that this tag has no attributes.
Ingeniørhøjskolen i Århus Slide 21 Custom Tag med attributter Mulighed for at sende data med I følgende eksempel gennemgås dette detaljeret N.B. dette gennemgås kun kursorisk – det er ikke pensum
Ingeniørhøjskolen i Århus Slide 22 af 24 CustomTagAtt ribute.jsp 1 2 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" 3 " Specifying Custom Tag Attributes Demonstrating an attribute with a string value Demonstrating an attribute with an expression value <% 27 String name = request.getParameter( "name" ); 28 %> " /> Include the custom tag library. Specifying an attribute for a custom tag.
Ingeniørhøjskolen i Århus Slide 23 af 24 Welcome2TagH andler.java Define Class Welcome2TagH andler.java Displays attribute value 3 package com.deitel.advjhtp1.jsp.taglibrary; 4 5 // Java core packages 6 import java.io.*; 7 8 // Java extension packages 9 import javax.servlet.jsp.*; 10 import javax.servlet.jsp.tagext.*; public class Welcome2TagHandler extends TagSupport { 13 private String firstName = ""; // Method called to begin tag processing 16 public int doStartTag() throws JspException 17 { 18 // attempt tag processing 19 try { 20 // obtain JspWriter to output content 21 JspWriter out = pageContext.getOut(); // output content 24 out.print( "Hello " + firstName + 25 ", Welcome to JSP Tag Libraries!" ); 26 } // rethrow IOException to JSP container as JspException 29 catch( IOException ioException ) { 30 throw new JspException( ioException.getMessage() ); 31 } 33 return SKIP_BODY; // ignore the tag's body 34 } 37 public void setFirstName( String username ) 38 { 39 firstName = username; 40 } 41 }
Ingeniørhøjskolen i Århus Slide 24 af 24 advjhtp1- taglib.tld welcome com.deitel.advjhtp1.jsp.taglibrary.Welcome2TagHandler empty Inserts content welcoming user to tag libraries. Uses 13 attribute "name" to insert the user's name firstName 18 true 19 true Element tag for the welcome2 custom tag. Define attribute parameters
Ingeniørhøjskolen i Århus Slide 25 Expression Language (EL) Fra Servlet 2.4 / JSP 2.0 specifikationerne JSP 2.1 / JSF 1.0: Unified Expression Language Simplificere data behandling med udtryk Alternativ til at bruge scriplets / inline Java kode Immediate Evaluation Deferred Evaluation
Ingeniørhøjskolen i Århus Slide 26 EL Eksempel En form med to tekstfelter udfylt af en ”customer” bean – og en submit funktion
Ingeniørhøjskolen i Århus Slide 27 JSTL JavaServer Pages Standard Tag Library Samling af tags (elementer) til brug i JSP Alternativ til scriplets Ovenstående erstatter for eksempel behovet for en scriplet med en løkke
Ingeniørhøjskolen i Århus Slide 28 JSTL Oversigt
Ingeniørhøjskolen i Århus Slide 29 JSP Documents Traditionel JSP er HTML med indlejret kode –Overholder ikke XML wellformed syntaxen –Kan ikke editeres af en standard XML editor JSP Documents –Alternativ til traditionel JSP –Ren XML syntax (wellformed) –Udviklet til brug for bl.a. JSF og IDE støttet udvikling –Vil formodentligt på sigt erstatte traditionel syntax
Ingeniørhøjskolen i Århus Slide 30 JSP Document XML Syntax
Ingeniørhøjskolen i Århus Slide 31 Traditionel JSP Syntax
Ingeniørhøjskolen i Århus Slide 32 JSP Document XML Syntax Samme Dokument! Mere Elegant