Info-books
HO40c
Toegepaste Informatica Objectgeoriënteerd Programmeren en Webapplicaties
Deel 40c: Java voor het internet: Servlets K. Behiels - J. Gils
Hoofdstuk 3
3.1
JDBC
Inleiding De technologie die het mogelijk maakt om vanuit Java met databases te werken is Java Database Connectivity (JDBC). Ze bestaat uit twee delen: • •
de JDBC core API die deel uitmaakt van J2SE, je vindt ze in de java.sqlpackage; de JDBC optional API die zich in de javax.sql-package bevindt.
Een volledige studie van JDBC is een cursus op zichzelf, we beperken ons hier tot het strikte minimum. 3.1.1 De java.sql-package De belangrijkste onderdelen van de java.sql package zijn: • • • • • • •
de DriverManage-klasse; de Driver-interface; de Connection-interface; de Statement-interface; de ResultSet-interface; de PreparedStatement-interface; de ResultSetMetaData-interface.
• DriverManager Elke JDBC-driver die je wenst te gebruiken moet geregistreerd zijn bij de DriverManager. Deze drivers verschillen naargelang het type database dat je gebruikt. Om de JDBC-driver vanuit een servlet of een JSP-pagina te laden kopieer je het driverbestand (meestal een *.jar bestand) naar de WEB-INF\lib directory van je toepassing. Om de driver te laden voer je de volgende code uit: try { Class.forName("JDBC.driver"); } catch(ClassNotFoundException e) { // driver niet gevonden }
Hierin is JDBC.driver de volledige naam van de JDBC-driver klasse, voor de Cloudscape database is dit bijvoorbeeld "com.cloudscape.core.JDBCDriver". Als je zoals in de voorbeelden die volgen met Access werkt is dit
K. Behiels – J. Gils
Servlets
51
"sun.jdbc.odbc.JdbcOdbcDriver", de standaard JDBC-ODBC-driver van Sun Microsystems.
De belangrijkste methode van deze klasse is de getConnection-methode, die bestaat in drie verschillende versies (telkens public static): Connection getconnection(String url); Connection getconnection(String url, Properties info); Connection getconnection(String url, String user, String password);
• Driver Deze interface is geïmplementeerd door elke JDBC-driver-klasse. De driver klasse zelf is geladen en geregistreerd bij de DriverManager. Er kan meer dan één driver tegelijkertijd geregistreerd zijn. De DriverManager vraagt elke driver om proberen te connecteren met de database op de bijbehorende URL. • Connection De connection-interface stelt een verbinding met een database voor, een instantie hiervan wordt bekomen met de getConnection-methode van de DriverManager-klasse. Hij bevat de volgende methoden die allemaal een throw van een SQLException kunnen doen: public void close();
Met deze methode sluit je de verbinding onmiddellijk af in plaats van te wachten tot ze automatisch wordt afgesloten. public boolean isClosed();
Test of de verbinding al of niet is afgesloten. public Statement createStatement(); public PreparedStatement prepareStatement(); Met de createStatement-methode maak je een Statement-object om SQLuitdrukkingen naar een database te zenden. Wanneer een SQL-uitdrukking meer dan eenmaal wordt uitgevoerd is het beter een PreparedStatement te gebruiken. public boolean getAutoCommit(); public void setAutoCommit(boolean autoCommit); Met de eerste methode kan je de toestand van autocommit opvragen, met de tweede kan je ze wijzigen. Standaard staat autocommit op true. Dit wil zeggen dat de JDBC-driver de transactie automatisch zal beëindigen (starten gaat altijd automatisch). Als je autocommit op false zet moet je zelf de transactie eindigen met commit of rollback. public void commit(); public void rollback(); Met de commit-methode maak je alle wijzigingen in de database (sinds de laatste commit of rollback) permanent. Met de rollback-methode breng je de database
terug in de toestand na de laatste succesvolle commit.
52
Servlets
K. Behiels – J. Gils
• Statement Je gebruikt een statement-methode om een SQL-uitdrukking uit te voeren en de geproduceerde resultaten te bekomen. De twee belangrijkste methoden zijn de volgende (ze kunnen ook een SQLException veroorzaken): public ResultSet executeQuery(String sql); public int executeUpdate(String sql); De executeQuery-methode voert een SQL-uitdrukking uit en geeft een ResultSetobject terug. Met een executeUpdate kan je insert-, update- of delete <SQL-uitdrukking> uitvoeren. De returnwaarde is het aantal records dat door de
transactie gewijzigd is. • ResultSet Deze interface bevat het resultaat van een query in de vorm van een soort tabel. Hij bevat een soort pointer waarmee je naar de verschillende gegevensrijen kunt verwijzen. De drie belangrijkste methoden (die ook allemaal een SQLException kunnen veroorzaken) zijn: public boolean isFirst(); public boolean isLast();
Deze methoden geven aan of de pointer respectievelijk naar de eerste of naar de laatste record in de ResultSet verwijst. public boolean next();
Deze methode verplaatst de pointer naar de volgende record, ze geeft true terug zolang er nog records zijn. public ResultMetaData getMetaData(); Deze methode geeft de meta data van de ResultSet. public XXX getXXX(int kolomIndex); De getXXX-methoden, waarbij XXX voor een datatype staat, gebruik je om de waarde van een kolom in een bepaalde rij van de ResultSet op te vragen.
Kolomindex 1 geeft de eerste kolom enzovoort. • PreparedStatement Deze interface is een uitbreiding van de Statement-interface en wordt gebruikt om een SQL-uitdrukking vooraf te compileren zodat ze bij meervoudig gebruik efficiënter uitgevoerd wordt. • ResultSetMetaData Deze interface stelt de meta data van een ResultSet voor. Ze bevat onder andere de volgende methoden (ook hier is een SQLException mogelijk): public int getColumnCount();
Geeft het aantal kolommen terug. public String getColumnName(int kolomIndex);
Geeft de naam van de kolom terug, de indexwaarde van de eerste kolom is 1.
K. Behiels – J. Gils
Servlets
53
3.1.2 Toegang krijgen tot een database Om toegang te krijgen tot een tabel in een database moet je 4 stappen doorlopen: • Stap 1: Laad de JDBC-database-driver Voor bijna alle populaire databases zijn er tegenwoordig JDBC-drivers op de markt, bijvoorbeeld voor Oracle, Sybase, DB2, SQL Server, Cloudscape, MySQL, … Ook voor ODBC zijn er drivers beschikbaar zodat je eventueel via een JDBC-ODBC bridge kan connecteren. Omdat JDBC-drivers meestal in de vorm van een *.jar-bestand geleverd worden is het eerste wat je moet doen ervoor zorgen dat de driver gevonden kan worden. Kopieer daarom de driver (het *.jar bestand) in de WEB-INF\lib-directory van je toepassing. Wanneer je met een JDBC-ODBC-brigde werkt is dit niet noodzakelijk omdat die in je Java-omgeving geïntegreerd is. Wanneer je van plan bent om met verschillende databases te werken moet je alle benodigde drivers laden. Als je bijvoorbeeld vanuit een programma met Access-, SQL Server- en MySQL-bestanden wilt werken moet je in je programma de volgende regels opnemen: // voor Access Class.forName("sun.jdbc.odbc.JdbcOdbcDriver"); // voor SQL Server Class.forName("com.internetcds.jdbc.tds.driver"); // voor MySQL (http://www.worldserver.com/mm/mysql/) Class.forName("org.gjt.mm.mysql.driver");
• Stap 2: Maak een verbinding (Connection) Nadat de JDBC-driver bij de DriverManager geregistreerd is kan je een verbinding met de database maken. Het eerste argument bij de verschillende versies van de getConnection-methodes is altijd de URL. Deze URL-string heeft de volgende syntaxis: "jdbc:subprotocol:subname"
De subprotocol- en de subname-delen zijn afhankelijk van welke database je gebruikt. Als je met Access werkt is het subprotocol odbc en de subname de DSN (Data Source Name) voor de database (normaal de naam van het databasebestand). Als je Access-bestand de naam JavaWeb.mdb heeft dan wordt de URL-string als volgt: "jdbc:odbc:JavaWeb"
Bij MySQL is het subprotocol mysql en de subnaam de naam van de machine en de database, de URL-string voor een database met de naam JavaWeb wordt dan: "jdbc:mysql///JavaWeb"
54
Servlets
K. Behiels – J. Gils
en als de naam van de server 'linux' is wordt het: "jdbc:mysql///linux/JavaWeb"
De volledige uitdrukkingen zijn dan respectievelijk bijvoorbeeld: Connection connection = DriverManager.getConnection("jdbc:odbc:JavaWeb"); Connection connection = DriverManager.getConnection("jdbc:mysql://JavaWeb"); Connection connection = DriverManager.getConnection("jdbc:mysql://linux/JavaWeb", "admin", "secret");
In het laatste geval worden ook gebruikersnaam en wachtwoord meegegeven. • Stap 3: Maak een SQL-uitdrukking (Statement) Nadat je een Connection-object ter beschikking gekregen hebt kan je een SQLuitdrukking maken. Welke SQL-onderdelen begrepen worden is afhankelijk van je database server. Verder is de uitvoering van een SQL-uitdrukking afhankelijk van het toegankelijkheidsniveau, bijvoorbeeld of je al of niet de toelating hebt om records te wijzigen. Je creëert eerst een Statement-object (uitgaande van een open verbinding met de naam connection). Daarna kan je een executeQuery- of een executeUpdate-methode uitvoeren. Bijvoorbeeld met een tabel met de naam Gebruikers: Statement statement = connection.createStatement(); String sqlString = "INSERT INTO Gebruikers " + "VALUES ('Don', 'Johnson', 'Miami', 'Vice')"; statement.executeUpdate(sqlString); ResultSet result = statement.executeQuery("SELECT * FROM Gebruikers");
• Stap 4: Verwerk de het resultaat (ResultSet) Als je gebruik maakte van een executeQuery-statement staat het resultaat daarvan in een ResultSet-object. Om de gegevens hieruit op te halen kan je gebruik maken van de getXXX-methoden waarvan de getString-methode de meest gebruikte is. Deze methode bestaat in twee versies: public String getString(int kolomIndex) ; public String getString(String kolomNaam);
Verder kan je de verschillende records doorlopen met de volgende lus: while(result.next()) { // }
K. Behiels – J. Gils
Servlets
55
3.1.3 Een praktisch voorbeeld Voor de volgende programmavoorbeelden maken we gebruik van de volgende eenvoudige Access-tabel Gebruikers in het bestand Javaweb.mdb: Gebruikers Sleutel Voornaam Familienaam 1 Jos Gils 2 Erik Goossens 3 Theo Jansens 4 Luc Lambrecht 5 Ronny Verlinden 6 Kris Van Gompel 7 Els D'Heer 8 Tom Van den Eede
Gebruikersnaam Wachtwoord gils swordfish goose matrix jans sleeples lam stigmata ronny silence gompy outbreak d'heer o'cool tom nightowl
Het volgende programma maakt een verbinding met de database en toont de inhoud ervan op het scherm: /** hst3vb01 --- TestJavaWeb.java * @author Kristiaan Behiels * @version 1.0 */ import java.io.*; import java.sql.*; public class TestJavaWeb { public static void main(String[] args) throws IOException { try { // laad de driver (=standaard driver uit JDK1.2) Class.forName("sun.jdbc.odbc.JdbcOdbcDriver"); // Geef het bestand aan voor de driver via ODBC // naar 'JavaWeb.mdb' odbc vooraf instellen // (control panel ODBC Data sources)! // Geef als naam JavaWeb en verwijs naar // de juiste directory. String sourceURL = "jdbc:odbc:JavaWeb"; // maak een connection via de DriverManager Connection databaseConnection = DriverManager.getConnection(sourceURL); // voer een sql statement uit Statement statement = databaseConnection.createStatement(); ResultSet result = statement.executeQuery("SELECT * FROM Gebruikers"); // toon de resultaten while (result.next()) { System.out.println("\"" + result.getString("Voornaam") + "\" \"" + result.getString("FamilieNaam") +
56
Servlets
K. Behiels – J. Gils
"\" "\"
\"" + result.getString("Gebruikersnaam") + \"" + result.getString("Wachtwoord") + "\"");
} statement.close(); databaseConnection.close();
}
} catch (ClassNotFoundException e) { System.out.println(e); } catch (SQLException e) { System.out.println(e); }
}
Dit geeft (indien succesvol) de volgende afdruk: "Jos" "Gils" "gils" "swordfish" "Erik" "Goossens" "goose" "matrix" "Theo" "Jansens" "jans" "sleeples" "Luc" "Lambrecht" "lam" "stigmata" "Ronny" "Verlinden" "ronny" "silence" "Kris" "Van Gompel" "gompy" "outbreak" "Els" "D'Heer" "d'heer" "o'cool" "Tom" "Van den Eede" "tom" "nightowl"
3.2
Enkele Servlet-toepassingen
3.2.1 Zoeken in een databasetabel • De klasse StringUtil /** hst3vb02 --- StringUtil.java * @author Kristiaan Behiels * @version 1.0 */ package myUtils; public class StringUtil { /** Deze methode verdubbelt de single quotes die * in een string, die in een SQL-uitdrukking zal * gebruikt worden, voorkomen. */ public static String fixSqlFieldValue(String value) { if (value == null) { return null; } int length = value.length(); StringBuffer fixedValue = new StringBuffer((int)(length * 1.1)); for (int i = 0; i < length; i++) { char c = value.charAt(i); if (c == '\'') {
K. Behiels – J. Gils
Servlets
57
fixedValue.append("''"); } else { fixedValue.append(c); } } return fixedValue.toString(); } /** Deze methode vervangt speciale tekens zodat ze * op de juiste wijze in de browser zullen getoond * worden. De HTML-tag wordt in een StringBuffer * geplaatst en elk van de volgende tekens wordt * als volgt vervangen: * '<' met "<" * '>' met ">" * '&' met "&" * '"' met """ * ' ' met " " */ public static String encodeHtmlTag(String tag) { if (tag == null) { return null; } int length = tag.length(); StringBuffer encodedTag = new StringBuffer(2 * length); for (int i = 0; i < length; i++) { char c = tag.charAt(i); if (c == '<') { encodedTag.append("<"); } else if (c == '>') { encodedTag.append(">"); } else if (c == '&') { encodedTag.append("&"); } else if (c == '"') { encodedTag.append("""); } else if (c == ' ') { encodedTag.append(" "); } else { encodedTag.append(c); } } return encodedTag.toString(); } }
• De eigenlijke servlet /** hst3vb02 --- SearchServlet.java * @author Kristiaan Behiels * @version 1.0 */
58
Servlets
K. Behiels – J. Gils
import java.io.*; import java.util.*; import java.sql.*; import javax.servlet.*; import javax.servlet.http.*; import myUtils.StringUtil; public class SearchServlet extends HttpServlet { private String zoekString = ""; public void init() { try { Class.forName("sun.jdbc.odbc.JdbcOdbcDriver"); System.out.println("JDBC driver geladen"); } catch (ClassNotFoundException e) { System.out.println(e.toString()); } } /** Verwerk de http-Get-request*/ public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { sendPageHeader(response); sendSearchForm(response); sendPageFooter(response); } /** Verwerk de http-Post-request*/ public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { zoekString = request.getParameter("keyword"); sendPageHeader(response); sendSearchForm(response); sendSearchResult(response); sendPageFooter(response); } /** Toon het resultaat */ void sendSearchResult(HttpServletResponse response) throws IOException { PrintWriter out = response.getWriter(); try { Connection connection = DriverManager.getConnection("jdbc:odbc:JavaWeb"); System.out.println("verbinding met database"); Statement statement = connection.createStatement(); out.println("
"); out.println(""); out.println("Voornaam | ");
K. Behiels – J. Gils
Servlets
59
out.println("Familienaam | "); out.println("Gebruikersnaam | "); out.println("Wachtwoord | "); out.println("
"); zoekString = StringUtil.fixSqlFieldValue(zoekString); String sqlString = "SELECT Voornaam, Familienaam, " + "Gebruikersnaam, Wachtwoord" + " FROM Gebruikers" + " WHERE Voornaam LIKE '%" + zoekString + "%'" + " OR Familienaam LIKE '%" + zoekString + "%'"; ResultSet result = statement.executeQuery(sqlString); while (result.next()) { out.println(""); out.println("" + StringUtil.encodeHtmlTag(result.getString(1)) + " | "); out.println("" + StringUtil.encodeHtmlTag(result.getString(2)) + " | "); out.println("" + StringUtil.encodeHtmlTag(result.getString(3)) + " | "); out.println("" + StringUtil.encodeHtmlTag(result.getString(4)) + " | "); out.println("
"); } statement.close(); connection.close();
} catch (SQLException e) { } catch (Exception e) { } out.println("
"); }
/** * Zend de HTML-pagina-header, inclusief de titel * en de -tag */ private void sendPageHeader(HttpServletResponse response) throws ServletException, IOException { response.setContentType("text/html"); PrintWriter out = response.getWriter(); out.println(""); out.println(""); out.println("<TITLE>Displaying Selected Record(s)"); out.println(""); out.println(""); out.println("
"); } /** Zend the HTML-pagina-footer */ private void sendPageFooter(HttpServletResponse response)
60
Servlets
K. Behiels – J. Gils
}
throws ServletException, IOException { PrintWriter out = response.getWriter(); out.println(""); out.println(""); out.println("");
/** Zend het zoekformulier */ * private void sendSearchForm(HttpServletResponse response) throws ServletException, IOException { PrintWriter out = response.getWriter(); out.println("
Zoekformulier
"); out.println("
Geef de voornaam, de familienaam " + "of een deel ervan."); out.println("
"); out.println("
"); out.println("
"); } }
Bij het invullen van de deelstring "en" ziet het er in de browser na het verzenden van de query zo uit:
Zoekformulier Geef de voornaam, de familienaam of een deel ervan. Naam:
Query verzenden
en
Voornaam Familienaam Gebruikersnaam Wachtwoord Erik
Goossens
goose
matrix
Theo
Jansens
jans
silence
Ronny
Verlinden
ronny
crash
Tom
Van den Eede tom
nightowl
3.2.2 Inloggen met gegevens uit een databasetabel /** hst3vb03 --- DataBaseLoginServlet.java * @author Kristiaan Behiels * @version 1.0 */ import java.io.*; import java.sql.*; import java.util.*; K. Behiels – J. Gils
Servlets
61
import javax.servlet.*; import javax.servlet.http.*; import myUtils.StringUtil; public class DataBaseLoginServlet extends HttpServlet { public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { sendLoginForm(response, false); } public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { String userName = request.getParameter("userName"); String password = request.getParameter("password"); if (login(userName, password)) { RequestDispatcher rd = request.getRequestDispatcher("WelcomeServlet"); rd.forward(request, response); } else { sendLoginForm(response, true); } } private void sendLoginForm(HttpServletResponse response, boolean withErrorMessage) throws ServletException, IOException { response.setContentType("text/html"); PrintWriter out = response.getWriter(); out.println(""); out.println(""); out.println("<TITLE>Login"); out.println(""); out.println(""); out.println("
"); if (withErrorMessage) { out.println("Login mislukt.
"); out.println("Gebruikersnaam of wachtwoord foutief.
"); } out.println("
"); out.println("
Login Pagina
"); out.println("
"); out.println("
Geef je gebruikersnaam en wachtwoord."); out.println("
"); out.println("
"); out.println(""); out.println(""); out.println(""); } boolean login(String userName, String password) { try { Class.forName("sun.jdbc.odbc.JdbcOdbcDriver"); Connection connection = DriverManager.getConnection("jdbc:odbc:JavaWeb"); System.out.println("geconnecteerd met database"); Statement statement = connection.createStatement(); userName = StringUtil.fixSqlFieldValue(userName); password = StringUtil.fixSqlFieldValue(password); String sqlString = "SELECT Gebruikersnaam FROM Gebruikers" + " WHERE Gebruikersnaam='" + userName + "'" + " AND Wachtwoord='" + password + "'"; ResultSet result = statement.executeQuery(sqlString); if (result.next()) { result.close(); statement.close(); connection.close(); return true; } result.close(); statement.close(); connection.close(); } catch (ClassNotFoundException e) { System.out.println(e.toString()); } catch (SQLException e) { System.out.println(e.toString()); } catch (Exception e) { System.out.println(e.toString()); } return false; } }
K. Behiels – J. Gils
Servlets
63
/** hst3vb03 --- WelcomeServlet.java * @author Kristiaan Behiels * @version 1.0 */ import java.io.*; import javax.servlet.*; import javax.servlet.http.*; public class WelcomeServlet extends HttpServlet { public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { response.setContentType("text/html"); PrintWriter out = response.getWriter(); out.println(""); out.println(""); out.println("<TITLE>Welkom"); out.println(""); out.println(""); out.println("
Welkom op de website van " + "Toegepaste Informatica.
"); out.println(""); out.println(""); } }
De login-pagina ziet er bijvoorbeeld als volgt uit:
Login Pagina Geef je gebruikersnaam en wachtwoord.
User Name:
goose
Password: Login
Indien login-naam en wachtwoord in de database gevonden worden krijgt de gebruiker het welkomscherm te zien, in het andere geval wordt de login-pagina herhaald met als extra bovenaan de volgende foutmelding: Login mislukt. Gebruikersnaam of wachtwoord foutief.
3.2.3 Gegevens in een database toevoegen /** hst3vb04 --- RegistrationServlet.java * @author Kristiaan Behiels * @version 1.0 */ import java.io.*; 64
Servlets
K. Behiels – J. Gils
import java.sql.*; import java.util.*; import javax.servlet.*; import javax.servlet.http.*; import myUtils.StringUtil; public class RegistrationServlet extends HttpServlet { private private private private
String String String String
voornaam = ""; familienaam = ""; gebruikersnaam = ""; wachtwoord = "";
public void init() { try { Class.forName("sun.jdbc.odbc.JdbcOdbcDriver"); System.out.println("JDBC driver geladen"); } catch (ClassNotFoundException e) { System.out.println(e.toString()); } } public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { sendPageHeader(response); sendRegistrationForm(request, response, false); sendPageFooter(response); } public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { sendPageHeader(response); voornaam = request.getParameter("voornaam"); familienaam = request.getParameter("familienaam"); gebruikersnaam = request.getParameter("gebruikersnaam"); wachtwoord = request.getParameter("wachtwoord"); boolean error = false; String message = null; try { Connection connection = DriverManager.getConnection( "jdbc:odbc:JavaWeb"); System.out.println("verbinding met database"); Statement statement = connection.createStatement(); String sqlString = "SELECT Gebruikersnaam FROM Gebruikers" + " WHERE gebruikersnaam='" + StringUtil.fixSqlFieldValue(gebruikersnaam) + "'"; ResultSet result = statement.executeQuery(sqlString);
K. Behiels – J. Gils
Servlets
65
if (result.next()) { result.close(); message = "De gebruikersnaam
" + StringUtil.encodeHtmlTag(gebruikersnaam) + " bestaat reeds. Kies een andere naam a.u.b."; error = true; } else { result.close(); sqlString = "INSERT INTO Gebruikers" + " (Voornaam, Familienaam, Gebruikersnaam, Wachtwoord)" + " VALUES" + " ('" + StringUtil.fixSqlFieldValue(voornaam) + "'," + " '" + StringUtil.fixSqlFieldValue(familienaam) + "'," + " '" + StringUtil.fixSqlFieldValue(gebruikersnaam) + "'," + " '" + StringUtil.fixSqlFieldValue(wachtwoord) + "')"; int i = statement.executeUpdate(sqlString); if (i == 1) { message = "Nieuw gebruiker succesvol toegevoegd."; } } statement.close(); connection.close(); } catch (SQLException e) { message = "Error." + e.toString(); error = true; } catch (Exception e) { message = "Error." + e.toString(); error = true; } if (message!=null) { PrintWriter out = response.getWriter(); out.println("
" + message + ""); out.println("
"); } if (error==true) sendRegistrationForm(request, response, true); else sendRegistrationForm(request, response, false); sendPageFooter(response); } private void sendPageHeader(HttpServletResponse response) throws ServletException, IOException { response.setContentType("text/html"); PrintWriter out = response.getWriter(); out.println(""); out.println(""); out.println("<TITLE>Registratiepagina"); out.println(""); out.println("");
66
Servlets
K. Behiels – J. Gils
out.println("
"); } private void sendPageFooter(HttpServletResponse response) throws ServletException, IOException { PrintWriter out = response.getWriter(); out.println(""); out.println(""); out.println(""); } private void sendRegistrationForm(HttpServletRequest request, HttpServletResponse response, boolean displayPreviousValues) throws ServletException, IOException { PrintWriter out = response.getWriter(); out.println("
Registratiepagina
"); out.println("
Vul de gevraagde gegevens in a.u.b."); out.println("
"); out.println("
"); out.println("
"); out.println("
");
}
Bij het opstarten van de servlet zie je in de browser het volgende:
Registratiepagina Vul de gevraagde gegevens in a.u.b.
Voornaam Familienaam Gebruikersnaam Wachtwoord Beginw aarden
68
Query verzenden
Servlets
K. Behiels – J. Gils
Besluit Via JDBC maak je verbindingen tussen een Java-programma en externe databases. De belangrijkste onderdelen daarvan bevinden zich in de java.sql-package. Om toegang tot een database te krijgen moet je eerst de JDBC-database-driver laden en vervolgens verbinding maken met de database via een Connection-object. Daarnaast zijn er methoden om een SQL-uitdrukking te maken, een query uit te voeren en de resultaten te verwerken.
Wat je moet kennen en kunnen: • • •
verbinding maken met een database vanuit servlet-toepassingen; in de database gegevens opzoeken, toevoegen en wijzigen; een login op basis van database gegevens in toepassingen voorzien.
Opdracht Voor deze opgave mag je gebruik maken van de klassen Adres en AdresBoek. De laatste klasse bevat al enkele adressen en is een voorbeeld van de toepassing van het singleton pattern. In eerste instantie is dit geen database toepassing, het is de bedoeling om eerst een werkend geheel te krijgen en dit later aan een database te koppelen. Stap 1: Maak een welkom HTML-bestandje met de naam index.html in de volgende aard: Welkom bij
Adresboek
Enter
De link <ENTER> moet verwijzen naar een servlet met de naam MENU. Stap 2: Maak een servlet met de naam Menu dat er ongeveer als volgt uitziet:
Adresboek
Wat wil je doen?
Overzicht Zoeken Toevoegen Stoppen
K. Behiels – J. Gils
Servlets
69
De verschillende links moet verwijzen naar servlets, OVERZICHT naar TOONADRESSEN, Zoeken naar ZOEKADRES en TOEVOEGEN naar VOERADRESIN. Via de link STOPPEN ga je terug naar de welkompagina. Stap 3: Maak een servlet met de naam VOERADRESIN. Wanneer je hem uitvoert moet je (ongeveer) het volgende op het scherm bekomen: Nieuw adres
Naam: Straat: Postnummer:
Gemeente:
Voeg Toe
Er moet een controle op de invoer zijn. Alle velden moeten ingevuld zijn en de waarde van het postnummer moet tussen 1000 en 10000 liggen. Bij foutieve of niet ingevulde waarden krijg je het scherm terug met vermelding van de bewuste velden. Een voorbeeldje: Nieuw adres De volgende velden werden niet of foutief ingevuld: Straat Postnummer Verbeter a.u.b.
Naam:
Jos
Straat: Postnummer:
900
Gemeente:
Gent
Voeg toe
Dit krijg je te zien als je naast ‘Naam’ 'Jos', naast ‘Straat’ niets, naast ‘PostNummer’ '900' en naast ‘Gemeente’ 'Gent' invult. Na het verzenden moet je terug naar het menu gaan. Stap 4: Schrijf de servlet ToonAdressen, het resultaat (indien je nog geen adres hebt toegevoegd) moet ongeveer het volgende zijn:
70
Servlets
K. Behiels – J. Gils
Overzicht adressen
Naam
Straat
PostNr
Gemeente
Bachus, Lieve
Dambruggestraat 6
2000
Antwerpen
De Maeght, Maria
Plezantstraat 4
9100
Sint-Niklaas
De Pauw, Bart
Koekkoekstraat 70
9090
Melle
De Vos, Erik
Schoonmeersstraat 16
9000
Gent
Van Roy, Jean-Pierre
Rozier 5
1000
Brussel
Verlinden, Ronny
Warande 14
9230
Wetteren
terug De hyperlink brengt je terug naar het menu(servlet). Stap 5: Schrijf de servlet ZoekAdres, het beginbeeld in de browser moet er ongeveer als volgt uitzien: Zoek een adres
Naam:
Bachus, Lieve
Zoek
In het midden zie je een keuzelijst waarbij, als je hem uitpakt, alle aanwezige namen getoond worden. Bij het selecteren van een naam (bijvoorbeeld De Pauw, Bart) krijg je een nieuw scherm met de volgende inhoud: Adres gevonden:
Naam:
De Pauw , Bart
Straat:
Koekkoekstraat 70
Postnummer:
9090
Verw ijderen
Gemeente: Wijzigen
Melle
Terug
Voorlopig moet alleen de knop Terug werken, hij moet je terug naar het menu brengen. Stap 6: Zorg er nu voor dat de knoppen Verwijderen en Wijzigen ook werken.
K. Behiels – J. Gils
Servlets
71