Till startsida för Björns studiewebb

Java Servlets och databaskopplingar

Inledning

Denna sida beskriver hur man hämtar data från en databas och presenterar på en genererad HTML-sida samt hur man sparar information från ett formulär i databasen. Du bör ha en grundläggande förståelse för hur servlets fungerar innan du läser informationen på denna hemsida.

Denna hemsida hur databaskopplingar kan ske med Microsoft Access (genom ODBC), hur man skickar en parameter till en fråga i Access samt mot Oracle (det senare är under uppbyggnad).

Innehåll

Databaskopplingar med ODBC

Databaskopplingar från en servlet skiljer sig inte så mycket från de i en vanlig Java-applikation. Den "stora" skillnaden är att en servlet exekverar på en server (inte besökarens dator) och att det, om ni använder ODBC, måste finnas en ODBC-källa på servern (inte klienten). Ladda hem den fullständiga koden samt Access-databasen. 

Exemplen nedan bygger på ODBC men skulle lika gärna fungera med andra drivrutiner för er databas. Orsaken till att ODBC-används i exemplen är att det inte finns någon (gratis) JDBC-drivrutin till Microsoft Access men dock en för ODBC. Även skälet att många studenter har just Microsoft Access hemma och den är enkel att transportera gör det till en lämplig databas att använda för utbildning. Generellt sätt är inte ODBC att rekommendera då databastillverkarens JDBC-drivrutiner ofta är snabbare (och har mer funktionalitet) än ODBC.

Hämtar information från databas

Som nämnts ovan så är inte databaskopplingar i en servlet något annorlunda, vilket detta exempel ska visa. Nedan finns två länkar: en som visar en hemsida med koden för servlet och en som anropar servlet (visar resultatet av exekveringen).

Anropa servlet från formulär och lägg till data från formulär

Att anropa en servlet istället för t.ex. en ASP-sida från ett HTML-formulär skiljer sig inte så mycket. Skillnaden ligger i att vi anger URL:en till servlet istället för en ASP-fil.

Skapa ett formulär. Ange sökvägen till servlet i FORM-taggens attribut ACTION. T.ex.

ACTION="/vXX/servlet/ServletNamn"

Det går bra att placera formuläret var som helst under gruppens huvudmapp (vXX) så länge som URL:en i attributet ACTION är absolut (d.v.s. sökvägen bör börjar med "/"). OBS! Ni bör undvika att placera HTML-/ASP-filer i mappen WEB-INF och dess undermappar!

Nedan finns tre länkar: en som visar hemsida med koden för HTML-formuläret, en som visar en hemsida med koden för servlet och en som visar själva formuläret (som i sin tur anropar servlet).


| Till början på sida |


Skicka parameter till en fråga i Access

Ibland kan det vara praktiskt att skapa en fråga man använder ofta i Access eftersom databashanterare ofta brukar hantera detta effektivare än om den får en SQL-sats. Om man sen vill (dynamiskt) kunna ange vilket värde som ska användas för att sortera ut posterna kan man skicka en parameter till frågan. För detta använder vi klassen CallableStatement istället för Statement som i exemplet ovan.

För att använda klassen CallableStatement måste vi tala om vilken fråga (i Access) vi vill använda och vad värdet på parametern är. Det tidigare gör vi med följande sats där vi skapar en instans av klassen CallableStatement.

CallableStatement cst = con.prepareCall("{call qryAlbumForArtist(?)}");

Frågetecken ("?") i strängen anger hur många parametrar vi vill skicka till frågan (en i  vårt fall ovan). Nästa steg är att tala om vad värdet på parametern ska vara och eftersom vi vill skicka en sträng så använder vi följande sats.

cst.setString(1, "Tina Turner");

Metoden setString() talar om att det är en sträng vi vill använda som parameter. Det finns metoder för att ange heltal (setInt()), decimaltal (setFloat()), m.m.. Som parametrar till metoderna setXXX() skickar vi vilken parameter (börjar numreras på 1!) och själva värdet för parametern. Så i satsen ovan så vill vi att parameter 1 (den enda) till frågan ska ha värdet "Tina Turner". Hade vi haft fler parametrar till frågan så hade dessa varit 2, 3, o.s.v. och vi hade behövt göra ett anrop av en setXXX()-metod för varje parameter.

Nästa steg är att köra frågan. Eftersom frågan returnerar poster (d.v.s. ett ResultSet-objekt) så använder vi metoden executeQuery() och tilldelar resultatet till en variabel.

ResultSet rs = cst.executeQuery();

I detta exempel kommer vi använda ett HTML-formulär där besökaren fyller i namnet på artisten/gruppen som han/hon vill se album för. Vår serlvet, DBListParameter, läser artistens/gruppens namn och skickar det som parameter till frågan qryAlbumForArtist.

Koden är i stort sett den samma som för klassen DBList ovan - skillnaden ligger i början på try-catch-blocket där vi använder oss av frågan i Access istället för en SQL-sats om besökaren fyllt i textrutan i formuläret.

Kommentar till exemplet

Om vi inte vill göra en fråga i databasen så skulle vi kunna använda följande kod istället.

CallableStatement cst =
    con.prepareCall("SELECT * FROM tblAlbum WHERE Artist = '?'");

cst.setString(1, "Tina Turner");
ResultSet rs = cst.executeQuery();


| Till början på sida | Tillbaka till Java |