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