Dynamische Webseiten
CGI & co
CGI - Lösung für alle ?
Ja
Nein
CGI kann alles tun, was man für Anwendungen braucht
flexibel (beliebige Programmiersprache,...)
einfach
portabel
Performance
Ablauf
Webserver erkennt, daß Programm aufgerufen werden soll
erzeugt neuen Prozeß (ggf. mit Skript Interpreter)
dieser läuft ab
und terminiert
© till.haenisch@gmx.de
Lösungen
1) Programme als Module in Webserver gelinkt
2) Webserver mit eingebautem Skript-Interpreter
Apache modules, nsapi, IIS dll
Performance sehr gut
Portabilität/Flexibilität weg
Aufwendige Programmierung (APIs,...)
z.B. Perl, PHP, ASP, OWAS (?), ...
Portabilität/Flexibilität eingeschränkt
Performance gut
einfache Programmierung
3) Servlets/JSP
im Prinzip wie 1)
kombiniert Vorteile von beiden
© till.haenisch@gmx.de
Architektur
Browser
Webserver
ServletEngine
Servlet
Servlet
Servlet
Servlet
Browser
ServletEngine mit
eingebautem
Webserver
Servlet
Servlet
Servlet
Servlet
© till.haenisch@gmx.de
Servlet Engines
Java Webserver (SUN)
Websphere (IBM)
Apache module + Servlet Engine
Tomcat (Apache)
Application Server
komplex
Load Balancing
....
Jserv (Apache)
Referenzimplementierung
standalone oder Apache module
einfach und schnell
und viele andere
© till.haenisch@gmx.de
Servlet
javax.servlet
javax.servlet.http
generisch
http
Java Klasse
abgeleitet von HttpServlet
keine main() Methode
Überschreiben von doGet() und/oder doPost()
ServletRequest
Parameter, input Stream
ServletResponse
Session, outputStream
© till.haenisch@gmx.de
Lebenszyklus eines Servlets
Servlet wird vom Anwender kompiliert
beim ersten Aufruf von der engine geladen
bei jedem weiteren Aufruf wird nur die
entsprechende Methode ausgeführt
Klasse wird dynamisch geladen
genauer: ausgeführt wird service()
die doHeader() ... ausführt und je nach Methode
doGet() oder
doPost()
kaum Overhead
© till.haenisch@gmx.de
Hello World
mit GET
import java.io.*;
import javax.servlet.*;
import javax.servlet.http.*;
public class HelloWorld extends HttpServlet
{
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException
{
// Was liefern wir zurueck ?
// Hier: ASCII Text, kein HTML
response.setContentType("text/plain");
// Output liefern wir ueber "normale" Java IO
PrintWriter pw = response.getWriter();
pw.println("Hello World");
pw.close();
}
}
© till.haenisch@gmx.de
Hello World
mit POST
import java.io.*;
import javax.servlet.*;
import javax.servlet.http.*;
public class HelloWorld extends HttpServlet
{
public void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException
{
// Was liefern wir zurueck ?
// Hier: ASCII Text, kein HTML
response.setContentType("text/plain");
// Output liefern wir ueber "normale" Java IO
PrintWriter pw = response.getWriter();
pw.println("Hello World");
pw.close();
}
}
© till.haenisch@gmx.de
Hello World
beide ?
import java.io.*;
import javax.servlet.*;
import javax.servlet.http.*;
public class HelloWorld extends HttpServlet
{
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException
{
// Was liefern wir zurueck ?
// Hier: ASCII Text, kein HTML
response.setContentType("text/plain");
// Output liefern wir ueber "normale" Java IO
PrintWriter pw = response.getWriter();
pw.println("Hello World");
pw.close();
}
public void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException
{
doGet(request,response);
}
© till.haenisch@gmx.de
}
Initialisierung
Zur Initialisierung kann die init-Methode
überschrieben werden
public void init(ServletConfig conf)
throws ServletException {
super.init(conf);
count = 0;
}
z.B. Verbindung zur DB herstellen
evtl. schlechte Idee (Fehlerbehandlung)
Verbindungen zu factories,... aufsetzen
Konfigurationsinformationen lesen
...
© till.haenisch@gmx.de
Parameter
HttpServletRequest.getParameter(name)
String par = request.getParameter("ID");
liefert den Wert des Parameters (hier ID) als String
bei GET und POST
Problem: Parameter mit Sonderzeichen
Lösung: URL-encoding
z.B. ' ' (blank) als +
© till.haenisch@gmx.de
Session
Wie werden Informationen von einer Seite zur
anderen transportiert ?
etwa Benutzername, DB Verbindung,...
z.B. Cookies, URL-rewriting,... manuell
oder automatisch: Session Objekt
HttpServletRequest.getSession() liefert HttpSession
Methoden
getAttribute(name)/setAttribute(name,Wert)
liefert/setzt beliebiges Object
cast nötig
HttpSession session = request.getSession();
count =(Integer)session.getAttribute("COUNT");
© till.haenisch@gmx.de