Java Database Connectivity
DatabaseConnection
Treiber laden + Verbindung zum Server herstellen
public class DatabaseConnection {
/**
* Die Connection
*/
protected static Connection instance;
/**
* Server-Verindungsinfos
*/
private static final String DB_SERVER = "abgabe-dbae.iis.uni-hildesheim.de:5432";
private static final String DB_NAME = "db_coffeandbeer";
private static final String DB_USER = "group_coffeandbeer";
private static final String DB_PASSWORD = "dbaepw";
private static final String DB_DRIVER = "org.postgresql.Driver";
private static final String DB_URL = "jdbc:postgresql://" + DB_SERVER + "/" + DB_NAME;
private static Connection init() {
try {
// Treiber laden
Class.forName(DB_DRIVER);
// Connection holen
instance = DriverManager.getConnection(DB_URL, DB_USER, DB_PASSWORD);
return instance;
} catch (ClassNotFoundException | SQLException e) {
System.out.println("PostgresDb: Something went wrong: ");
e.printStackTrace();
}
return null;
}
public static Connection getConnection() {
try {
if (instance == null || instance.isClosed()) {
init();
}
return instance;
} catch (SQLException e) {
e.printStackTrace();
return instance;
}
}
public static void closeConnection() {
try {
instance.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
}
Datenbankabfrage
Abfrage
Connection connection = DatabaseConnection.getConnection();
try {
PreparedStatement statement = connection.prepareStatement(eingabe);
ResultSet result = statement.executeQuery();
connection.close();
} catch (SQLException e) {
e.printStackTrace();
}
Abfrage mit nachträglicher Parametereingabe
Connection connection = DatabaseConnection.getConnection();
String query = "SELECT gruppe AS Band, lied_titel AS Song, name as Name FROM musiker NATURAL JOIN lied NATURAL JOIN person WHERE name ILIKE ?";
try {
PreparedStatement statement = connection.prepareStatement(query);
if (eingabe != null && eingabe.length() > 0) {
// eingabe wird am ersten Fragezeichen eingefuegt
statement.setString(1, "%" + eingabe + "%");
}
set = statement.executeQuery();
connection.close();
} catch (SQLException e) {
System.out.println("Fehler beim Select, Query: " + eingabe);
e.printStackTrace();
}
Das Resultset (Abfragenergebnis)
ResultSet Tutorial, ResultSetMetaData doc
try {
ResultSet set = statement.executeQuery();
ResultSetMetaData meta = set.getMetaData();
// Spaltentitel + Spaltenanzahl aus den Metadaten
for (int i = 1; i <= meta.getColumnCount(); i++) {
String s = meta.getColumnLabel(i);
}
// alle Tupel
while(set.next()) {
// alle Spalten
for (int i = 1; i <= meta.getColumnCount(); i++) {
// Wert in Tabellenzelle
String s = set.getString(i);
}
}
} catch (SQLException e) {
e.printStackTrace();
}
Filter
Setup
Filter bestehen aus drei Teilen:
(1) web.xml (WebContent/WEB-INF/web.xml)
Beschreibt, welche(r) Filter angewandt werden soll (welche Klasse und wo diese zu finden ist)
(2) Eine Klasse, die "Filter" implementiert
In der doFilter() Methode wird das übergebene ServletRequest abgefangen und an einen eigenes ServletRequest weitergeleitet
(3) Eine zweiter Klasse, die von "HttpServletRequestWrapper" erbt
Die getParameter() Methode wird überschrieben. In dieser findet das tatsächliche "filtern" statt.
(1) web.xml
<?xml version="1.0" encoding="UTF-8"?>
<web-app
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns="http://java.sun.com/xml/ns/javaee"
xmlns:web="http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaeehttp://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"
id="WebApp_ID" version="2.5">
<display-name>testfilter</display-name>
<filter>
<filter-name>filter.HTMLFilter</filter-name>
<filter-class>filter.HTMLFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>filter.HTMLFilter</filter-name>
<url-pattern>/index.jsp</url-pattern>
</filter-mapping>
</web-app>
(2) Filterklasse
public class HTMLFilter implements Filter {
private FilterConfig config;
public HTMLFilter() {
}
public void destroy() {
config = null;
}
public void doFilter(ServletRequest req, ServletResponse res, FilterChain chain) throws IOException, ServletException {
// hier wird das urspruengliche Request mit dem selbsterstelltem Request ueberschrieben
chain.doFilter(HtmlRequestWrapper.getRequest(req), res);
/*
* alternative:
* chain.doFilter(new HtmlRequestWrapper(req), res);
*/
}
public void init(FilterConfig config) throws ServletException {
this.config = config;
}
}
(3) Servletrequestklasse
public class HtmlRequestWrapper extends HttpServletRequestWrapper {
public HtmlRequestWrapper(ServletRequest request) {
super((HttpServletRequest) request);
}
public static ServletRequest getRequest(ServletRequest request) {
return new HtmlRequestWrapper(request);
}
public String getParameter(String str) {
String s = super.getParameter(str);
if (s == null) {
s = "";
} else {
s = s.replaceAll("<(.|\n)*?>", "");
}
return s;
}
}
JSTL
Direktiven
Include - mit Servlet (Auswirkung: Request wird an Servlet geschickt, Request wird im Servlet ausgeführt (doGet), Daten können wieder von dort aus an das Ursprungs JSP geschickt werden) Siehe Tutorial, Anderes Tutorial
//Im Servlet 'BeispielServlet':
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
request.setAttribute("text", "Hallo!");
}
<!-- Im JSP - dadurch wird doGet() vom Servlet aufgerufen -->
<jsp:include page="BeispielServlet" flush="true"/>
<!-- Ausgabe von 'Hallo!' -->
<p>${text}</p>
Core Tags
Bsp.: forEach, if, when, set, out Siehe Auch
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<!-- head und co dann body -->
<!-- ${users} wurde von Servlet über setAttribute() gesendet, ist Array / ArrayList o.Ä. -->
<!-- user ist frei wählbarer Variablenname, den man in der Schleife verwenden möchte -->
<c:forEach items="${users}" var="user">
${user}<br>
<!-- Alternative Bsp.: ${user.toString()} -->
</c:forEach>
Formatting und Functions
Formatting: formatDate, setLocale, formatNumber, usw. Siehe Auch
Functions (String Funktionen): length(), substring(), indexOf(), usw. Siehe Auch
<%@ taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt" %>
<!-- head und co dann body -->
<!-- ${date} wurde von Servlet über setAttribute() gesendet (new Date()) -->
<fmt:formatDate value="${date}" type="DATE" dateStyle="FULL" pattern="EEEE dd MMM yyyy" /><br>
<fmt:formatDate value="${date}" type="TIME" pattern="hh:mm:ss" />
<!-- Länderspezifische Formatierung -->
<fmt:setLocale value="en_US" />
<fmt:formatDate value="${date}" type="DATE" />
Taglibs
TagHandler
'UserTag.java' im package 'tags'
public class UserTag extends TagSupport {
private User benutzer;
// der setter wird beim ausfuehren des Tags aufgerufen
public void setBenutzer(User benutzer) {
this.benutzer = benutzer;
}
// wird beim oeffnenden Tag ausgefuehrt
public int doStartTag() {
try {
JspWriter out = pageContext.getOut();
out.append(benutzer.getName());
out.flush();
/* Alternative: Zugriff im JSP per Expression Language
* pageContext.setAttribute("name", benutzer.getName());
*/
} catch(IOException e) { }
return EVAL_PAGE;
}
// wird im Body des Tags - also zwischen Start- und End-Tag - ausgefuehrt
public int doAfterBody() { return EVAL_PAGE; }
// wird im schließenden Tag ausgefuehrt
public int doEndTag() { return EVAL_PAGE; }
}
Returns:
return EVAL_BODY_INCLUDE; // von doStartTag() in den Tag-Body springen
return SKIP_BODY; // Body ueberspringen / zum schließenden Tag
return EVAL_PAGE; // zum naechsten Tag auf der (JSP) Seite springen
return EVAL_BODY_AGAIN; // von doAfterBody() zurueck zum Anfang des Tag-Bodies springen
return SKIP_PAGE; // von doEndTag() ans Seitenende springen -
// alle Folge-Tags werden ignoriert
Tag Library Descriptor
'User.tld' im Verzeichnis '/WEB-INF/lib'. TagName: 'UserTag'. Als Attribut wird das Element angegeben, das im TagHandler beim Ausführen des Tags gesetzt werden soll.
Beispiel:
TLD: <attribute><name>benutzer</name></attribute>
TagHandler: User benutzer; mit void setBenutzer(User benutzer) {}
<taglib version="2.0" xmlns="http://java.sun.com/xml/j2ee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee/webjsptaglibrary_2_0.xsd">
<tlib-version>2.0</tlib-version>
<jsp-version>2.0</jsp-version>
<short-name>myTags</short-name>
<description>This is my user tag</description>
<tag>
<name>UserTag</name>
<tag-class>tags.UserTag</tag-class>
<body-content>empty</body-content>
<attribute>
<name>benutzer</name>
<required>true</required>
<rtexprvalue>true</rtexprvalue>
</attribute>
</tag>
</taglib>
Einbindung im JSP
<%@ taglib prefix="u" uri="/WEB-INF/lib/User.tld" %>
<!-- head und co dann body -->
<!-- ${user} ist hier eine Instanz der Klasse User -->
<!-- setBenutzer() von UserTag.java wird ausgefuehrt, danach doStartTag() -->
<u:UserTag benutzer="${user}"></u:UserTag><br>
Servlet
Formulardaten verarbeiten
Daten einlesen:
In HTML:
<input name="summand1" type="text">
Im Servlet:
String summand1 = request.getParameter("summand1");
Daten an JSP schicken
Attribute setzen:
Im Servlet:
request.setAttribute("bezeichner", "<p>beispielDatenAlsString</p>");
RequestDispatcher patcher = request.getRequestDispatcher("output.jsp");
patcher.forward(request, response);
Im JSP:
${bezeichner}
HTML im Servlet erzeugen
Writer erzeugen, HTML Grundgerüst:
request.setContentType("text/html");
PrintWriter out = res.getWriter();
out.println("<!DOCTYPE HTML>");
out.println("<html>");
out.println("<head><title>Hello World</title></head>");
out.println("<body>");
out.println("<h1>Hello World</h1>");
out.println("</body></html>");
out.close();
Session Tracking
Allgemein: siehe Komplettes Beispiel
// Create a session object if it is already not created.
HttpSession session = request.getSession(true);
// Get session creation time.
Date createTime = new Date(session.getCreationTime());
// Get last access time of this web page.
Date lastAccessTime = new Date(session.getLastAccessedTime());
Neue Seitenbesucher:
// Neuen Seitenbesucher anlegen - hier mit Platzhaltern
String userIDKey = new String("userID");
String userID = new String("ABCD");
//session.setAttribute(Schlüsselbezeichnung, WertDesSchlüssels);
session.setAttribute(userIDKey, userID);
// Überpruefen, ob es ein neuer Seitenbesucher ist
if (session.isNew()){
// Inhalt
}
Wiederkehrende Seitenbesucher
// Infos auslesen von bereits angelegten Seitenbesuchern
// "visitCount" ist hier eine Schlüsselbezeichnung, die zuvor mit setAttribute() gesetzt wurde
String visitCountKey = new String("visitCount");
Integer visitCount = (Integer)session.getAttribute(visitCountKey);
Lokalisierung
Land, Sprache usw. Siehe auch
// Aulesen
Locale info = request.getLocale();
// Setzen
Locale myLocale;
/*<myLocale Daten setzen>*/
response.setLocale(myLocale);
Java Krams:
Datum: siehe auch
Calendar now = Calendar.getInstance();
// Formatierung dd.mm.yyyy
String datumsString = String.format("%1$td.%1$tm.%1$tY", now);
Typumwandlung:
String summand1 = request.getParameter("summand1");
try {
iSummand1 = Integer.parseInt(summand1);
} catch (Exception e) { // NumberFormatException
// some error message maybe
}
// entsprechend Float.parseFloat(str), Double.parseDouble(str), ...
JSP
Vorhandene Variablen im JSP:
out // Datentyp: JSPWriter
request // Datentyp: HTTPServletRequest
response // Datentyp: HTTPServletResponse
session // Datentyp: HTTPSession
config // Datentyp: ServletConfig - lesender Zugriff auf Konfigurationsparameter
application // Datentyp: ServletContext
page // Datentyp: Object
pageContext // Datentyp: PageContext - Zugriff auf Objekte in verschiedenen Gültigkeitsbereichen
exception // Datentyp: Ausnahmeobjekt,
Java Code (Scriptlet):
- Geht nicht: Funktionsdefinition
- Geht: lokale Variablen, if-Abfragen, Schleifen
<% out.println("Hello"); %>
Ausgeben:
<%= new Date() %>
Entspricht:
<%
Date d = new Date();
out.println(d);
%>
Klassenimport:
<%@ page import="java.util.*" %>
Klassendeklaration, Funktionsdefinition, globale Variablen anlegen:
<%! float foo = 2.75; %>
HTML
Formular
Allgemein:
<form method="get" action="DasServlet">
</form>
Verwendungsbeispiel:
In HTML:
<input name="summand1" type="text">
Im Servlet:
String summand1 = request.getParameter("summand1");
Formularelemente: siehe auch
Absenden und Eingaben löschen:
<input value="Absenden" type="submit" size="30" maxlength="30">
<input type="reset" value="Reset">
einzeilige Eingabefelder:
<label>Zahl</label>
<input name="summand1" type="text">
mehrzeilige Eingabefelder:
<textarea name="textfeldEingabe" cols="50" rows="15" maxlength="10000" wrap="soft"></textarea>
Button:
<input type="text" name="punkte" value="ButtonBeschriftung">
Selectbox:
<select name="operation">
<option>*</option>
<option>/</option>
<option>+</option>
<option>-</option>
</select>
Datenlisten (Comboboxen):
<input type="text" name="staat" list="staatlist">
<datalist id="staatlist">
<option value="Deutsch">
<option value="Österreich">
<option value="Schweiz">
</datalist>
Radiobuttons (einer aushwählbar):
<input type="radio" name="uk" value="EZ BR" checked> EZ Frühstück
<input type="radio" name="uk" value="DZ BR"> DZ Frühstück
<input type="radio" name="uk" value="EZ HP"> EZ Halbpension
Checkboxen (mehrere aushwählbar):
<input type="checkbox" name="opt[]" value="parken"> Parkplatz
<input type="checkbox" name="opt[]" value="internet"> Internet
<input type="checkbox" name="opt[]" value="sauna"> Sauna
Verschiedenes
Meta Tags und Titel:
<head>
<title>Hausaufgabe1</title>
<meta charset="utf-8">
<meta name="description" content="Wie heisst eine Fliege die nicht fliegen kann? Antwort: Laufe">
<meta name="author" content="Diana Lange">
</head>
Button (als Link, kein Formular):
<a href="index.html"><button type="button">Back to Start</button></a>
CSS
CSS Einbinden
Externes CSS:
<link rel="stylesheet" href="style.css" type="text/css" media="all">
Lokales CSS:
<head>
<style type="text/css">
body {
}
</style>
</head>
CSS im Tag:
<p style="color:#FF0000"></p>
Folien/PDF
HTML: DBAE_WS1516_02_HTML.pdf
CSS: DBAE_WS1516_03_CSS.pdf
Servlet: DBAE_WS1516_04_Servlets.pdf
JSP: DBAE_WS1516_05_JSP.pdf
Taglibs: DBAE_WS1516_06_TagLibs.pdf, DBAE_Taglibraries_Zusatzinfos.pdf
AJAX: DBAE_WS1516_07_AJAX.pdf
JDBC: DBAE_WS1516_08_JDBC.pdf
Filter: DBAE_WS1516_09_Filter.pdf
Security: DBAE_WS1516_10_Security.pdf
Frameworks: DBAE_WS1516_11_ModFrameWorks.pdf
Zusammenfassung: DBAE_WS1516_12_Testat3.pdf
SQL: Info3-06.pdf