Architekturen für verteilte Internetdienste - Verteilte Systeme

Werbung
1 Überblick
■ Besprechung der Aufgaben 1. Übung
■ Servlets
Architekturen für
verteilte Internetdienste
◆ Request, Response
◆ Filter
◆ Sitzungsmanagement
◆ Modularisierung
◆ Scope/Context
■ Java Server Pages (JSP)
Übung 2: Servlets + Java Server Pages
◆ Life Cycle, Inhaltserzeugung
◆ Expression Language
◆ Beans
◆ Modularisierung/ Wiederverwendung
[email protected]
◆ Klassische JSP vs. XML
◆ Tag Libraries
■ Apache Tomcat
© 2007, Holger Schmidt, Verteilte Systeme, Univ. Ulm, [u2.fm, 2007-05-07 09.38] http://www-vs.informatik.uni-ulm.de/teach/ss07/avid/
© 2007, Holger Schmidt, Verteilte Systeme, Univ. Ulm, [u2.fm, 2007-05-07 09.38] http://www-vs.informatik.uni-ulm.de/teach/ss07/avid/
2 Besprechung der Aufgaben
2.1 SAX Parser
■ SAX Parser
■ Implementierung des Handlers
public class Handler extends DefaultHandler {
■ DOM Parser
public void characters(char[] ch, int start, int length)
throws SAXException {
out.println("characters:'"+str+"'\t,"+start+":"+length);
}
■ Einfacher Zeitserver mit Java RMI
public void endDocument() throws SAXException {
out.println("end document");
}
public void endElement(String uri, String localName,
String qName) throws SAXException {
out.println("end element: '"+qName+"'\t, uri='"+uri+"'");
}
...
}
2.1
© 2007, Holger Schmidt, Verteilte Systeme, Univ. Ulm, [u2.fm, 2007-05-07 09.38] http://www-vs.informatik.uni-ulm.de/teach/ss07/avid/
2.2
© 2007, Holger Schmidt, Verteilte Systeme, Univ. Ulm, [u2.fm, 2007-05-07 09.38] http://www-vs.informatik.uni-ulm.de/teach/ss07/avid/
2.1 SAX Parser
2.2 DOM Parser
■ Main-Methode
■ Main Methode
DefaultHandler hr = new Handler();
XMLReader xr = XMLReaderFactory.createXMLReader();
factory = DocumentBuilderFactory.newInstance();
builder = factory.newDocumentBuilder();
document = builder.parse( new File( argv[0] ) );
// ggf. Validierung
xr.setFeature("http://xml.org/sax/features/validation", true);
xr.setContentHandler(hr);
xr.setErrorHandler(hr);
NodeList ndList = document.getChildNodes();
printNodesFromList( ndList, 0 );
■ Methode printNodesFromList
FileReader r = new FileReader(filepath);
xr.parse(new InputSource(r));
void printNodesFromList( NodeList ndList, int dim ) {
for( int i=0; i<ndList.getLength(); i++ )
printNodeInfos("ndList.item("+i+")", ndList.item(i), dim);
}
}
2.3
© 2007, Holger Schmidt, Verteilte Systeme, Univ. Ulm, [u2.fm, 2007-05-07 09.38] http://www-vs.informatik.uni-ulm.de/teach/ss07/avid/
2.4
© 2007, Holger Schmidt, Verteilte Systeme, Univ. Ulm, [u2.fm, 2007-05-07 09.38] http://www-vs.informatik.uni-ulm.de/teach/ss07/avid/
2.2 DOM Parser
2.3 Einfacher RMI Zeitserver
■ Methode printNodeInfos
■ Server: Schnittstelle definieren
printObj("getNodeType() = ", " + node.getNodeType(), dim);
printObj("getNodeName() = ", " + node.getNodeName(), dim);
printObj("getLocalName() = ", " + node.getLocalName(), dim);
printObj("getNodeValue() = ", " + node.getNodeValue(), dim);
if( node.hasAttributes() )
for (int i=0;i<node.getAttributes().getLength();i++){
printObj( ...node.getAttributes().item(i), dim);
}
if( node.hasChildNodes() )
printNodesFromList(node.getChildNodes(), dimension+1);
public interface Time extends java.rmi.Remote {
public String getTime()throws java.rmi.RemoteException;
}
■ Server: Implementierung
pub class TimeImpl extends UnicastRemoteObject implements Time {
public TimeImpl() throws java.rmi.RemoteException { super(); }
public String getTime() throws java.rmi.RemoteException {
return new java.util.Date().toString();
}
public static void main(String[] args) {
TimeImpl time = new TimeImpl();
java.rmi.Naming.rebind("//localhost:9999/Time", time);
}
}
2.5
© 2007, Holger Schmidt, Verteilte Systeme, Univ. Ulm, [u2.fm, 2007-05-07 09.38] http://www-vs.informatik.uni-ulm.de/teach/ss07/avid/
2.6
© 2007, Holger Schmidt, Verteilte Systeme, Univ. Ulm, [u2.fm, 2007-05-07 09.38] http://www-vs.informatik.uni-ulm.de/teach/ss07/avid/
2.3 Einfacher RMI Zeitserver
3 Servlets
■ Client
■ Ziele
◆ Plattformunabhängigkeit (JVM)
time = (Time)java.rmi.Naming.lookup("//localhost:9999/Time");
System.out.println(time.getTime());
◆ Im Vergleich zu CGI bessere Skalierbarkeit und Performanz
◆ Trennung Implementierung vs. Deployment
■ Wichtig
• Deployment Descriptor (+J2EE-Tools)
◆ Stubs mit rmic erzeugen
◆ Modularisierung, Rollentrennung
◆ RMI registry starten auf Port 9999
• GUI
◆ Klassen nicht im Klassenpfad der Registry, sonst wird Codebase entfernt
• Workflows
• Geschäftsmethoden
■ Java 1.5
• Objekt-relationale Abbildung
◆ Keine Stub-Erzeugung nötig
• Datenzugriff (z.B. abstrakte DB-API)
◆ VM-Parameter -Djava.rmi.server.ignoreStubClasses=true
• Datenhaltung (konkrete Datenbank)
◆ Basisklasse: javax.servlet.GenericServlet
◆ HTTP-Adapter: javax.servlet.http.HttpServlet
2.7
© 2007, Holger Schmidt, Verteilte Systeme, Univ. Ulm, [u2.fm, 2007-05-07 09.38] http://www-vs.informatik.uni-ulm.de/teach/ss07/avid/
2.8
© 2007, Holger Schmidt, Verteilte Systeme, Univ. Ulm, [u2.fm, 2007-05-07 09.38] http://www-vs.informatik.uni-ulm.de/teach/ss07/avid/
3 Servlets
3.1 Life Cycle
■ Einfaches Beispiel-Servlet
■ Servlet Klasse laden
■ Instanz erzeugen: init() (ggf. UnavailableException)
public class MyServlet extends HttpServlet {
■ Aufruf: service() bzw. doPost()/doGet()
public void doGet (HttpServletRequest request,
HttpServletResponse response)
throws ServletException, IOException {
◆ Auf Multi-Threading-Safety achten
◆ Requests auslesen, Response Header + Body schreiben
◆ Gesonderte Behandlung von langlaufenden Requests (BufferSize)
response.setContentType("text/html");
response.setBufferSize(8192);
PrintWriter out = response.getWriter();
■ Instanz beenden: destroy()
◆ Z.B. Synchronisation persistenter Speicher
out.println("<html>...");
out.close();
■ Diverse Listener, u.a.
}
public void doPost(...) throws ServletException, IOException {
this.doGet(request, response);
}
◆ ServletContextListener,
ServletContextAttributesListener,
HttpSessionListener, HttpSessionAttributesListener
}
2.9
© 2007, Holger Schmidt, Verteilte Systeme, Univ. Ulm, [u2.fm, 2007-05-07 09.38] http://www-vs.informatik.uni-ulm.de/teach/ss07/avid/
■ Zentrale Fehlerseiten, Filter
© 2007, Holger Schmidt, Verteilte Systeme, Univ. Ulm, [u2.fm, 2007-05-07 09.38] http://www-vs.informatik.uni-ulm.de/teach/ss07/avid/
2.10
3.2 Requests
3.3 Response
■ Manuelles Auslesen der Eingabe: getReader(), getInputStream()
◆ Sinnvoll z.B. für Uploads (POST-Data)
■ Ausgabe: getWriter(), getOutputStream()
◆ setContentType(’text/html’) oder anderen MIME-Type
◆ setBufferSize(int) kann Teildokument bei Fehler verhindern
■ HttpServletRequest-URI
◆ Status Code, Cookies, ... setzen
◆ CGI-Format: http://host:port/requestpath?querystring
◆ Ggf. Weiterleitung, Import der Ausgaben von Sub-Servlets
■ Zugriff auf Parameter
◆ close() für EndOfRequest
◆ Parameter in GET-URL kodiert oder als POST-Datenstrom
◆ Transparenter Zugriff: getParameter(name)
■ Zum Beispiel Ausgabe der Kontextdaten
■ Kontextdaten über Sitzungsmanagement
Enumeration e = request.getParameterNames();
PrintWriter out = res.getWriter();
while (e.hasMoreElements()) {
String name = (String)e.nextElement();
String value = request.getParameter(name);
out.println(name + " = " + value);
}
Enumeration e = request.getParameterNames();
while (e.hasMoreElements()) {
String name = (String)e.nextElement();
String value = request.getParameter(name);
...
}
2.11
© 2007, Holger Schmidt, Verteilte Systeme, Univ. Ulm, [u2.fm, 2007-05-07 09.38] http://www-vs.informatik.uni-ulm.de/teach/ss07/avid/
2.12
© 2007, Holger Schmidt, Verteilte Systeme, Univ. Ulm, [u2.fm, 2007-05-07 09.38] http://www-vs.informatik.uni-ulm.de/teach/ss07/avid/
3.4 Filter
3.4 Filter
■ Konzept
■ Implementierung
◆ IFCs: javax.servlet.Filter, .FilterChain, .FilterConfig
public void doFilter(ServletRequest request, ServletResponse
response, FilterChain chain)
throws IOException, ServletException {
◆ Manipulieren und Abfangen von Requests/Responses
◆ Erkennen neuer Sessions
◆ Nebeneffekte auslösen
long starttime = System.currentTimeMillis();
• Logging, Authentication, Transformation, De/Encryption
// weiter in Kette
chain.doFilter(request, response);
• Ressourcen-Verwaltung
• Filter-Implementierung möglichst ohne Abhängigkeiten zu anderen
Webdiensten
long duration = System.currentTimeMillis() - starttime;
logger.debug("Dauer: " + duration);
◆ Einreihung im Deployment Descriptor
}
• Benennung Filter
• Festlegen Wirkungstrigger: REQUEST, FORWARD, INCLUDE, ERROR
• Festlegen Wirkungsbereich: Welche Servlets?
2.13
© 2007, Holger Schmidt, Verteilte Systeme, Univ. Ulm, [u2.fm, 2007-05-07 09.38] http://www-vs.informatik.uni-ulm.de/teach/ss07/avid/
2.14
© 2007, Holger Schmidt, Verteilte Systeme, Univ. Ulm, [u2.fm, 2007-05-07 09.38] http://www-vs.informatik.uni-ulm.de/teach/ss07/avid/
3.4 Filter
3.4 Filter
■ Deployment-Deskriptor
■ Life Cycle
◆ init() ...
<filter>
<filter-name>AvIDFilter</filter-name>
<filter-class>avid.u2.AvIDFilter</filter-class>
<init-param>
<param-name>name</param-name>
<param-value>value</param-value>
</init-param>
</filter>
◆ Aufruf doFilter(Request, Response, Chain)
◆ Ggf. Manipulationen
◆ Verkettung mit FilterChain.doFilter(...)
◆ destroy() ...
■ Response manipulieren
<filter-mapping>
<filter-name>AvIDFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
◆ Stream-Double an Chain weiterleiten
◆ close()-Effekt verhindern
◆ ServletRequestWrapper(...), ServletResponseWrapper(...)
• Daten nicht direkt in OutputStream der HTTP Verbindung geschrieben
=> Filter kann Daten nachträglich manipulieren
2.15
© 2007, Holger Schmidt, Verteilte Systeme, Univ. Ulm, [u2.fm, 2007-05-07 09.38] http://www-vs.informatik.uni-ulm.de/teach/ss07/avid/
2.16
© 2007, Holger Schmidt, Verteilte Systeme, Univ. Ulm, [u2.fm, 2007-05-07 09.38] http://www-vs.informatik.uni-ulm.de/teach/ss07/avid/
3.5 Sitzungsmanagement
3.5 Sitzungsmanagement
■ Allgemeines
■ Implementierung
◆ HTTP ist zustandslos!
HttpSession session = request.getSession(true);
• Zustand: Login, Einkaufskorb, ...
◆ Mehrere Varianten für Zustandssicherung
Date created = new Date(session.getCreationTime());
Date accessed = new Date(session.getLastAccessedTime());
• Cookies, versteckte Formularfelder, URL-Decorating/Rewriting
◆ Servlets abstrahieren
=> Verwenden optimale von Browser/User unterstützte Variante
session.setAttribute(dataName, dataValue);
◆ Listener für beliebige Zustandsänderungen
String value = session.getAttribute(dataName).toString();
◆ Z.B. Einkaufskorb:
• Begin/Ende, Modifikation von Attributen
• HttpSessionBindingListener,
HttpSessionActivationListener
HttpSession.setAttribute( “cart“ , new ShoppingCart())
2.17
© 2007, Holger Schmidt, Verteilte Systeme, Univ. Ulm, [u2.fm, 2007-05-07 09.38] http://www-vs.informatik.uni-ulm.de/teach/ss07/avid/
2.18
© 2007, Holger Schmidt, Verteilte Systeme, Univ. Ulm, [u2.fm, 2007-05-07 09.38] http://www-vs.informatik.uni-ulm.de/teach/ss07/avid/
3.5 Sitzungsmanagement
3.6 Modularisierung
■ Logout
■
◆ Timeout für Session konfigurieren
Dispatching
◆ Szenario: ein öffentlich sichtbares Servlet mit Parameter action=...
◆ Session.invalidate()
• Vorteil: zentrales URL-Management (Workflow-Management)
• Weiterleitung pro Action an interne Worker-Servlets/JSPs
■ Besonderheit: Links
■ Inclusion
◆ Eigene Links ggf. mit Session-ID versehen
◆ Szenario: wiederverwendbare Fragmente der Ausgabe
◆ Sonst ”springen“ Links aus dem Session-Context
• Titel, Fuß-/Kopfzeile, Navigation, ...
◆ Response.encodeURL()
getRequestDispatcher(URL).include(Request, Response)
• ” ; jsessionid=c0o7fszeb1” wird an alle Links angehängt
oder: ID wird in Cookies Client-seitig gespeichert (falls zulässig)
◆ Outgoing Links ohne Zustandsmarkierung
■ Forwarding
• Session bleibt hängen bis zum Timeout!
◆ Szenario: Weiterleitung, z.B. von intern agierendem Servlet an Ausgabe-JSP
getRequestDispatcher(URL).forward(Request, Response)
2.19
© 2007, Holger Schmidt, Verteilte Systeme, Univ. Ulm, [u2.fm, 2007-05-07 09.38] http://www-vs.informatik.uni-ulm.de/teach/ss07/avid/
2.20
© 2007, Holger Schmidt, Verteilte Systeme, Univ. Ulm, [u2.fm, 2007-05-07 09.38] http://www-vs.informatik.uni-ulm.de/teach/ss07/avid/
3.7 Scope-/Context-Objekte
4 Java Server Pages (JSP)
■ Idee
■ Grundlegende Ideen
◆ Informationsaustausch zwischen Servlets
◆ Ziel: Rollentrennung Dokument-Autor/Designer vs. Programmierer
◆ Zustandsdaten für Applikation, Session, Request, ...
◆ Inversion der Servlets
◆ Textdokument durch Kommandos und Servletfragmente angereichert
• ServletContext, HttpSession, ServletRequest, ...
• Forwarding/Inclusion
Object o = this.getServletContext().getAttribute(attributeName);
• Zugriff auf Kontextdaten
• Zugriff auf JavaBeans
◆ Koordinierung der Servlet-Threads notwendig!
• Zusatzfunktionen (DB, ...)
◆ Bootstrapping
• ServletContextListener global anmelden (Deployment Descriptor)
◆ Kommandos klassisch: <%...%>
• XML-Variante <jsp:something> (JSP Version 2.0)
• Bei Erzeugung eines Servlet vor dessen init() benachrichtigt
◆ Dateiendung .jsp
• Daten in ServletContext vor-initialisieren
• Für Fragmente .jspf
■ Kurzreferenz Syntax-Card:
http://java.sun.com/products/jsp/docs.html#syntax
2.21
© 2007, Holger Schmidt, Verteilte Systeme, Univ. Ulm, [u2.fm, 2007-05-07 09.38] http://www-vs.informatik.uni-ulm.de/teach/ss07/avid/
2.22
© 2007, Holger Schmidt, Verteilte Systeme, Univ. Ulm, [u2.fm, 2007-05-07 09.38] http://www-vs.informatik.uni-ulm.de/teach/ss07/avid/
4.1 Syntax
4.1 Syntax
■ Kommentare (JSP/HTML)
■ Beispiel
<%-- ...--%>
<!-- ... -->
<%@
<%@
<%@
<%!
■ Direktiven
<%@ page import=“java.util.Hashtable“ %>
page contentType="text/html; charset=UTF-8" %>
taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
taglib uri="/functions" prefix="f" %>
String header="Header"; %>
<html> <head><title>Example</title></head>
<body>
■ Java Ausdrücke
<h1><%=header%></h1>
<%= 5 + 7 %>
<c:set var="fooString" value="${param.foo}" />
<c:set var="isFoo" value="${!empty fooString}" />
■ Java Deklarationen
...
<%! int i = 1; %>
■ Scriptlets (Java Anweisungen)
<% time.getTime(); %>
2.23
© 2007, Holger Schmidt, Verteilte Systeme, Univ. Ulm, [u2.fm, 2007-05-07 09.38] http://www-vs.informatik.uni-ulm.de/teach/ss07/avid/
2.24
© 2007, Holger Schmidt, Verteilte Systeme, Univ. Ulm, [u2.fm, 2007-05-07 09.38] http://www-vs.informatik.uni-ulm.de/teach/ss07/avid/
4.1 Syntax
4.2 Life Cycle
■ Beispiel
■ Prüfung, ob Servlet im Cache älter als JSP
◆ Ggf. Transformation in Servlet und Übersetzung
...
◆ Compilerfehler werden ggf. erst bei erster Nutzung erkannt
<h2>Locale:</h2> <!-- Gebietsschema -->
<jsp:useBean id="locales" scope="application" class="a.Loc"/>
<p>
<c:forEach var="localeString" items="${locales.localeNames}" >
locale ${localeString},
</c:forEach>
</p>
<jsp:useBean id="date" class="mypkg.MyDate"/>
<jsp:setProperty name="date" property="locale"
value="${locales.selectedLocale}"/>
<p>Date: ${date.date}</p>
• Einstiegspunkte zur Initialisierung oder vor dem Entfernen
<jsp:declaration>
public void jspInit() {...}
public void jspDestroy() {...}
</jsp:declaration>
■ Zentrale Fehlerseite
<%@ page errorPage=”...”%>
<%@ page isErrorPage=”true”%>
</body>
</html>
2.25
© 2007, Holger Schmidt, Verteilte Systeme, Univ. Ulm, [u2.fm, 2007-05-07 09.38] http://www-vs.informatik.uni-ulm.de/teach/ss07/avid/
■ jspInit() ... _jspService() ... jspDestroy()
■ Automatisches Buffering: <%@ page buffer=”none|xxxkb”%>
© 2007, Holger Schmidt, Verteilte Systeme, Univ. Ulm, [u2.fm, 2007-05-07 09.38] http://www-vs.informatik.uni-ulm.de/teach/ss07/avid/
2.26
4.3 Inhaltserzeugung
4.4 Expression Language (EL)
■ Setzen des Content-Types, Encoding
■ Vgl. XPath
■ ${expr} in statischem Text und Tag-Attributwerten
<%@ page contentType=”text/html; charset=UTF-8”%>
<c:set var="a" value="${!empty selectedLocaleString}"/>
■ Auf Thread-safety achten oder...
■ Escaping für Klammeranfang (EL)
<%@page isThreadSafe=”false” %>
${’${’}
Ergebnis: ${
■ Variablen-Traversierung mit . und []: a.b = a[”b”]
■ Scriptlets
Map[String-Key]
List[int-Offset]
JavaBean[Property-Name]
◆ eingebetteter Servlet-Code (durch Custom Tags ersetzbar)
<%
System.out.println("Aktuelles Datum:");
java.util.Date date = new java.util.Date();
■ Literale: true, false, null, \” , \’, \\, floats, ints, Strings
%>
... <%= date %>
■ Übliche arith./log. Operatoren
2.27
© 2007, Holger Schmidt, Verteilte Systeme, Univ. Ulm, [u2.fm, 2007-05-07 09.38] http://www-vs.informatik.uni-ulm.de/teach/ss07/avid/
2.28
© 2007, Holger Schmidt, Verteilte Systeme, Univ. Ulm, [u2.fm, 2007-05-07 09.38] http://www-vs.informatik.uni-ulm.de/teach/ss07/avid/
4.4 Expression Language (EL)
4.5 Beans
■ Implizite Objekte definiert
■ Deklaration:
◆ Kontexte: pageContext.servletContext, .session, .request, .response
<jsp:useBean id =”beanName” class=”classname” scope=”scope”>
<jsp: setProperty .../> <!-- optional --> ...
◆ Maps: param, header, param/headerValues, cookie, initParam
◆ Attribut-Maps: page-, request-, session-, applicationScope
■ Scope:
■ empty x
<c:set var="isSelected" value="${!empty selectedLocaleString}" />
■ Eigene Funktionen wie Tags als ”function“ entwickeln
<%@ taglib prefix=”z” uri=”/zak”%>
...
<z:when test=”${f:equals(...)}”>
◆ page
Bean wird zerstört, wenn Seite fertig generiert
◆ request
Bean wird zerstört, wenn Response gesendet
◆ session
Bean wird zerstört, wenn Session beendet
◆ application
Bean wird zerstört, wenn Web-Applikation entfernt
■ Zugriff:
<jsp:getProperty name=”beanName” property=”propName”/>
<jsp:setProperty name=”beanName” property=”propName” value=”.”/>
■ Aktivierung / Deaktivierung
<%@ page isELIgnored ="true|false" %>
© 2007, Holger Schmidt, Verteilte Systeme, Univ. Ulm, [u2.fm, 2007-05-07 09.38] http://www-vs.informatik.uni-ulm.de/teach/ss07/avid/
2.29
■ Property-Traversierung mit EL: ${bean.propName}
© 2007, Holger Schmidt, Verteilte Systeme, Univ. Ulm, [u2.fm, 2007-05-07 09.38] http://www-vs.informatik.uni-ulm.de/teach/ss07/avid/
2.30
4.6 Modularisierung / Wiederverwendung
4.7 Klassische JSP vs. XML
■ Tag Files: enthalten Dokumentfragmente
■ Wohlgeformte .jspx-Dokumente
◆ Entities statt <, >, ...
■ Inklusion
◆ ${EL-expr} weiterhin möglich
◆ Bei Übersetzung
◆ <jsp:something>... statt <%...%>
<%@ include file=”banner.jspf”%>
◆ xmlns:x=”URI” statt <%@ taglib uri=”URI”prefix=”x” %>
◆ Bei Ausführung
■ Deployment: Property is-xml setzen
<jsp:include page=”response.jsp”/>
■ Mögliche Anwendung
■ Forwarding
◆ Postprocessing mittels XSLT, XML-Streaming zwischen Anwendungen
<jsp:forward page=”/main.jsp” />
■ Automatische Anpassung (klassisch/XML) durch den Container bei Imports
■ Optional: <jsp:root version=”2.0” > als DocRoot
■ Preludes und Codas
◆ Multi-Dokument Ausgaben (Sequenz von Dokumenten)
◆ Global deklarierte Fragmente vor/nach Ausgabe
◆ Deployment-Deskriptor
■ Ziel-DTD angebbar
2.31
© 2007, Holger Schmidt, Verteilte Systeme, Univ. Ulm, [u2.fm, 2007-05-07 09.38] http://www-vs.informatik.uni-ulm.de/teach/ss07/avid/
<jsp:output doctype-root-element=”books” ... doctype-system=”books.dtd”/>
2.32
© 2007, Holger Schmidt, Verteilte Systeme, Univ. Ulm, [u2.fm, 2007-05-07 09.38] http://www-vs.informatik.uni-ulm.de/teach/ss07/avid/
4.7 Klassische JSP vs. XML
4.8 Java Server Pages Standard Tag Library (JSTL)
■ Beispiel (angelehnt an Tomcat JSP example)
■ Standardisierte Tags
◆ Interoperabilität
<tags:xhtmlbasic xmlns:tags="urn:jsptagdir:/WEB-INF/tags"
xmlns:jsp="http://java.sun.com/JSP/Page"
xmlns:fmt="http://java.sun.com/jsp/jstl/fmt"
xmlns="http://www.w3.org/1999/xhtml">
<jsp:directive.page contentType="text/html" />
<head>
<title>...</title>
</head>
<body>
<h1>...</h1>
◆ Rollentrennung
◆ Programmierung “ohne Java”
■ XML-Manipulation, DB, I18N, Conditionals, Flusskontrolle
■ Komponenten
◆ Core
<jsp:useBean id="now" class="java.util.Date" />
<fmt:formatDate value="${now}" pattern="MMMM d, yyyy,
HH:mm:ss"/>
</body>
</tags:xhtmlbasic>
http://java.sun.com/jsp/jstl/core
◆ XML
http://java.sun.com/jsp/jstl/xml
◆ I18N
http://java.sun.com/jsp/jstl/fmt
◆ SQL
http://java.sun.com/jsp/jstl/sql
◆ Functionshttp://java.sun.com/jsp/jstl/functions
2.33
© 2007, Holger Schmidt, Verteilte Systeme, Univ. Ulm, [u2.fm, 2007-05-07 09.38] http://www-vs.informatik.uni-ulm.de/teach/ss07/avid/
2.34
© 2007, Holger Schmidt, Verteilte Systeme, Univ. Ulm, [u2.fm, 2007-05-07 09.38] http://www-vs.informatik.uni-ulm.de/teach/ss07/avid/
4.8 Java Server Pages Standard Tag Library (JSTL)
4.8 Java Server Pages Standard Tag Library (JSTL)
■ Deklaration als xmlns:prefix oder:
■ Beispiel: Core
◆ Variablen setzen/löschen
<%@ taglib uri=”http://java.sun.com/jsp/jstl/core” prefix=”c” %>
■ Interaktion mit Tag-Daten
◆ Flusskontrolle
<c:if test=”...”>...
<c:set var=”bookId” value=”${param.Add}”/>
<jsp:useBean id=”bookId” type=”java.lang.String” />
<c:choose>
<c:when test=”...”>...
<c:otherwise> ...
<% cart.add(bookId); %>
<sql:query var=”books” dataSource=”${applicationScope.DB}”>
select * from PUBLIC.books where id = ?
<sql:param value=”${bookId}” />
</sql:query>
<c:forEach var=”item” items=”${sessionScope.cart.items}”>...
◆ Import, Redirect
2.35
© 2007, Holger Schmidt, Verteilte Systeme, Univ. Ulm, [u2.fm, 2007-05-07 09.38] http://www-vs.informatik.uni-ulm.de/teach/ss07/avid/
2.36
5 Apache Tomcat
■ Implementierung, z.B.:
■ Servlet Container
◆ http://tomcat.apache.org/ (Aktuelle Version: 5.5.23 bzw. 6.0.10)
public ATagImpl extends SimpleTagSupport { ...
public void doTag() throws JspException, IOException {
getJspContext().getOut().write(”AVID-SS07”);
}
}
■ Umfangreiche Beispielsammlung!
■ Tomcat liefert kleinen HTTP-Server mit (Default Port 8080)
◆ Inkl. Admin/Managemente-Konsole
■ Zusätzlich Parameter, Variablen, Nested-Tags, ...
■ Anbindung an HTTP-Server möglich
■ Tag Library Descriptor (TLD)
◆ Bsp.: Apache Proxy Modul greif ab best. Pfadpräfix
...
<tag>
<name>atag</name>
<tag-class>infvs.avid.tags.ATagImpl</tag-class>
<body-content>scriptless</body-content>
...
<attribute> <name>test</name> ... </attribute>
...
</tag>
© 2007, Holger Schmidt, Verteilte Systeme, Univ. Ulm, [u2.fm, 2007-05-07 09.38] http://www-vs.informatik.uni-ulm.de/teach/ss07/avid/
<c:import url=”/books.xml” var=”xml”>
<c:param ...>
<c:redirect url=”...”>
<c:param ...>
© 2007, Holger Schmidt, Verteilte Systeme, Univ. Ulm, [u2.fm, 2007-05-07 09.38] http://www-vs.informatik.uni-ulm.de/teach/ss07/avid/
4.9 Custom Tags
■ Weitaus komplexere Konstrukte möglich...!
<c:set var=”pass” scope=”session” value=”${param.PwdField}”/>
<c:remove var=”pass” scope=”session”/>
◆ http://www.sw/tomcat/MyApps/Intro?param1
• ”tomcat“ ist Suchmuster für Proxy Modul
• ”MyApps“ ist Context Root der Web-Application
• ”Intro“ ist Servlet-Alias
• “param1“ ist Parameter
2.37
2.38
© 2007, Holger Schmidt, Verteilte Systeme, Univ. Ulm, [u2.fm, 2007-05-07 09.38] http://www-vs.informatik.uni-ulm.de/teach/ss07/avid/
5.1 Deployment
5.1 Deployment
■ Web ARchive (.war)
■ Beispiel: Deployment-Descriptor (stark gekürzt)
◆ JAR-File mit striktem Aufbau
<web-app
xmlns="http://java.sun.com/xml/ns/j2ee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee
http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd"
version="2.4">
/ – Document Root (.html, .jsp, ...)
/WEB-INF/web.xml – Deployment Descriptor
/WEB-INF/classes – Java Class Files
/WEB-INF/lib – JARs
◆ Servlets/Filter... werden logisch definiert und benamt
◆ Logische Namen an konkrete Pfade geknüpft
<display-name>My Web Application</display-name>
<context-param>
<param-name>webmaster</param-name>
<param-value>[email protected]</param-value>
...
■ WAR in ${TOMCAT}/webapps/... kopieren
◆ Auto-Deployment und Entpacken durch Tomcat
[...]
■ Archivname ohne WAR wird Context Root
2.39
© 2007, Holger Schmidt, Verteilte Systeme, Univ. Ulm, [u2.fm, 2007-05-07 09.38] http://www-vs.informatik.uni-ulm.de/teach/ss07/avid/
2.40
© 2007, Holger Schmidt, Verteilte Systeme, Univ. Ulm, [u2.fm, 2007-05-07 09.38] http://www-vs.informatik.uni-ulm.de/teach/ss07/avid/
5.1 Deployment
6 Aufgaben
■ Beispiel: Deployment-Descriptor (stark gekürzt)
■ Tomcat
◆ Installieren
[...]
◆ Doku/Beispiele studieren
◆ J2EE-Tutorial
<servlet>
<servlet-name>first</servlet-name>
<servlet-class>sw.myhost.FirstServlet</servlet-class>
<init-param>
<param-name>testInit</param-name>
<param-value>bla</param-value>
</init-param> ...
◆ Google, ...
■ Servlets
◆ Implementierung einer einfachen Taskliste
• Vector von TaskData-Objekten im Servlet Context
<servlet-mapping>
<servlet-name>first</servlet-name>
<url-pattern>*.do</url-pattern> ...
• Anzeige u. Hinzufügen von Tasks (einfaches Formular: Eingabefeld + Submit)
• Ggf. Löschen von Tasks
<session-config>
<session-timeout>30</session-timeout> ...
■ Java Server Pages
◆ Implementierung Taskliste (Funktionalität: TaskBean, Context: Application)
</web-app>
2.41
© 2007, Holger Schmidt, Verteilte Systeme, Univ. Ulm, [u2.fm, 2007-05-07 09.38] http://www-vs.informatik.uni-ulm.de/teach/ss07/avid/
◆ Gleiche Funktionalität/ Erscheinungsbild wie Servlet-Anwendung
© 2007, Holger Schmidt, Verteilte Systeme, Univ. Ulm, [u2.fm, 2007-05-07 09.38] http://www-vs.informatik.uni-ulm.de/teach/ss07/avid/
2.42
6 Aufgaben
■ Screenshot (Servlets / JSP Aufgabe)
2.43
© 2007, Holger Schmidt, Verteilte Systeme, Univ. Ulm, [u2.fm, 2007-05-07 09.38] http://www-vs.informatik.uni-ulm.de/teach/ss07/avid/
Herunterladen