![]() |
![]() |
|||
| Aufgaben Dokus Links | ||||
|
Heute werden wir die Technologien Java Servlets und Java DataBase Connectivity betrachten. In der zweiten Aufgabe zum Thema "Redaktionssystem" soll die (mithilfe von JSPs und JavaBeans in der letzten Woche erzeugte) Artikelliste in einer Datenbank gespeichert werden. Diese Aufgabe soll ein Servlet übernehmen. Außerdem sollt Ihr die von den Benutzern gemachten Eingaben auf "SQL-Injection" überprüfen.
| Allgemeines vorweg
In der letzten Aufgabe haben wir nur mit JSP-Seiten gearbeitet und dort sowohl (X)HTML-Ausgabe als auch Programmlogik untergebracht. Jetzt arbeiten wir weiterhin mit JSP-Seiten zur (X)HTML-Ausgabe, lagern die Programmlogik allerdings in ein Servlet aus. Jede aufgerufene Seite sollte also aus JSP-Seite und zugehörigem Servlet bestehen. Verlinkt wird ausschließlich auf das Servlet (auch in HTML-Forms) und das Servlet initiiert eine serverinterne Weiterleitung (dispatching) auf die JSP-Seite. |
| 1. Erstellt ein Servlet zum Anzeigen der Artikel
Erstellt ein Servlet, welches die Artikelliste aus der Datenbank lädt, diese Daten aufbereitet und auf eine JSP-Seite weiterleitet, welche die Daten anzeigt. Dazu benutzt Ihr das JavaBean Artikelliste und die JSP-Seite artikelliste.jsp, welche Ihr in der letzten Aufgabe erstellt habt. Stellt beim Initialisieren des Servlets (Methode init()) eine Verbindung mit der Datenbank her, welche Ihr beim Destruieren des Servlets (Methode destroy()) wieder abbaut. Prüft trotzdem, ob die Verbindung bei jedem Aufruf vorhanden ist (Exceptions abfangen!)
Beim Aufruf des Servlets (Methoden doGet() bzw. doPost()) ladet Ihr die Liste der Artikel aus der Datenbank. Befüllt die JavaBeans Artikel mit den Daten aus der Datenbank und bildet eine Liste (Artikelliste). Habt Ihr die Artikel aus der Datenbank geladen, leitet den Aufruf vom Servlet auf die von Euch erstellte JSP artikelliste.jsp weiter (dispatching) und stellt die Artikel dar. Achtet darauf, dass nur das Servlet aufgerufen wird und auf die JSP nur vom Servlet weiterverwiesen wird. Tipp: Arbeitet zu Anfang ohne Datenbankverbindung und befüllt die Artikelliste testweise im Servlet "von Hand" oder aus den Daten der Session. Artikeldaten habt Ihr ja bereits in der letzten Aufgabe in der Session abgelegt. |
| 2. Speichert die Artikelliste in der Datenbank
In der letzten Aufgabe habt Ihr bereits Artikel über eine JSP-Seite eingegeben und in einer Artikelliste gespeichert. Analog zum System oben, soll diese JSP-Seite jetzt auf ein Servlet verweisen, welches die Artikeldaten aus der Liste in die Datenbank einträgt (Details zur Datenbank findet Ihr weiter unten). Nach erfolgreichem Eintragen soll das Servlet auf die Übersichtsseite der Artikel weiterleiten (Aber Achtung: auf das Servlet, nicht auf die JSP!). Überprüft Eure Daten wie in der PHP-Aufgabe auf Gültigkeit. Sind die Artikeldaten fehlerhaft, weist diese zurück und lasst den Benutzer sie überprüfen. |
| 3. Sichert die Eingaben gegen SQL-Injection
Da alle Artikeldaten, die in Eurem Redaktionssystem eingegeben werden, durch ein Servlet laufen, solltet Ihr Euch im Servlet gegen SQL-Injection schützen. Benutzt dafür entweder PreparedStatements, überprüft die Eingaben über reguläre Ausdrücke oder quotet Sonderzeichen. |
|
Das Servlet muss kompiliert im Verzeichnis ~/jsp/WEB-INF/classes abgelegt werden und wird am besten demselben Package zugeordnet, in dem sich auch die JavaBeans aus der letzten Aufgabe befinden. Um Servlets kompilieren zu können, müsst Ihr bei der Kompilierung die Datei servlet.jar einbinden. Ladet Euch dazu die Datei herunter und speichert sie im Verzeichnis ~/jsp/WEB-INF/classes.
Um ein Servlet kompilieren zu können, müsst Ihr im Verzeichnis ~/jsp/WEB-INF/classes die Datei servlet.jar wie folgt einbinden:
javac -classpath ".:servlet.jar" packagename/myServlet.java
Das Servlet muss von der Oberklasse javax.servlet.http.HttpServlet erben und überschreibt üblicherweise die Methoden init(), doGet(), doPost() und destroy(). In init() sollt Ihr die Datenbankverbindung mit JDBC aufbauen, in destroy() wieder korrekt abbauen. Bitte denkt dabei an korrekte Fehlerbehandlung (exception handling)! In doGet() (bzw. doPost()) sollt Ihr nun die Daten aus der Artikelliste in die Datenbank schreiben. Denkt daran, dass die Artikelliste in der session gespeichert ist und dort auch vom Sevlet aus zugreifbar ist!
Um das Servlet im Webserver zu aktivieren, muss man es in der Konfigurationsdatei eintragen. Da jede prInt-Gruppe eine
eigene Web-Anwendung hat, muss auch jede Gruppe ihre Servlets selbst eintragen. Das geschieht in der Datei
~/jsp/WEB-INF/web.xml. Wir stellen ein Rohgerüst zur Verfügung.
In dieser Datei gebt Ihr ein URL-Pattern ein, unter dem das Servlet dann erreichbar ist:
http://print-www.informatik.uni-hamburg.de/printXX/servlet/url-pattern
Solltet Ihr unerklärliche Probleme mit dem Laden von Klassen in den Webserver haben ("Der hat da noch irgendwas altes im Speicher!"), könnt Ihr hier Eure Anwendung stoppen und neu starten.
|
Wie bereits beschrieben, soll die Ausgabe in einer JSP-Seite erfolgen, wohingegen die Programmlogik in einem Servlet gekapselt sein soll. Sowohl JSP-Seite als auch Servlet bearbeiten den gleichen Request in der gleichen Session. Deshalb können Daten vom Servlet (z.B. die die angezeigt werden sollen) an die JSP über die Session oder den Request weitergegeben werden. Die Java-API sagt allerdings, dass zur Weitergabe von Daten aus dem Servlet an die JSP der Request genutzt werden soll.
Den ServletRequest könnt Ihr mittels der Methode setAttribute(String name, Object o) mit Attributen (Object o) bestücken, die über einen Bezeichner (String name) identifiziert werden. Unter Verwendung dieses Bezeichners könnt Ihr in der JSP-Seite über die Methode request.getAttribute(String name) auf das Attribut zugreifen.
Um jetzt die eigentliche Weiterleitung vorzunehmen, bedarf es eines RequestDispatchers. Diesen erhält man vom ServletContext über die Methode getNamedDispatcher(String name). Der Übergebene Bezeichner name referenziert auf ein Servlet-Mapping in Eurer web.xml.
Um das Servlet zum Laufen zu bekommen, habt Ihr bereits ein Servlet-Mapping vom Klassennamen Eures Servlets zu Eurem Servletnamen in Eure web.xml eingetragen. Dies nehmt Ihr jetzt ebenso für eure JSP-Datei vor, wobei Ihr statt des Tags <servlet-class> zum Referenzieren auf einen Klassennamen, den Tag <jasp-file> benutzt, um auf Eure JSP-Datei zu referenzieren.
<web-app>
<!-- Servlet definieren -->
<servlet>
<servlet-name>MyDatabaseServlet</servlet-name>
<servlet-class>MyPackage.MyServlet</servlet-class>
</servlet>
<servlet>
<servlet-name>MyDatabaseJSP</servlet-name>
<jsp-file>/path/to/db.jsp</jsp-file>
</servlet>
<servlet-mapping>
<servlet-name>MyDatabaseServlet</servlet-name>
<url-pattern>/servlet/Callservlet</url-pattern>
</servlet-mapping>>
</web-app>
In diesem Beispiel könntet Ihr auf die JSP-Datei /path/to/db.jsp folgenderweise innerhalb Eures Servlets weiterleiten:
getServletContext().getNamedDispatcher("MyDatabaseJSP").forward(req,resp);
|
Um Euch mit der Datenbank verbinden zu können, benötigt Ihr noch den Treiber für die Datenbank. Speichert den MySQL-Connector im Verzeichnis ~/jsp/WEB-INF/lib, damit die Servlet-Engine ihn dort finden kann.
mysql-connector-java-3.0.10-stable-bin.jar herunterladen.
Als Datenbankserver steht Euch wie schon in Aufgabe 5 der Rechner print-www zur Verfügung. Die Tabelle, die Ihr benutzen sollt, heißt artikel und ist wie folgt aufgebaut:
Tabelle: artikel
| Field | Type | Key | Null | Default | Extra |
|---|---|---|---|---|---|
| id | int(11) | PRI | No | 0 | auto_increment |
| gruppe | char(2) | Yes | |||
| titel | varchar(255) | No | |||
| einleitung | text | No | |||
| text | text | No | |||
| bildurl | varchar(100) | Yes | NULL |
Ob die Daten dann auch in der Datenbank sind, könnt Ihr auf dieser Seite
überprüfen. Es bietet sich auch an, zum Test diese Seite durch einen
response.sendRedirect("http://print-www.informatik.uni-hamburg.de/Aufgaben/Tabelleartikel_anzeigen.phtml");
als Umleitungsziel des Servlets einzutragen, alternativ zur Ausgabe der veränderten Zeilen in der Datenbank.
Am Ende noch eine wichtige Bitte: Alle Gruppen arbeiten auf der selben Tabelle, daher sollte es vermieden werden, dass allzuviele Einträge in die Datenbank gemacht werden, und vor allem sollte nicht jeder Artikel 10 Mal auftauchen. Dazu ist es unbedingt nötig, dass das Artikellisten-Objekt nach dem Schreiben in die Datenbank geleert wird!
|
| Entwerft ein Servlet, das die Ergebnis-Seite anzeigt und dabei nur Eure eigenen Einträge darstellt. Verwendet dazu eine geeignete SQL-Anfrage. (1 Punkt) |
Erstellt eine artikelsuchen-Seite und ein Servlet, so dass man die gesamten Informationen über alle zur Suche passenden Artikel bekommt. (2 Punkte)Viel Spaß!
Letzte Änderung : 22.05.2006 - 15:40 EMail: prInt06@vsis.informatik.uni-hamburg.de | ||||||||