Beruflich Dokumente
Kultur Dokumente
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
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
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
Container ruft Methode mit ServletConfigInstanz auf. Wird nur einmal aufgerufen. Nicht jedesmal, bei jeder Anfrage.
Die service()-Method
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.
eineServlet instanz
Threadsicher
Mehrere Clients knnen gleichzeitig auf das gleiche Servlet zugreifen. Der Programmierer muss dafr sorgen, dass ein Servlet threadsicher programmiert wird. Mglichkeiten:
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
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.
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.
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
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)
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
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.
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 }
Cookiehandling in Servlets
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); ... } }
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.
Expressions: <%=expression%>
expression wird evaluiert und in HTMLSeite eingefgt Java-code wird ausgefhrt Definitionen, die auerhalb der Servletmethoden eingefgt werden.
Scriptlets: <%code%>
Declarations: <%!code%>
z.B.:
<% System.out.println( "aktuelle Zeit:" ); java.util.Date date; date = new java.util.Date(); %>
< 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.
<%@ taglib uri="std-taglib.tld" prefix="csajsp" %> <%@ taglib uri="std-taglib.tld" prefix="stdtag" %>
<prefix:tagName />
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> /> /> /> />
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:
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.