Wir haben uns verirrt, kommen aber gut voran.
Tom DeMarco

Mit der SQL Tag Library wird die Möglichkeit geschaffen, direkt in JSPs auf Datenbanken zuzugreifen. Es ist allerdings schon sehr merkwürdig, dass diese Bibliothek den Weg in die JSTL geschafft hat. Da wurde bisher immer wieder von MVC also Möglichkeit eines sauberen Designs mit einer Trennung von Darstellungsschicht, Modell und Businesslogik betont, aber hier das direkte Durchgreifen über alle Schichtgrenzen hinweg auf eine Datenbank erlaubt. Ich lasse dies hier einfach im Raum stehen.  Ich stelle hier nur die die einzelnen Taghandler mit den wichtigen Attributen vor:

SQL TagBedeutung
transactionStellt eine DB Transaktion bereit
queryFührt eine Datenbank-Abfrage durch (SELECT etc.)
updateFür Änderungsanfragen an die Datenbank aus (INSERT, UPDATE, DELETE)
paramSetzt einen Abfrageparameter auf den angegebenen Wert
dateParamSetzt Datums- und/oder Zeitparameter auf den angegebenen Wert. Der Wert muss vom Typ java.util.Date sein
setdataSourceLegt ein javax.sql.DataSource Objekt in einer Variablen ab. Im Prinzip eine Connection.

<sql:transaction>

AttributPflichtfeldBedeutung
dataSourceneinGibt die DataSource an, die verwendet werden soll. Es können hier auch JNDI Bezeichnungen als Strings übergeben werden um auf einen Connection Pool zu verweisen.
isolationneinDer gewünschte Isolationslevel. Wenn dieser leer gelassen wird, ist es der standardmäßig für diese Datenquelle definierte. Mögliche Werte sind „read_uncommitted“, „read_committed“, „repeatable_read“ und „serializable“

Dieses Tag bildet eine Transaktion für <sql:query> oder<sql:update> -Tags.

<sql:query>

AttributPflichtfeldBedeutung
varjaDer Variablen Name, quasi das Resultset unter dem das Ergebnis der SQL-Abfrage abgelegt werden soll
scopeneinDer gewünschte Gültigkeitsbereich für die unter dem Attribut „var“ angegebene Variable
dataSourceneinGibt die Data Source an, die verwendet werden soll in Form einer JDBC Url. Es kann auch wie oben Beschrieben eine JNDI Bezeichnung mit Ziel eines Connection Pools als String angegeben werden.
sqlneinDas abzusetzende Statement. Es kann auch im Body des Tags angegeben werden.
startRowneinGibt die erste gewünschte Zeile des Abfrageergebnisses. Für eine Darstellung die Seitenweise die Menge der Abfrageergebnisse darstellt.
maxRowsneinDie maximale Anzahl der Ergebnisse, die die Abfrage liefern soll. Auch hier gilt die Überlegung das Daten Seitenweise dargestellt werden können.

Dieses Tag wird für Abfragen an die Datenbank genutzt. Das Ergebnis wird in einem Objekt vom Typ javax.servlet.jsp.jstl.sql.Result abgelegt. Der Name, unter dem dieses Objekt abgelegt werden soll, bildet das wichtige Pflicht-Attribut des Tags.

<sql:update>

AttributPflichtfeldBedeutung
varneinDer Name, unter dem das Ergebnis der SQL-Abfrage abgelegt werden soll. Das Ergebnis ist vom Typ java.lang.Integer und gibt die Anzahl der veränderten bzw. neu hinzugefügten Reihen in der veränderten Tabelle an
scopeneinDer Gültigkeitsbereich für die unter dem Attribut „var“ angegebene Variable.
dataSourceneinGibt die Data Source an, die verwendet werden soll. Dies muss entweder eine Variable vom Typ Data Source sein oder ein String, der einen JNDI-Pfad oder die JDBC-DriverManager-Parameter enthält.
sqlneinDas abzusetzende Statement. Wird dieses Attribut nicht genutzt, so ist der Body des Tags für das gewünschte SQL-Statement zu nutzen

Das Update Tag nimmt Veränderungen an der DB vor. Auch wenn der Tag <sql:update> lautet, kann dieser Taghandler neben dem UPDATE Statements auch für INSERT- und DELETE Statements genutzt werden

<sql:param>

AttributPflichtfeldBedeutung
valueneinDer gewünschte Wert für den Parameter

Die <sql:update>– und <sql:insert>-Tags können wie ein Prepared Statements Parameter annehmen. Dabei spielt die Reihenfolge beim jeweiligen SQL-Statement, wie auch bei der normalen Java Programmierung ein wichtige Rolle. Der gewünschte Wert kann sowohl im „value“-Attribut oder im Body des Tags angegeben werden

<sql:dateParam>

AttributPflichtfeldBedeutung
valuejaDer gewünschte Wert für den Parameter
typeneinDer Typ des Attributs. Kann „date“, „time“ oder „timestamp“ sein

Mit dem <sql:param>-Tag kann man dem Statement bspw. Zahlen oder String-Parameter hinzufügen. Für Datumswerte muss hingegen dieser Tag verwendet werden. Der Wert des Parameter muss – im Unterschied zum <sql:param>-Tag – zwingend im „value“-Attribut angegeben werden.

<sql:setDataSource>

AttributPflichtfeldBedeutung
varneinDer Name, unter dem die Datasource-Variable abgelegt werden soll. Wird dieser nicht angegeben, wird die Datenquelle unter dem Namen „javax.servlet.jsp.jstl.sql.dataSource“ abgelegt
scopeneinDer gewünschte Gültigkeitsbereich für die unter dem Attribut „var“ angegebene DataSource
dataSourceneinGibt die DataSource an, die verwendet werden soll. Dies muss entweder eine Variable vom Typ Datasource sein oder ein String, der einen JNDI-Pfad oder die JDBC-DriverManager-Parameter enthält.
driverneinDer Name des zu verwendenden JDBC-Drivers
urlneinDie jdbc URL, unter der die DB erreichbar ist
userneinDer Loginname, der für die DB-Zugriffe verwendet wird
passwordneinDas passende Passwort zum verwendeten Loginnamen

Dieses Tag legt fest, gegen welche Datenbank die Abfragen gehen sollen. Das Attribut „dataSource“ enthält. Zunächst einmal kann dieses Attribut ein Objekt vom Typ javax.sql.DataSource entgegen nehmen. Alternativ kann man einen String angeben. Dieser kann entweder ein relativer Pfad auf eine JNDI-Ressource sein oder eine kompakte Form der anderen Driver spezifischen Attribute dieses Tags.
Nutzt man den gerade beschriebenen DataSource-String oder die JDBC-relevanten Parameter, so wird ein java.sql.DriverManager-Objekt erzeugt, das keinerlei Connection-Pooling-Fähigkeiten mitbringt. Bei produktiven Anwendungen sollte immer mittels des JNDI-Pfads auf eine im Container konfigurierten Connection Pool (DataSource) zugegriffen werden.

Ein praktisches Beispiel für ein lesenden Datenbankzugriff. Es wird hier auf die Beispieldatenbank Sample, die bei einer Netbeans Installation immer mit installiert wird, zugegriffen. Ganz genau auf die Tabelle Customer.

<%@page contentType=“text/html“ pageEncoding=“UTF-8″%>
%@taglib prefix=“c“ uri=“http://java.sun.com/jsp/jstl/core“ %
%@taglib prefix=“sql“ uri=“http://java.sun.com/jsp/jstl/sql“ %
<!DOCTYPE html>
<html>
  <head>
    <meta http-equiv=“Content-Type“ content=“text/html; charset=UTF-8″>
    <title>JSTL-SQL – Example</title>
  </head>
<body>
       <sql:setDataSource driver=“org.apache.derby.jdbc.ClientDriver“
                          url=“jdbc:derby://localhost:1527/sample“
                          user=“app“
                          password=“app“
                          var=“con“
                          scope=“request“ />
       <sql:query dataSource=“${con}“
                  var=“result“
                  maxRows=“10″
                  startRow=“0″
                  sql=“Select * from customer“ />
 <table>
  <tr>
   <c:forEach items=“${result.columnNames}“ var=“column“>
      <th style=“border: 1px solid #000000; padding: 5px;“>${column}</th>
   </c:forEach>
  </tr>
    <c:forEach items=“${result.rows}“ var=“currRow“>
  <tr>
    <c:forEach items=“${result.columnNames}“ var=“column“>
       <td style=“border: 1px solid #000000; padding: 5px;“>
       ${currRow[column]}</td>
    </c:forEach>
  </tr>
    </c:forEach>
  </table>
</body>
</html>


0 Kommentare

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert.

Diese  Website nutzt Cookys. Wenn Du Sie nicht haben willst, klicke hier. Hier klicken um dich auszutragen.