Beruflich Dokumente
Kultur Dokumente
Serverseitige Techniken
Univ.-Prof. Dr.-Ing. habil. Gero Mühl
> Request/Response
> Common Gateway Interface (CGI)
> Java Servlets
> Sessions
> Seitenbeschreibung
> Server Side Includes (SSI)
> Hypertext Preprocessor (PHP)
> Java Server Pages (JSP)
Webbrowser Anbieter
Praktikum in Grönland !
anmelden
Formular anfordern
Formular liefern
HTTP HTTP
Client Daten senden Server
Antwort empfangen
/cgi-bin/anmelden.sh
> Formular
<form action="/cgi-bin/guestbk.pl" method="get">
<form action="/cgi-bin/stats.pl" method="post">
> Verweis
<a href="/cgi-bin/stats.pl">Tagesstatistik</a>
> Grafikreferenz
<img src="/cgi-bin/counter.pl">
> Server Side Include (SSI)
<!-- #exec cgi="/cgi-bin/counter.pl" -->
> Automatisches Laden durch Weiterleitung
<meta http-equiv="refresh"
content="0;URL=/cgi-bin/welcome.pl">
> GET
> $QUERY_STRING (Umgebungsvariable) wird übergeben
> Beispiele
?vorname=Hans&nachname=M%FCller&...
?query=CGI+Tutorial
> Beinhaltet alle Parameter in einem String
(Leerzeichen durch + ersetzt)
> Wird vom Skript geparst und entsprechend verarbeitet
> POST
> Einlesen der Parameter (aus dem Body der Response) von der
Standardeingabe
#!/bin/sh
cat - <<EOF
Content-type: text/html
<HTML><HEAD><TITLE>Datum und
Zeit</TITLE></HEAD>
<BODY><H1>Zeit und Datum:
EOF
date
cat - <<EOF
</H1></BODY></HTML>
EOF
> Vorteile
> Geringe Anforderungen
> Verfügbarkeit auf Server
> Hohe Flexibilität
> Nachteile
> Niedrige Abstraktionsebene
> Sicherheit dem Anwendungsentwickler überlassen
> Hoher Ressourcenverbrauch (Prozess pro Request)
> Keine Ressourcenüberwachung
> Spezifikation
> IETF RFC 3875. http://tools.ietf.org/html/rfc3875
> W3C‘s CGI Seiten. http://www.w3.org/CGI/
> Tutorials
> Apache Tutorial. Dynamic Content with CGI.
http://httpd.apache.org/docs/current/howto/cgi.html
> Stefan Münz. SELFHTML: CGI.
http://de.selfhtml.org/servercgi/cgi/index.htm
> FastCGI
> Webseite. http://www.fastcgi.com
> White Paper. http://www.fastcgi.com/drupal/node/6?q=node/15
______javax.servlet.Servlet______ ____javax.servlet.ServletRequest____
void init(ServletConfig config)
void service(ServletRequest req,
ServletResponse res)
void destroy() _javax.servlet.http.HttpServletRequest_
___javax.servlet.GenericServlet___
___javax.servlet.ServletResponse___
__javax.servlet.http.HTTPServlet__
doGet(HttpServletRequest req,
HttpServletResponse res)
doPost(HttpServletRequest req, _javax.servlet.http.HttpServletResponse_
HttpServletResponse res)
______MySimpleServlet________
Vom Servlet-Entwickler
zu implementieren
> Vorgehen
> Eigenes Servlet von HttpServlet ableiten
> Benötigte doMethod()-Methode(n) überschreiben
> Methoden
> void setHeader(String field, String value)
> Setzen beliebiger HTTP-Header-Felder
> Für die wichtigsten Header-Felder existieren eigene
Methoden
> void setContentType(String type)
> Setzt Typ des Bodys der Response (z.B. auf text/html)
> void sendError(int sc, String msg)
> Fehlermeldung senden (z.B. 404, „Seite nicht gefunden“)
> PrintWriter getWriter()
ServletOutputStream getOutputStream()
> Zum Schreiben von Zeichen bzw. Binärdaten in den Body
> …
> Konstruktor
> public Cookie(String name, String value)
_____HttpSessionListener_____ _HttpSessionActivationListener_
void sessionCreated( void sessionDidActivate(
HttpSessionEvent hse) HttpSessionEvent hse)
void sessionDestroyed( void sessionWillPassivate(
HttpSessionEvent hse) HttpSessionEvent hse)
____HttpSessionAttributeListener_____ _____HttpSessionBindingListener_____
void attributeAdded( void valueBound(
HttpSessionBindingEvent hsbe) HttpSessionBindingEvent hsbe)
void attributeRemoved( void valueUnbound(
HttpSessionBindingEvent hsbe) HttpSessionBindingEvent hsbe)
void attributeReplaced(
HttpSessionBindingEvent hsbe) Implementiert von
Attribut-Objekten
______HttpSessionEvent______ ____HttpSessionBindingEvent____
HttpSession getSession() HttpSession getSession()
String getName()
Object getValue()
> HttpSessionListener-Interface
void sessionCreated(HttpSessionEvent hse)
void sessionDestroyed(HttpSessionEvent hse)
> Implementiert von Objekten, die benachrichtigt werden wollen, wenn
eine Session erzeugt oder zerstört wird
> HttpSessionEvent-Klasse
HttpSession getSession()
> If-then-else-Konstrukt
<!--#if expr='"$DOCUMENT_URI" = "/foo.html"' -->
in foo
<!--#elif expr='"$DOCUMENT_URI" = "/bar.html"' -->
in bar
<!--#else -->
in neither
<!--#endif -->
> Tutorial
> Apache httpd Tutorial. Introduction to Server Side Includes.
http://httpd.apache.org/docs/current/howto/ssi.html
> Stafan Münz. SELFHTML: Server Side Includes.
http://de.selfhtml.org/servercgi/server/ssi.htm
> Referenzen
> W3C‘s Java Server JIGSAW. Server Side Include Reference.
http://www.w3.org/Jigsaw/Doc/User/SSI.html
> PHP-Interpreter
> Verarbeitet PHP-Datei, die PHP-Code und HTML-Code mixt
> Wechselt zwischen PHP-Code ausführen und HTML kopieren
> Zu Beginn ist der Interpreter im Modus HTML kopieren
> Die Ausgabe des Interpreters ist typischerweise eine HTML-Seite,
die an den Client übertragen wird
G. Mühl Webbasierte Anwendungen / Serverseitige Techniken 50
Geschichte
> 1995: Rasmus Lerdorf entwickelt Personal Home Page Tools
> CGI-Wrapper in Pearl, später in C geschrieben
> Datenbankanbindung für Formulare und Tabellen
> 1998: neuer Interpreter von Andi Gutmans und Zeev Suraski
> Gründung von Zend Technologies Zend Engine
> 2000: PHP4 mit besserer Performance dank Interpiler
> 2004: PHP 5 mit überarbeitetem Objektmodell
> Private Methoden und Attribute, Überladung, Exceptions, Reflection
> Integration von SQLite; XML, DOM, JSON-Unterstützung
> 2007: Beginn der Arbeiten an PHP 6, jedoch 2010 zurückgestellt
> Features fließen in PHP 5 ein
> Namensräume, Closures, Traits, Generatoren, Koroutinen
> 2015: Verabschiedung von PHP 7 aktuell PHP 7.4
> Verbesserte Performance; Teilaufgabe der Abwärtskompatibilität
Java
Server
Web-Server mit .jsp Page
JSP-Engine
generieren
Request
Client kompilieren
Cache mit
kompiliertem Java
Servlet Byte
.class Code
<mytags:cooltag>
...
</mytags:cooltag>
<HTML><BODY>
<FORM METHOD="POST" ACTION="Save.jsp">
What's your name?
<INPUT TYPE="TEXT" NAME="username" SIZE="20">
<INPUT TYPE="TEXT" NAME="email" SIZE="20">
<INPUT TYPE="SUBMIT">
</FORM>
Form.html
</BODY></HTML>
<%
String name = request.getParameter("username");
session.setAttribute("username", name);
String email = request.getParameter("email");
session.setAttribute("email", email);
Save.jsp
%>
G. Mühl Webbasierte Anwendungen / Serverseitige Techniken 70
JSP Actions
> Syntax
> mit Body <jsp:tag>body</jsp:tag>
> ohne Body <jsp:tag {attribute="name"}*/>
1.
JSP
4.
Web- 2.
Browser 3.
Java Bean DB
1.
Servlet
5.
Web- 2.
Browser 3. 4.
JSP Java Bean DB
<HTML><BODY>
<jsp:useBean id="user" class="UserData" scope="session"/>
Name: <%= user.getUsername() %><BR>
Email: <%= user.getEmail() %><BR>
</jsp:useBean> Load.jsp
</BODY></HTML>
G. Mühl Webbasierte Anwendungen / Serverseitige Techniken 76
JSP Standard Tag Library (JSTL)
> Nicht Teil der JSP-Spezifikation, sondern eigene Spezifikation
> Ersetzt Scriptlets bei einfachen Aufgaben
> Iteration: <c:foreach> Aktuelle
> Bedingungen: <c:if> Version
> Alternativen: <c:choose>, <c:when>, <c:otherwise> 1.2.1
<jsp:declaration>
Deklarationen <%! declarations %> …
</jsp:declaration>
<jsp:expression>
Ausdrücke <%= expression %> …
</jsp:expression>
<jsp:scriptlet>
Codefragmente <% code fragment %> …
</jsp:scriptlet>
<html>
...
<jsp:useBean id="computer" class="Computer" scope="request" />
Selected CPU has TDP:
<jsp:getProperty name="computer" property="CPU" /> W
...
</html> JSTL
> Spezifikationen
> JavaServer Pages 2.3 Specification. 2nd Maintenance Release of
JSR 245. http://jcp.org/en/jsr/detail?id=245
> JavaServer Pages Standard Tag Library 1.2 Specification. 2nd
Maintenance Release of JSR 52. http://jcp.org/en/jsr/detail?id=52
> Expression Language 3.1 Specification. JSR 340.
http://jcp.org/en/jsr/detail?id=340
> Tutorials
> The Java EE 5 Tutorial. Chapter 5: JavaServer Pages Technology.
http://docs.oracle.com/javaee/5/tutorial/doc/bnagx.html
> Tutorialspoint. JSP Tutorial. http://www.tutorialspoint.com/jsp
> Bücher
> Siehe Java Servlets.