Java - Servlet mit Tomcat und JDBC

From XennisWiki
Jump to: navigation, search

Das folgende Servlet wurde in Eclipse mittels Apache Tomcat als Webserver und Java Database Connectivity (JDBC) als Datenbankschnittstelle zu einer HyperSQL Database Engine realisiert. Die Darstellung erfolgt in HTML 5.

Vorweg

Voraussetzung

Tomcat einstellen

Eclipse Projekt

  • Erstelle ein neues Dynamic Web Project (in der Kategorie Web)
  • Rechtsklick auf das Projekt > Properties > Java Build Path > Libraries > Add Externel JARs > den Pfad zur hsqldb.jar (siehe Artikel HyperSQL Database Engine) hinzufügen
  • Erzeuge in dem Projekt ein neues Servlet (ebenfalls in der Kategorie Web) mit dem Namen DB

Tabelle

Für die Datenbanktabelle, auf die sich der Code bezieht, siehe Java Database Connectivity.

Programm

DB.java

import java.io.IOException;
import java.io.PrintWriter;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

/**
 * Servlet implementation class DB
 */
@WebServlet("/")
public class DB extends HttpServlet {

	private static final long serialVersionUID = 1L;

	/** Response Type */
	private static final String response_type = "text_html";

	/** Verbindung zur Datenbank */
	private static Connection connection;

	/**
	 * @see HttpServlet#HttpServlet()
	 */
	public DB() {
		super();
		dbConnect("org.hsqldb.jdbcDriver", "jdbc:hsqldb:hsql://localhost/", "sa", "");
	}

	/**
	 * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse
	 *      response)
	 */
	protected void doGet(HttpServletRequest request,
			HttpServletResponse response) throws ServletException, IOException {
		// response
		response.setContentType(response_type);
		PrintWriter pw = response.getWriter();
		// request
		String action = request.getQueryString();
		if (action == null) {
			action = "menu";
		} else {
			action = request.getParameter("action");
		}
		// choose
		switch (action) {
		case "menu":
			pShowMenu(pw);
			break;
		case "show":
			pShowAlbums(pw);
			break;
		case "add":
			pAddAlbum(pw);
			break;
		case "delete":
			pDeleteAlbum(pw);
			break;
		default:
			pShowMenu(pw);
			break;
		}
	}

	/**
	 * @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse
	 *      response)
	 */
	protected void doPost(HttpServletRequest request,
			HttpServletResponse response) throws ServletException, IOException {
		// response
		response.setContentType(response_type);
		PrintWriter pw = response.getWriter();
		// request
		String action = "" + request.getParameter("action");
		switch (action) {
		case "added":
			dbAddAlbum(pw, request.getParameter("titel"),
					request.getParameter("interpret"),
					Integer.parseInt(request.getParameter("jahr")),
					Float.parseFloat(request.getParameter("bewertung")));
			break;
		case "deleted":
			dbDeleteAlbum(pw, request.getParameter("titel"));
			break;
		default:
			break;
		}
	}

	/**
	 * Zeigt das Hauptmenü an.
	 * 
	 * @param pw
	 */
	private void pShowMenu(PrintWriter pw) {
		hHtmlHead(pw, "Menu");
		pw.println("<ul>" + hItem("show", "Alle Alben anzeigen")
				+ hItem("add", "Album hinzufügen")
				+ hItem("delete", "Album löschen") + "</ul>");
		hHtmlFoot(pw);
	}

	/**
	 * Zeigt alle Alben an.
	 * 
	 * @param pw
	 *            PrintWriter
	 */
	private void pShowAlbums(PrintWriter pw) {
		hHtmlHead(pw, "Alben Sammlung");

		try {
			Statement st = connection.createStatement();
			ResultSet rs = st.executeQuery("Select * From Album");

			pw.println("<table>");
			while (rs.next()) {
				pw.println("<tr>");
				pw.println("<td>" + rs.getString("Albumtitel") + "</td>");
				pw.println("<td>" + rs.getString("Interpret") + "</td>");
				pw.println("<td>" + rs.getInt("Erscheinungsjahr") + "</td>");
				pw.println("<td>" + rs.getFloat("Bewertung") + "</td>");
				pw.println("</tr>");
			}
			pw.println("</table>");
		} catch (SQLException e) {
			pw.println("<p>Es gab leider den folgenden Fehler: " + e.getMessage());
		}
		pw.println(hItem("manu", "Zurück zum Menü"));
		hHtmlFoot(pw);
	}

	/**
	 * Gibt ein Formular zum Einfügen eines Albums aus.
	 * 
	 * @param pw
	 *            PrintWriter
	 */
	private void pAddAlbum(PrintWriter pw) {
		hHtmlHead(pw, "Album hinzufügen");
		pw.println("<p>Format:Albumtitel, Interpret, Erscheinungsjahr, Bewertung (0; 0.5; 1; ...; 5)</p>");
		pw.println("<form method='POST' action='?action=added'>");
		pw.println("<input type='text' name='titel' placeholder='Albtumtitel' maxlength='42' required>");
		pw.println("<input type='text' name='interpret' placeholder='Interpret' maxlength='42' required>");
		pw.println("<input type='number' name='jahr' placeholder='Erscheinungsjahr' min='0' max='2012' step='1' required>");
		pw.println("<input type='number' name='bewertung' placeholder='Bewertung' min='0' max='5' step='0.5' required>");
		pw.println("<input type='submit' name='submit' value='Speichern'>");
		pw.println("</form>");
		pw.println(hItem("manu", "Zurück zum Menü"));
		hHtmlFoot(pw);
	}

	/**
	 * Gibt ein Formular zum Löschen eines Albums aus.
	 * 
	 * @param pw
	 *            PrintWriter
	 */
	private void pDeleteAlbum(PrintWriter pw) {
		hHtmlHead(pw, "Album hinzufügen");
		pw.println("<form method='POST' action='?action=deleted'>");
		pw.println("<input type='text' name='titel' placeholder='Albtumtitel' maxlength='42' required>");
		pw.println("<input type='submit' name='submit' value='Löschen'>");
		pw.println("</form>");
		pw.println(hItem("manu", "Zurück zum Menü"));
		hHtmlFoot(pw);
	}

	/**
	 * Stellt die Verbindung mit der Datenbank her.
	 * 
	 * @param driver
	 *            Treiber der Datenbank
	 * @param url
	 *            Datenbank-URL
	 * @param user
	 *            Datenbank-Benutzer
	 * @param passwort
	 *            Benutzer-Passwort
	 */
	private void dbConnect(String driver, String url, String user, String passwort) {
		try {
			Class.forName(driver);
			connection = DriverManager.getConnection(url, user, passwort);
			connection.setAutoCommit(false);
		} catch (Exception e) {
			e.printStackTrace();
		}
	}

	/**
	 * Fügt ein Album in die Datenbank ein.
	 * 
	 * @param pw
	 * @param titel
	 *            Albumtitel
	 * @param interpret
	 *            Albuminterpret
	 * @param jahr
	 *            Erscheinungsjahr
	 * @param bewertung
	 *            Bewertung des Albums
	 */
	private void dbAddAlbum(PrintWriter pw, String titel, String interpret,
			int jahr, float bewertung) {
		String insert = "Insert Into Album Values ('" + titel + "','"
				+ interpret + "', " + jahr + "," + bewertung + ")";
		boolean result = dbUpdate(insert);
		hHtmlHead(pw, "Album hinzufügen");
		if (result) {
			pw.println("<p>Album " + titel + " erfolgreich hinzugefügt</p>");
		} else {
			pw.println("<p>Album konnte nicht hinzugefügt werden. Überprüfen Sie ihre Eingabe:</p>");
			pw.println("<p>Titel=" + titel + ", Interpret=" + interpret
					+ ", Erscheinungsjahr=" + jahr + ", Bewertung=" + bewertung
					+ "</p>");
		}
		pw.println(hItem("manu", "Zurück zum Menü"));
		hHtmlFoot(pw);
	}

	/**
	 * Löscht ein Album aus der Datenbank.
	 * 
	 * @param pw
	 * @param titel
	 *            Titel des Albums
	 */
	private void dbDeleteAlbum(PrintWriter pw, String titel) {
		String delete = "Delete From Album WHERE Albumtitel='" + titel + "'";
		boolean result = dbUpdate(delete);

		hHtmlHead(pw, "Album löschen");
		if (result) {
			pw.println("Album " + titel + " erfolgreich gelöscht.");
		} else {
			pw.println("Album " + titel + " wurde nicht gefunden.");
		}
		pw.println(hItem("manu", "Zurück zum Menü"));
		hHtmlFoot(pw);
	}

	/**
	 * Aktualisiert die Datenbank.
	 * 
	 * @param query
	 *            Update oder Delete Anfrage
	 * @return true, wenn Akutalisierung erfolgreich war
	 */
	private boolean dbUpdate(String query) {
		int result = Integer.MAX_VALUE;
		try {
			Statement statement = connection.createStatement();
			result = statement.executeUpdate(query);
			statement.close();
		} catch (SQLException e) {
			e.printStackTrace();
		}
		return result == 1;
	}

	/**
	 * Gibt einen Link in Form eines Aufzählungspunktes zurück.
	 * 
	 * @param param
	 *            Wert für Parameter action
	 * @param text
	 *            Text des Links
	 * @return Link in Form eines Aufzählungspunktes
	 */
	private String hItem(String param, String text) {
		return "<li><a href='?action=" + param + "'>" + text + "</a></li>";
	}

	/**
	 * Gibt den Kopf der HTML Seite aus.
	 * 
	 * @param pw
	 *            PrintWriter
	 * @param title
	 *            Titel der Seite
	 */
	private void hHtmlHead(PrintWriter pw, String title) {
		pw.println("<!DOCTYPE HTML><html>");
		pw.println("<html>");
		pw.println("<head>");
		pw.println("<title>" + title + " - Meine Albensammlung</title>");
		pw.println("</head>");
		pw.println("<body>");
		pw.println("<h1>" + title + "</h1>");
	}

	/**
	 * Gibt den Fuss der HTML Seite aus.
	 * 
	 * @param pw
	 *            PrintWriter
	 */
	private void hHtmlFoot(PrintWriter pw) {
		pw.println("</body>");
		pw.println("</html>");
	}
}

Siehe auch