Objectgeoriënteerd Programmeren en Webapplicaties



Vergelijkbare documenten
Info-books. Toegepaste Informatica. Objectgeoriënteerd Programmeren en Webapplicaties. Java voor het internet: Persistentie en Threads.

Correspondentie inzake overnemen of reproductie kunt u richten aan:

Correspondentie inzake overnemen of reproductie kunt u richten aan:

Practicum Orientatie op Webserver

Technische nota AbiFire Rapporten maken via ODBC

INFITT01 - Internettechnologie WEEK 8

Technische nota AbiFire5 Rapporten maken via ODBC

Databases - Inleiding

Ingebouwde klassen & methodes

Universiteit van Amsterdam FNWI. Voorbeeld van tussentoets Inleiding programmeren

NAAM: Programmeren 1 Examen 29/08/2012

Formulieren maken met Dreamweaver CS 4/CS 5

8. Koppeling met een database

Les 11 : Basis SQL (deel2).

Koppeling met een database

Dynamische webapplicaties in Java

Tentamen Imperatief Programmeren

PHP en een MySQL database.

eerste voorbeelden in Java

Een fragment wordt afgeleid van de basis klasse "Fragment".

Kwis (3) class X { public void a() { System.out.println("x"); public static void main(string[] args) { X x = new X();

ASP.NET Test Jan Van Ryckeghem

Katholieke Hogeschool Kempen ASP

Verslag. Projectteam: 107 Datum: 16 oktober 2008 Project leden: Lennard Fonteijn Harish Marhe Nicoletta Saba Turgay Saruhan Robin Tummers

SQL manipulatietaal. We kunnen er data mee toevoegen, wijzigen en verwijderen uit een database.

Tentamen Imperatief en Object-georiënteerd programmeren in Java voor CKI

Een stoomcursus door Edgar de Graaf, november 2006

SQL is opgebouwd rond een basisinstructie waaraan één of meerdere componenten worden toegevoegd.

Objectgericht programmeren 1.

De MySQL C API. Variabelen in C Functies in C Pointers in C

Open SQL Server Management Studio en log in als Administator. Je ziet dan wat je in figuur 2.1 ziet.

Programmeren 1 23 januari 2013 Prof. T. Schrijvers

Game of Life in Java

Kies File>New>Blank Page>PHP. Je kunt eventueel nog een stylesheet koppelen. Definieer nu eerst een site! Dat betekent: Site>New Site

Tentamen Object Georiënteerd Programmeren TI oktober 2014, Afdeling SCT, Faculteit EWI, TU Delft

voegtoe: eerst methode bevat gebruiken, alleen toevoegen als bevat() false is

Les 9: formulier controle met javascript.

Dynamische Websites. Week 6. vrijdag 25 oktober 13

Les 15 : updaten van gegevens in de database (deel2).

Zelftest Programmeren in Java

Voor de database wordt een Access 2000 bestand gebruikt, met voorlopig 1 tabel:

Figuur 1 HTML-pagina opvragen

Een website maken met databasetoegang.

Stappenplannen MailPlus SOAP API

Voorbeeldtentamen Inleiding programmeren (IN1608WI), Oktober 2003, , Technische Universiteit Delft, Faculteit EWI, Afdeling 2.

Hoofdstuk 6. PHP Data Objects. Cursus PHP & MySQL Groep D

Kleine cursus PHP5. Auteur: Raymond Moesker

Acht stappen voor JSF

Dit kan gebruikt worden in zowel een ASP.NET web applicatie als een desktop applicatie.

DOMjudge teamhandleiding

Modelleren en Programmeren

IMP Uitwerking week 13

Beheer van databanken

Werken op afstand via internet

Teamhandleiding DOMjudge (versie 2.2.0muKP) 31 mei 2008

public Paneel() { knop = new JButton( Klik ); knop.addactionlistener( new KnopHandler() ); tekstvak = new JTextField(10); add(knop); add(tekstvak);

MA!N Rapportages en Analyses


Inhoudsopgave. versie 0.8

NAAM: Programmeren 1 Examen 21/01/2011

[TOETS SQL INLEIDING]

Installatiehandleiding TiC Narrow Casting Manager

Tentamen in2705 Software Engineering

Vervang UW SERVERNAAM, UW SERVERNAAM ZONDER VPN en COMPUTERNAAM door de naam van de server en computer welke wij u doorgegeven hebben.

Query SQL Boekje. Fredrik Hamer

Info-books. Toegepaste Informatica. Handleiding. Deel 40c : Gegevensbeheer en algoritmen in Access. HA40c. Jos Gils Erik Goossens

Overerving & Polymorfisme

Handleiding

16. Web Station. In dit hoofdstuk komen de volgende onderwerpen aan bod:

Secure Application Roles

Met een LightSwitch applicatie een OData service uit de Windows Azure Marketplace consumeren

Installatie King Task Centre

Hoe - adressen in uw website opladen en bewaren?

Op de Virtual Appliance is MySQL voorgeïnstalleerd. MySQL is momenteel de meest gebruikte database op het internet.

Sparse columns in SQL server 2008

Die vraag krijg ik regelmatig. De meest voorkomende situaties zijn deze:

Een topprogrammeur in het OO programmeren is Graig Larman. Hij bedacht de volgende zin:

Handleiding IDEP: Inlezen gegevens; meerdere stromen/periodes/aangevers

AFO 142 Titel Aanwinsten Geschiedenis

Installatie en configuratie documentatie

Elementary Data Structures 3

Tentamen Objectgeorienteerd Programmeren

Syntra-West. Syntra-West Doorniksesteenweg Kortrijk Tel. 056/ Fax 056/

DBMS. DataBase Management System. Op dit moment gebruiken bijna alle DBMS'en het relationele model. Deze worden RDBMS'en genoemd.

Installatie SQL Server 2014

Programmeren (1) Examen NAAM:

ODS: Open Directory service. Wat is ODS?

BASIS- INRICHTING ORBIS TASKCENTRE 4.7

Tentamen Objectgeorienteerd Programmeren IN1205 Voorbeeld

SPOJ oplossingen Gilles Callebaut 7 augustus 2015

Transcriptie:

Info-books HO40c Toegepaste Informatica Objectgeoriënteerd Programmeren en Webapplicaties Deel 40c: Java voor het internet: Servlets K. Behiels - J. Gils

Hoofdstuk 3 JDBC 3.1 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 Gebruikersnaam Wachtwoord 1 Jos Gils gils swordfish 2 Erik Goossens goose matrix 3 Theo Jansens jans sleeples 4 Luc Lambrecht lam stigmata 5 Ronny Verlinden ronny silence 6 Kris Van Gompel gompy outbreak 7 Els D'Heer d'heer o'cool 8 Tom Van den Eede 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) sendpageheader(response); sendsearchform(response); sendpagefooter(response); /** Verwerk de http-post-request*/ public void dopost(httpservletrequest request, HttpServletResponse response) 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("<table BORDER=1>"); out.println("<tr>"); out.println("<th>voornaam</th>"); K. Behiels J. Gils Servlets 59

out.println("<th>familienaam</th>"); out.println("<th>gebruikersnaam</th>"); out.println("<th>wachtwoord</th>"); out.println("</tr>"); 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("<tr>"); out.println("<td>" + StringUtil.encodeHtmlTag(result.getString(1)) + "</TD>"); out.println("<td>" + StringUtil.encodeHtmlTag(result.getString(2)) + "</TD>"); out.println("<td>" + StringUtil.encodeHtmlTag(result.getString(3)) + "</TD>"); out.println("<td>" + StringUtil.encodeHtmlTag(result.getString(4)) + "</TD>"); out.println("</tr>"); statement.close(); connection.close(); catch (SQLException e) { catch (Exception e) { out.println("</table>"); /** * Zend de HTML-pagina-header, inclusief de titel * en de <BODY>-tag */ private void sendpageheader(httpservletresponse response) response.setcontenttype("text/html"); PrintWriter out = response.getwriter(); out.println("<html>"); out.println("<head>"); out.println("<title>displaying Selected Record(s)</TITLE>"); out.println("</head>"); out.println("<body>"); out.println("<center>"); /** Zend the HTML-pagina-footer */ private void sendpagefooter(httpservletresponse response) 60 Servlets K. Behiels J. Gils

PrintWriter out = response.getwriter(); out.println("</center>"); out.println("</body>"); out.println("</html>"); /** Zend het zoekformulier */ * private void sendsearchform(httpservletresponse response) PrintWriter out = response.getwriter(); out.println("<br><h2>zoekformulier</h2>"); out.println("<br>geef de voornaam, de familienaam " + "of een deel ervan."); out.println("<br>"); out.println("<br><form METHOD=POST>"); out.print("naam: <INPUT TYPE=TEXT Name=keyword"); out.println(" VALUE=\"" + StringUtil.encodeHtmlTag(zoekString) + "\""); out.println(">"); out.println("<input TYPE=SUBMIT>"); out.println("</form>"); out.println("<br>"); 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: en Query verzenden 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) sendloginform(response, false); public void dopost(httpservletrequest request, HttpServletResponse response) 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) response.setcontenttype("text/html"); PrintWriter out = response.getwriter(); out.println("<html>"); out.println("<head>"); out.println("<title>login</title>"); out.println("</head>"); out.println("<body>"); out.println("<center>"); if (witherrormessage) { out.println("login mislukt.<br>"); out.println("gebruikersnaam of wachtwoord foutief.<br>"); out.println("<br>"); out.println("<br><h2>login Pagina</H2>"); out.println("<br>"); out.println("<br>geef je gebruikersnaam en wachtwoord."); out.println("<br>"); out.println("<br><form METHOD=POST>"); out.println("<table>"); out.println("<tr>"); out.println("<td>user Name:</TD>"); out.println("<td><input TYPE=TEXT NAME=userName></TD>"); 62 Servlets K. Behiels J. Gils

out.println("</tr>"); out.println("<tr>"); out.println("<td>password:</td>"); out.println("<td><input TYPE=PASSWORD NAME=password></TD>"); out.println("</tr>"); out.println("<tr>"); out.println("<td ALIGN=RIGHT COLSPAN=2>"); out.println("<input TYPE=SUBMIT VALUE=Login></TD>"); out.println("</tr>"); out.println("</table>"); out.println("</form>"); out.println("</center>"); out.println("</body>"); out.println("</html>"); 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) response.setcontenttype("text/html"); PrintWriter out = response.getwriter(); out.println("<html>"); out.println("<head>"); out.println("<title>welkom</title>"); out.println("</head>"); out.println("<body>"); out.println("<p>welkom op de website van " + "Toegepaste Informatica.</P>"); out.println("</body>"); out.println("</html>"); De login-pagina ziet er bijvoorbeeld als volgt uit: Login Pagina Geef je gebruikersnaam en wachtwoord. User Name: Password: goose 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: 3.2.3 Gegevens in een database toevoegen Login mislukt. Gebruikersnaam of wachtwoord foutief. /** 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 String voornaam = ""; private String familienaam = ""; private String gebruikersnaam = ""; private String 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) sendpageheader(response); sendregistrationform(request, response, false); sendpagefooter(response); public void dopost(httpservletrequest request, HttpServletResponse response) 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 <B>" + StringUtil.encodeHtmlTag(gebruikersnaam) + "</B> 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("<b>" + message + "</B><BR>"); out.println("<hr><br>"); if (error==true) sendregistrationform(request, response, true); else sendregistrationform(request, response, false); sendpagefooter(response); private void sendpageheader(httpservletresponse response) response.setcontenttype("text/html"); PrintWriter out = response.getwriter(); out.println("<html>"); out.println("<head>"); out.println("<title>registratiepagina</title>"); out.println("</head>"); out.println("<body>"); 66 Servlets K. Behiels J. Gils

out.println("<center>"); private void sendpagefooter(httpservletresponse response) PrintWriter out = response.getwriter(); out.println("</center>"); out.println("</body>"); out.println("</html>"); private void sendregistrationform(httpservletrequest request, HttpServletResponse response, boolean displaypreviousvalues) PrintWriter out = response.getwriter(); out.println("<br><h2>registratiepagina</h2>"); out.println("<br>vul de gevraagde gegevens in a.u.b."); out.println("<br>"); out.println("<br><form METHOD=POST>"); out.println("<table>"); out.println("<tr>"); out.println("<td>voornaam</td>"); out.print("<td><input TYPE=TEXT Name=voornaam"); if (displaypreviousvalues) out.print(" VALUE=\"" + StringUtil.encodeHtmlTag(voornaam) + "\""); out.println("></td>"); out.println("</tr>"); out.println("<tr>"); out.println("<td>familienaam</td>"); out.print("<td><input TYPE=TEXT Name=familienaam"); if (displaypreviousvalues) out.print(" VALUE=\"" + StringUtil.encodeHtmlTag(familienaam) + "\""); out.println("></td>"); out.println("</tr>"); out.println("<tr>"); out.println("<td>gebruikersnaam</td>"); out.print("<td><input TYPE=TEXT Name=gebruikersnaam"); if (displaypreviousvalues) out.print(" VALUE=\"" + StringUtil.encodeHtmlTag(gebruikersnaam) + "\""); out.println("></td>"); out.println("</tr>"); out.println("<tr>"); out.println("<td>wachtwoord</td>"); out.print("<td><input TYPE=PASSWORD Name=wachtwoord"); if (displaypreviousvalues) out.print(" VALUE=\"" K. Behiels J. Gils Servlets 67

+ StringUtil.encodeHtmlTag(wachtwoord) + "\""); out.println("></td>"); out.println("</tr>"); out.println("<tr>"); out.println("<td><input TYPE=RESET></TD>"); out.println("<td><input TYPE=SUBMIT></TD>"); out.println("</tr>"); out.println("</table>"); out.println("</form>"); out.println("<br>"); out.println("<br>"); 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 Query verzenden 68 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: Straat: Jos 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 Gemeente: Melle Verw ijderen Wijzigen 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