Sie sind auf Seite 1von 33

Servlets JSP JSPStandardTagLibrary

Vorlesung:Applikationsserver
Prof.Dr.Ch.Reich rch@fhfurtwangen.de http://www.informatik.fhfurtwangen.de/~reich/AppServer/index.html

Java Servlets

laufen innerhalb einer Server Engine (Servlet-Container) knnen ge-pooled werden Servlets knnen stateful zwischen mehreren Anfrage (requests) sein, weil sie nicht fr jede Anfrage neu erzeugt werden. benutzen eine standard API (2.3), welche von vielen Webservern untersttzt wird. => Code ist einfach zu portieren. haben keine Einschrnkunen => komplete JDK benutzbar knnen vererbt werden bentutzen Javas-Sandbox-Modell

Zusammenspiel Webserver und Servlet-Container


Client
HTTP

Httpd (Apache) Static Docs

AJP V12/AJP V13 8007

Tomcat Servlet Servlet Servlet Servlet

Servlet-Lifecycle
1.Servlet Container erzeugt eine Servletinstanz 2.Container ruft init()-Methode auf 3.Container hat einen Request fr das Serverlet und ruft damit die service()Methode auf. 4.Bevor der Container das Servlet lscht, wird die destroy()-Methode aufgerufen 5.Servlet-Instanz wird markiert fr den Garbage Collector.

Servlet API

public interface Servlet


Container benutzt dieses Interface fr die Lifecycle-Methoden Muss direkt oder indirekt implementiert werden. blich ist erben von javax.servlet.GenericServlet oder
javax.servlet.http.HttpServlet

public void init(ServletConfig config) throws Servlet Exception


Container ruft Methode mit ServletConfigInstanz auf. Wird nur einmal aufgerufen. Nicht jedesmal, bei jeder Anfrage.

Die service()-Method

public void service(ServletRequest req, ServletResponse res) throws ServletException, IOException

Jedes mal wenn der Webserver eine Anfrage (request) fr ein Servlet bekommt, erzeugt er ein Thread und ruft das Servlet im ServletContainer auf. Das kann mehrfach oder nur einmal vorhanden sein.

Browser Browser Browser Webserver

service() service() service()

eineServlet instanz

Threadsicher

Mehrere Clients knnen gleichzeitig auf das gleiche Servlet zugreifen. Der Programmierer muss dafr sorgen, dass ein Servlet threadsicher programmiert wird. Mglichkeiten:

Java-blich: synchronized Implementierung des Interfaces SingleThreadModel

Interface: SingleThreadModel

Implementiert ein Servlet das Interface: SingleThreadModel, dann sorgt der Servlet-Container dafr, dass immer nur eine Anfrage nach der anderen vom Servlet bearbeitet wird. Achtung: Sollte man nicht grunstzlich anwenden, weil die Performance sehr stark abnimmt.

Servlet Lschen

public void destroy()

Bevor das Servlet gelscht wird, ruft der Servlet-Container die destroy()-Methode auf. Anwendung:

Schlieen von Datenbankverbindungen Schlieen von Socketverbindungen Rcksetzen von Variablen. Schreiben von Log-Dateien etc.

Hello World! Servlet


import javax.servlet.*; import javax.servlet.http.*; import java.io.*; /* A simple Hello World Servlet. */ public class HelloWorldServlet extends HttpServlet { public void doGet(HttpServletRequest req, HttpServletResponse res) throws ServletException, IOException { res.setContentType("text/html"); PrintWriter out = res.getWriter(); out.println("<HTML>"); out.println("<BODY>"); out.println("<H1>Hello World Servlet Beispiel</H1>"); out.println("Dies ist ein einfaches Servlet!"); out.println("</BODY>"); out.println("</HTML>"); } out.close();

javax.servlet.http.HttpServlet
HttpServlet ist eine abstrakte Klasse, welche Methoden definiert um HTTP-Anfragen zu verarbeiten, z.B. fr GET, POST, etc. Diese (berschreibare) Methoden sind:
void doGet(HttpServletRequest req, HttpServletResponse resp) void doPost(HttpServletRequest req, HttpServletResponse resp) void doPut(HttpServletRequest req, HttpServletResponse resp) void doOptions(HttpServletRequest req, HttpServletResponse resp) void doDelete(HttpServletRequest req, HttpServletResponse resp) void doTrace(HttpServletRequest req, HttpServletResponse resp)

Eigentlich implementiert HttpServlet die service()Methode und ruft je nach Anfragetype die jeweilge doXXX()-Methode auf.

Verarbeitung der Anfrage


Interface HttpServletRequest extends javax.servlet.ServletRequest Die getXXX()-Methode wird mit HttpServletRequest aufgerufen. HttpServletRequest hat folgende Methoden::

getParameter, getParameterNames, getParameterValues, getHeader(), getHeaderNames(): ermittelt Headerinfo. getAuthType(): ermittelt Auth.-Typ (falls vorhanden) getCookies(): ermittelt Cookie getMethod(): ermittelt Typ von Anfrage (z.B. GET, POST,..) getRemoteUser(): ermittelt User-ID getSession(): ermittelt Session-Objekt

Kennt den InputStream und kann mit getInputStream () ermittelt werden.

Generierung der Antwort

Interface HttpServletResponse extends javax.servlet.ServletResponse Die getXXX()-Methode wird mit HttpServletResponse bergeben. HttpServletResponse hat folgende Methoden:

Definiert Anwort-Codes (202 = SC_ACCEPTED, etc.) void setHeader(String name, int value) void addHeader (int value) void sendError(int sc) void setRedirect(String url) void setStatus(int sc)

Kennt den Outputstream und kann mit getOutputStream() ermittelt werden.

Stateful in einem Stateless Protocol

URL-Rewriting:

Servlets kann getParameter() and getParameterValues() des HttpServletRequestObjektest benutzen. Server muss jede URL, die dem Client zurckgeschickt wird, rewriten. z.B.: <A HREF=info.html?session=972368>Course Information</A> Verstecktes HTML, welche nicht im Browser angezeigt werden. z.B.: <INPUT TYPE=HIDDEN NAME=session VALUE=972368>

Versteckte Variablen

Cookies

HTML-Mechanismus einfache Nutzung (kein URL rewriting, etc.) Problem: User kann Cookies ausschalten

Stateful in einem Stateless Protocol

automtisches Session Management

Gltige Identifikation und Assozierung eines bestimmten Clients ber mehrere Aufrufe hinweg. Der Client liefert eine Session-ID, die eine eindeutige Session-Identifizierung ermglicht. Default: Servlet Session Management ist Cookie basierend. Die Servlet-Engine benutzt aber automatisch URL rewriting, falls Cookies nicht mglich sind.

HttpServletRequest-Methoden fr das Session Management

HttpServletRequest methods for session management:


HttpSession getSession(): ermittelt das HttpSession-Objekt HttpSession getSession(boolean): boolean isRequestedSessionIdFromCookie(): Ist ein Cookie vorhanden? boolean isRequestedSessionIdFromURL(): Wurde URL-Rewriting benutzt? boolean isRequestedSessionIdValid(): true wenn gltig und false wenn ungltig (z.B. expired)

Beispiel: Einkaufskorb
public void service( HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { . HttpSession session = request.getSession(true); Einkaufskorb korb = (Einkaufskorb) session.getAttribute(example.Einkaufskorb); if (korb == null) { korb = new Einkaufskorb(); session.setAttribute (example.Einkaufskorb, korb); } //output }

Cookie lebt nur ein Session!

Cookies und Servlets

Cookiehandling in Servlets

doGet(HttpServletRequest request, HttpServletResponse response) Cookie[] cookies = request.getCookies(); response.addCookie(c);

Neu bei Servlet Specification 2.3 Lightweight Framework zur Filterung von dynamischen oder statischem Inhalt. Ein Filter transformiert HTTP-Anfragen, -Antworten und Header Informationen. Anwendungsszenarien:

Filter

Authentication filters Logging and auditing filters Image conversion filters Data compression filters Encryption filters XSL/T filters that transform XML content Caching filters

Filter Beispiel
public final class HitCounterFilter implements Filter { private FilterConfig filterConfig = null; public void init(FilterConfig fConf) throws ServletException { this.filterConfig = fConf; } public void doFilter(ServletRequest req, ServletResponse response, FilterChain chain) throws IOException, ServletException { if (filterConfig == null) return; StringWriter sw = new StringWriter(); PrintWriter writer = new PrintWriter(sw); Counter c = (Counter) filterConfig.getServletContext().getAttribute("hitCounter"); writer.println("The number of hits is: " + c.incCounter()); writer.flush(); filterConfig.getServletContext().log(sw.getBuffer().toString()); ... chain.doFilter(request, response); ... } }

Was ist ein JSP?

JSPs (Java Server Pages) sind HTMLSteiten, die Java-Code enthalten. Ein JSP wird zuerst in ein Servlet bersetzt und danach in dem ServletContainer ausgefhrt. Anwendung:

Servlets knnen einfach Userdaten lesen, Cookies erzeugen, Http-Anfragen lesen, etc. JSPs eignen sich vor allem, wenn viel HTML-Code erzeugt werden muss.

Beziehung zwischen Servlets und JSPs

Servlet (Java) HTML

HTML JSP (Java)

Hello World! JSP


< HTML> < BODY> Hello World! akutelle Zeit: < % new java.util.Date() % = > < / BODY> < / HTML>

3 Arten um Java-Code in HTML-Seite zu integrieren

Expressions: <%=expression%>

expression wird evaluiert und in HTMLSeite eingefgt Java-code wird ausgefhrt Definitionen, die auerhalb der Servletmethoden eingefgt werden.

Scriptlets: <%code%>

Declarations: <%!code%>

Integration von Java-Code

Java-Code wird mit Hilfe von


<% %>

in eine HTML-Seite eingebetet.

z.B.:
<% System.out.println( "aktuelle Zeit:" ); java.util.Date date; date = new java.util.Date(); %>

Mischen von Java-Code und HTML

< HTML> < HEAD> < TITLE> Greetings< / TITLE> < / HEAD> < BODY> < H2> Greetings< / H2> < % if (Math.random() < 0.5) { % > Have a < B> nice< / B> day! < % } else { % > Have a < B> lousy< / B> day! < %} % > < / BODY> < / HTML>

Alles was ausgefhrt werden soll, m uss um schlossen sein von: < % .... % > Alles was nicht ausgefhrt werden soll, m uss auerhalb stehen.

Java Server Pages Standard Tag Library (JSTL)

Tags sind user-definierte JavaSprachelemente in JSPs, die immer wiederkehren. Custum-Tags-Syntax:


<prefix:tag attr1="value" ... attrN="value" /> oder <prefix:tag attr1="value" ... attrN="value" > body </prefix:tag>

Zugriff von Tags aus JSP Dateien

Import der Tagbibliothek:


Definiere Ort der TDL-Datei Definiere einen Tag-Prfix (namespace)

<%@ taglib uri="std-taglib.tld" prefix="csajsp" %> <%@ taglib uri="std-taglib.tld" prefix="stdtag" %>

Benutze die Tags in JSP

<prefix:tagName />

Tag-Name kommt aus TLD-Library-Datei Prefix kommt aus Definition

z.B.: <stdtag:simplePrime />

Beispiel: simplePrime-Tag
... <BODY> <H1>Some 50-Digit Primes</H1> <%@ taglib uri="csajsp-taglib.tld" prefix="csajsp" %> <UL> <LI><csajsp:simplePrime <LI><csajsp:simplePrime <LI><csajsp:simplePrime <LI><csajsp:simplePrime </UL> </BODY> </HTML> /> /> /> />

simplePrime Tag: Ergebnis

Tag-bersicht

Core Tags:

Variablen-Untersttzung: set; remove Flukontrolle: choose; forEach; if; forTokens URL-Management: import; redirect; url Verschiedenes: catch; out Basis: out; parse; set Flukontrolle: choose; forEach; if Transformation: transform, param

XML-Tags:

Tag-bersicht (forts.)

Internationalization-Tags:

Setting Locale: setLocale; requestEncoding Messageing: bundle; message; setBundle Number and Dateformating: formatNumer; formatDate; parseDate; parseNubmer; setTimeZone; timeZone setDataSource SQL: query, dateParam; transaction Stringmanipulationen: toUpperCase; toLowerCase; trim; split; replace; ...

SQL-Tags:

Funktionen:

Open Source Tag Libraries http://jakarta.apache.org/taglibs/

JSP Standard Tag Library (JSTL)

Final specification released mid 2002.


Covered in later lecture

Internationalization (I18N) Database access Sending email JNDI Date/time Populating/validating form fields Perl regular expressions Extracting data from other Web pages XSL transformations Etc.