AVID Übung1 - XML, Servlets

Werbung
AVID Übung1
XML, Servlets, ...
Andreas I. Schmied (schmied@inf...)
Abteilung Verteilte Systeme
Universität Ulm
SS2005
Übersicht
Und nun. . .
1
Übersicht
Semesterthema
Konzept
Literatur
Andreas I. Schmied (schmied@inf...)
AVID Übung1
SS2005
2 / 74
Übersicht
Semesterthema
Übersicht – Semesterthema
Kalender im Web“
”
Verteilung der Kalenderdienste auf mehrere Rechner
Aggregationsdienst über mehrere Kalender
Vorgehen
schrittweise verfeinert
mit verschiedenen Techniken implementiert
verschiedene Plattformen“
”
Inhalte z.T. auch in VL Web-Engineering (MI, zuletzt WS2004)
Übung ist prüfungsrelevant!
Quellcodes sind meist nicht Java-konform gekürzt und nicht direkt
übersetzbar
Andreas I. Schmied (schmied@inf...)
AVID Übung1
SS2005
3 / 74
Übersicht
Konzept
Übersicht – Konzept
Andreas I. Schmied (schmied@inf...)
AVID Übung1
SS2005
4 / 74
Übersicht
Literatur
Übersicht – Literatur
Sun: J2EE-TutorialVersion1.4
Kapitelauswahl
2, 4-7, B – XML-Grundlagen
11-13 – Servlets, JSP
14-16 – TagLibs, Scripting
17-21 – JavaServer Faces
22 – i18n, l10n
Spezifikationen zu Servlets, JSP, J2EE
Andreas I. Schmied (schmied@inf...)
AVID Übung1
SS2005
5 / 74
XML
Und nun. . .
2
XML
SAX
DOM-API
JDOM, dom4j, StAX
Andreas I. Schmied (schmied@inf...)
AVID Übung1
SS2005
6 / 74
XML
XML – Relevante XML-Sprachen
(X)HTML (, SVG, DocBook, XSL-FO )
XPath (, XPointer, XLink, XInclude )
Navigation/Datenextraktion in XML-Dokumenten
XML-Schema (, RelaxNG, DTD, Schematron)
http://www.w3.org/TR/xmlschema-0/
http://www.xfront.com/BestPracticesHomepage.html
XSLT
Transformation von XML nach XML/HTML/Text/...
Literatur (Referenzen, Tutorials, Vergleiche)
http://www.zvon.org
http://www.w3schools.com
Andreas I. Schmied (schmied@inf...)
AVID Übung1
SS2005
7 / 74
XML
XML – XML-APIs für Java
Konzept
herstellerunabhängige Schnittstelle
beliebige Implementierung
Auswahl zur Laufzeit: System Properties + Factories
Packages: javax.xml, org.xml, org.w3c
DOM-Parser: Baum von Elementen des Dokuments
sprachunabhängiges Document Object Model
SAX-Parser: Stream Pushing
Simple API for XML
StAX-Parser: Stream Pulling
JDOM-Parser: DOM à la Java
aktueller Parser im Java SDK: Apache-Xerces
http://xml.apache.org/xerces2-j
http:
//java.sun.com/j2se/1.5.0/docs/guide/standards
Andreas I. Schmied (schmied@inf...)
AVID Übung1
SS2005
8 / 74
XML
SAX
SAX – Grundlagen
Event-Driven Parsing
Push von Elementen“ des Dokuments an Handler
”
zustandsloser Stream ohne Navigationsmöglichkeit
Vorgehen
SAXParserFactory erzeugt SAXParser (package javax.xml.parsers)
dessen SAXReader ruft diverse Handler auf
ContentHandler, ErrorHandler, DTDHandler, EntityResolver, ...
eigenen von DefaultHandler ableiten und ergänzen
Andreas I. Schmied (schmied@inf...)
AVID Übung1
SS2005
9 / 74
XML
SAX
SAX – Programmierung
DefaultHandler ableiten
ggf. weitere Handler für CDATA, DTD-Elemente, ...
Factory, Parser initialisieren und starten
ggf. validierendes Parsen, Namespace-Awareness konfigurieren
Andreas I. Schmied (schmied@inf...)
AVID Übung1
SS2005
10 / 74
XML
SAX
SAX – Handler implementieren, parsen
1
2
3
4
5
public
{
void
void
void
startDocument ( ) throws SAXException { . . . }
endDocument ( ) . . .
s t a r t E l e m e n t ( S t r i n g namespaceURI ,
S t r i n g sName , S t r i n g qName,
Attributes attrs ) . . .
void endElement
( S t r i n g namespaceURI ,
S t r i n g sName , S t r i n g qName) . . .
void c h a r a c t e r s
( char [ ] buf , i n t o f f s e t , i n t l e n ) . . .
...
void i g n o r a b l e W h i t e s p a c e ( char [ ] buf , i n t o f f s e t , i n t l e n ) . . .
void p r o c e s s i n g I n s t r u c t i o n ( S t r i n g t a r g e t , S t r i n g data ) . . .
void setDocumentLocator
( Locator l ) . . .
...
void warning ( SAXParseException e ) . . .
void e r r o r
( SAXParseException e ) . . .
6
7
8
9
10
11
12
13
14
15
16
17
18
class MyHandler extends D e f a u l t H a n d l e r
}
Andreas I. Schmied (schmied@inf...)
AVID Übung1
SS2005
12 / 74
XML
SAX
SAX – Einstellungen für validierendes Parsen
1
2
3
4
5
6
7
f a c t o r y . s e t V a l i d a t i n g ( true ) ;
f a c t o r y . setNamespaceAware ( t r u e ) ;
...
S t r i n g JAXP SCHEMA LANGUAGE =
” h t t p : / / j a v a . sun . com / xml / j a x p / p r o p e r t i e s / schemaLanguage ” ;
S t r i n g W3C XML SCHEMA = ” h t t p : / / www. w3 . org / 2 0 0 1 /XMLSchema ” ;
p a r s e r . s e t P r o p e r t y (JAXP SCHEMA LANGUAGE, W3C XML SCHEMA ) ;
8
9
10
11
12
/ / e v t l . b e i altem Xerces
factory . setAttribute (
” h t t p : / / apache . org / xml / f e a t u r e s / v a l i d a t i o n / schema ” ,
new Boolean ( t r u e ) ) ;
13
14
15
16
factory . setAttribute (
” h t t p : / / apache . org / xml / f e a t u r e s / v a l i d a t i o n / schema−f u l l −checking ” ,
new Boolean ( t r u e ) ) ;
Andreas I. Schmied (schmied@inf...)
AVID Übung1
SS2005
14 / 74
XML
DOM-API
DOM-API – Grundlagen
Parsing läuft automatisch durch und erzeugt DOM-Baum
Navigation auf Dokumentbaum von mäßig getypten Knoten
sprachunabhängige API
alles ist ein Knoten (Element, Attribut, Text, ...)
schwerfällig, nicht Java-SDK-alike“
”
getElementsByTagName() ist transitiv, nicht auf direkte Subknoten
beschränkt
getChildNodes() liefert alle Subknoten, nicht nur Subelemente
nervig: getNodeType()==Node.ELEMENT NODE
1
2
3
4
5
6
7
8
Node c h i l d = data . g e t F i r s t C h i l d ( ) ;
while ( c h i l d ! = n u l l ) {
i f ( c h i l d . getNodeType ( ) == Node . ELEMENT NODE) {
Element e = ( Element ) c h i l d ; . . .
}
else . . .
child = child . getNextSibling ( ) ;
}
Alternativen: dom4j, JDOM (s.u.)
Andreas I. Schmied (schmied@inf...)
AVID Übung1
SS2005
16 / 74
XML
DOM-API
DOM-API – Vorgehen
DocumentBuilderFactory erzeugt DocumentBuilder
Document per newDocument() oder Parsing erzeugen
Root-Element: Document.getDocumentElement()
Node-API mit nodeValue(), nodeType(), nodeName()
Beispiel: <e>bla<e>
<e>: nodeType()=”e”, nodeValue()=null
bla: nodeType()=”#text”, nodeValue()=”bla”
Andreas I. Schmied (schmied@inf...)
AVID Übung1
SS2005
18 / 74
XML
DOM-API
DOM-API – Parsen
1
2
3
DocumentBuilderFactory f a c t o r y ;
DocumentBuilder
builder ;
Document
doc ;
4
5
6
f a c t o r y = DocumentBuilderFactory . newInstance ( ) ;
/ / E i n s t e l l u n g e n zum V a l i d i e r e n / Namespaces analog zu SAX
7
8
9
b u i l d e r = f a c t o r y . newDocumentBuilder ( ) ;
b u i l d e r . s e t E r r o r H a n d l e r (new org . xml . sax . E r r o r H a n d l e r ( ) { . . . } ) ;
10
11
doc
= b u i l d e r . parse ( new F i l e ( ” data . xml ” ) ) ;
Andreas I. Schmied (schmied@inf...)
AVID Übung1
SS2005
20 / 74
XML
DOM-API
DOM-API – Methoden (Auswahl)
org.w3c.dom.Node
appendChild, removeChild, getTextContent, getParentNode,
getOwnerDocument, getNodeName/Type/Value,
get/hasAttributes, getFirst/LastChild, getNextSibling,
getChildNodes
org.w3c.dom.Document
getDocumentElement, createAttribute, createElement,
createTextNode, getElementsByTagName
Ableitungen: org.w3c.dom.Element, .Attr, .Comment, .Text, ...
Andreas I. Schmied (schmied@inf...)
AVID Übung1
SS2005
21 / 74
XML
JDOM, dom4j, StAX
JDOM, dom4j, StAX – JDOM
Packages org.jdom.** von http://www.jdom.org
nutzt SAX/DOM-Parser, z.B. via org.jdom.input.SAXBuilder
konkrete Klassen anstatt Interfaces
Java-OOP DOM-Zugriff
eher für XML-Daten als für Mixed-Content
JSR-102 javax.xml.tree
analoge Methoden zum Manipulieren, Validieren
Alternative dom4j
schneller/kleiner
auf Interfaces aufbauende Implementierung
schnelle Traversierung großer Dokumente
XPath-Integration
Andreas I. Schmied (schmied@inf...)
AVID Übung1
SS2005
22 / 74
XML
JDOM, dom4j, StAX
JDOM, dom4j, StAX – JDOM-Beispiel
1
SAXBuilder b u i l d e r = new SAXBuilder ( t r u e ) ;
2
3
4
Document doc = b u i l d e r . b u i l d ( ” data . xml ” ) ;
Element r o o t = doc . getRootElement ( ) ;
5
6
7
8
9
10
p r i n t l n ( ” Element : ” + r o o t . getName ( ) ) ;
for ( A t t r i b u t e a : root . g e t A t t r i b u t e s ( ) )
p r i n t l n ( ”− A t t r i b u t e ” +a . getName ( ) + ” = ” +a . getValue ( ) ) ;
f o r ( Element e : r o o t . g e t C h i l d r e n ( ) )
p r i n t l n ( ”− Element
” +e . getName ( ) ) ;
Andreas I. Schmied (schmied@inf...)
AVID Übung1
SS2005
24 / 74
XML
JDOM, dom4j, StAX
JDOM, dom4j, StAX – XML-Pull-Parsing lt. JSR-173
javax.xml.stream
1
2
3
4
URL u = new URL( ” data . xml ” ) ;
InputStream i n = u . openStream ( ) ;
XMLInputFactory f a c t o r y = XMLInputFactory . newInstance ( ) ;
XMLStreamReader p a r s e r = f a c t o r y . createXMLStreamReader ( i n ) ;
5
6
7
8
9
10
11
12
13
14
15
16
f o r ( i n t event = p a r s e r . n e x t ( ) ;
event ! = XMLStreamConstants .END DOCUMENT;
event = p a r s e r . n e x t ( ) ) {
switch ( event ) {
case XMLStreamConstants . START ELEMENT :
case XMLStreamConstants . END ELEMENT :
p a r s e r . getLocalName ( ) ; break ;
case XMLStreamConstants .CDATA:
case XMLStreamConstants .CHARACTERS:
p a r s e r . g e t T e x t ( ) ; break ;
}
}
parser . close ( ) ;
Andreas I. Schmied (schmied@inf...)
AVID Übung1
SS2005
26 / 74
CGI
Und nun. . .
3
CGI
Motivation, Vorgehen
Beispiele
Andreas I. Schmied (schmied@inf...)
AVID Übung1
SS2005
27 / 74
CGI
Motivation, Vorgehen
CGI – Motivation, Vorgehen
Dokumente mit dynamisch generierten Inhalten
Verfahren zur Parameterübergabe festgelegt
Common Gateway Interface
Interoperabilität zw. Skripten und div. HTTP-Servern
Parameter in Query-String oder als Stream in Request-Body
HTTP-Server startet pro Request externen Prozess
Skript-Interpreter, z.B. PHP, Perl, ...
optimierbar mit Interpretern als Servermodule
optimierbar durch Kommunikation zwischen HTTP- und
CGI-Serverprozess
Request-überdauernd
Andreas I. Schmied (schmied@inf...)
AVID Übung1
SS2005
28 / 74
CGI
Beispiele
Beispiele – CGI-Skript in Perl (gekürzt)
1
# ! / u s r / b i n / p e r l −w
2
3
4
5
use s t r i c t ;
use CGI qw ( : s t a n d a r d ) ;
use CGI : : Carp qw( f a t a l s T o B r o w s e r ) ;
6
7
my $q = new CGI ;
8
9
10
p r i n t ” Content−Type : t e x t / h t m l \n ” ;
p r i n t ” \n ” ; # EOH
11
12
p r i n t ”<html> <head><t i t l e >Test </ t i t l e ></head> <body>\n ” ;
13
14
15
16
17
print
print
print
print
”<p>param :
” , j o i n ( ” , ” , $q−>param ( ) ) , ” </p>\n ” ;
”<p>header :
” , j o i n ( ” , ” , $q−>header ( ) ) , ” </p>\n ” ;
”<p>s e l f u r l : ” , j o i n ( ” , ” , $q−>s e l f u r l ( ) ) , ” </p>\n ” ;
”<p>q u e r y s t r i n g : ” , j o i n ( ” , ” , $q−>q u e r y s t r i n g ( ) ) , ” </p>\n ” ;
18
19
20
21
p r i n t ”<p>environment : \ n ” ;
f o r $ ( keys(%ENV ) ) { p r i n t ”<br>
p r i n t ” </p>\n ” ;
$
= ” . $ENV{ $ } . ” \n ” ; }
22
23
p r i n t ” </body></html >\n ” ;
Andreas I. Schmied (schmied@inf...)
AVID Übung1
SS2005
30 / 74
CGI
Beispiele
Beispiele – GET-Response (gekürzt)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
param :
field , action
header :
Content−Type : t e x t / h t m l ; c h a r s e t =ISO−8859−1
s e l f u r l : h t t p : / / myhost . sw / t e s t . p l ? f i e l d = h e l l o%20w o r l d ; a c t i o n = n i x
q u e r y s t r i n g : f i e l d = h e l l o%20w o r l d ; a c t i o n = n i x
environment :
QUERY STRING = f i e l d = h e l l o%20w o r l d&a c t i o n = n i x
SERVER ADDR = 1 3 4 . 6 0 . . .
SERVER PROTOCOL = HTTP / 1 . 1
REMOTE PORT = 33794
HTTP USER AGENT = Opera / 8 . 0 ( X11 ; L i n u x i 6 8 6 ; U ; en )
GATEWAY INTERFACE = CGI / 1 . 1
HTTP HOST = myhost . sw
SCRIPT URI = h t t p : / / myhost . sw / t e s t . p l
REMOTE USER = . . .
REMOTE ADDR = 1 3 4 . 6 0 . . .
SCRIPT URL = / t e s t . p l
SERVER NAME = myhost . sw
REQUEST URI = / t e s t . p l ? f i e l d = h e l l o%20w o r l d&a c t i o n = n i x
UNIQUE ID = QmzSD4Y8TUsAACgz9eY
HTTP COOKIE = phpbb2mysql data=a%3A0%3A%7B%7D
REQUEST METHOD = GET
AUTH TYPE = Basic
SERVER PORT = 80
Andreas I. Schmied (schmied@inf...)
AVID Übung1
SS2005
32 / 74
Servlets
Und nun. . .
4
Servlets
Request, Response
Modularisierung
Sitzungsmanagement
Andreas I. Schmied (schmied@inf...)
AVID Übung1
SS2005
33 / 74
Servlets
Servlets – Ziele (Servlet Version 2.4)
plattformunabhängig bzgl. JVM
skalierbarer und performanter als CGI
Implementierung vs. Deployment
Deployment Descriptor (+J2EE-Tools)
Modularisierung, Rollentrennung
GUI
Workflow, Storylines
Geschäftsmethoden
Objekt-relationale Abbildung
Datenzugriff (z.B. abstrakte DB-API)
Datenhaltung (z.B. konkrete Datenbank)
Basisklasse javax.servlet.GenericServlet
HTTP-Adapter javax.servlet.http.HttpServlet
Andreas I. Schmied (schmied@inf...)
AVID Übung1
SS2005
34 / 74
Servlets
Servlets – Einfaches Beispiel-Servlet
1
public class MyServlet extends H t t p S e r v l e t {
2
public void doGet ( H t t p S e r v l e t R e q u e s t request , HttpServletResponse
throws S e r v l e t E x c e p t i o n , IOException {
3
4
5
response . setContentType ( ” t e x t / h t m l ” ) ;
response . s e t B u f f e r S i z e ( 8 1 9 2 ) ;
P r i n t W r i t e r o u t = response . g e t W r i t e r ( ) ;
6
7
8
9
o u t . p r i n t l n ( ”<html > . . . ” ) ;
out . close ( ) ;
10
11
}
12
13
}
Andreas I. Schmied (schmied@inf...)
AVID Übung1
SS2005
36 / 74
Servlets
Servlets – Life Cycle
Servlet Klasse laden, Instanz erzeugen
init() bzw. UnavailableException
service() bzw. doPost()/doGet()
auf MT-Safety achten, Servlets sind reentrant
Requests auslesen, Response Header + Body schreiben
Langlaufende Requests gesondert behandeln
destroy()
diverse Listener
zentrale Fehlerseiten, Filter
Andreas I. Schmied (schmied@inf...)
AVID Übung1
SS2005
37 / 74
Servlets
Request, Response
Servlets – Request, Response
Requests
getReader(), getInputStream()
HttpServletRequest-URI
CGI-Format: http : // host:port /requestpath?querystring
Parameter in GET-URL kodiert oder als POST-Datenstrom
Zugriff: getParameter(name)
Kontextdaten über Sitzungsmanagement
Response
getWriter(), getOutputStream()
setContentType(’text/html’) oder anderen MIME-Type
setBufferSize(int) verhindert Teildokument bei Fehler
Status Code, Cookies, ... setzen
ggf. Weiterleitung, Import der Ausgaben von Sub-Servlets
close() für EndOfRequest
Andreas I. Schmied (schmied@inf...)
AVID Übung1
SS2005
39 / 74
Servlets
Modularisierung
Modularisierung – Filter: Konzept
javax.servlet.Filter, .FilterChain, .FilterConfig
Manipulieren und Abfangen von Requests/Responses
Erkennen neuer Sessions, Server/Application-Start/Shutdown, ...
Nebeneffekte auslösen
Logging, Authentication, Transformation, De/Encryption
Filter-Impl. möglichst ohne Abhängigkeiten zu anderen
Webdiensten
im Deployment Descriptor eingereiht
Filter benennen
Wirkungstrigger festlegen
REQUEST, FORWARD, INCLUDE, ERROR
Wirkungsbereich festlegen: welche Servlets
Andreas I. Schmied (schmied@inf...)
AVID Übung1
SS2005
40 / 74
Servlets
Modularisierung
Modularisierung – Filter: Implementierung
Life Cycle
init() ...
doFilter(Request, Result) wird aufgerufen, ggf. Manipulationen
Verkettung mit FilterChain.doFilter(...)
destroy() ...
Response manipulieren
Stream-Double an Chain weiterleiten
dessen close()-Effekt verhindern
ServletRequest/ResponseWrapper(...)
Andreas I. Schmied (schmied@inf...)
AVID Übung1
SS2005
41 / 74
Servlets
Modularisierung
Modularisierung – Dispatching, Forwarding, Inclusion
Szenario: ein öffentlich sichtbares Servlet mit Parameter action=...
Vorteil: zentrales URL-Management
Weiterleitung pro Action an interne Worker-Servlets/JSPs
Szenario: wiederverwendbare Fragmente der Ausgabe
Titel, Fuß-/Kopfzeile, Navigation, ...
Szenario: Weiterleitung, z.B. von intern agierendem Servlet an
Ausgabe-JSP
getRequestDispatcher(URL)
include(Request, Response) ohne Manipulation am Header
forward(Request, Response) nur vor erster Manipulation möglich
Andreas I. Schmied (schmied@inf...)
AVID Übung1
SS2005
42 / 74
Servlets
Sitzungsmanagement
Sitzungsmanagement – Allgemeines
HTTP zustandslos!
Zustand z.B. Login, Einkaufskorb
mehrere Varianten für Zustandssicherung
Cookies, versteckte Formularfelder, URL-Decorating/Rewriting
abstrahiert: Servlets suchen optimale von Browser/User
unterstützte Variante aus
Listener für beliebige Zustandsänderungen
Begin/Ende, Modifikation von Attributen
Andreas I. Schmied (schmied@inf...)
AVID Übung1
SS2005
43 / 74
Servlets
Sitzungsmanagement
Sitzungsmanagement – Scope/Context-Objekte
Information Sharing zwischen Servlets
Zustandsdaten für Applikation, Session, Request, ...
ServletContext, HttpSession, ServletRequest, ...
z.B. Einkaufskorb:
HttpSession.setAttribute( ” cart ” , new ShoppingCart())
Koordinierung reentranter Servlet-Threads notwendig!
Bootstrapping
ServletContextListener global anmelden (Deployment Descriptor)
bei Erzeugung eines Servlet vor dessen init() benachrichtigt
Daten in ServletContext vor-initialisieren
Andreas I. Schmied (schmied@inf...)
AVID Übung1
SS2005
45 / 74
Servlets
Sitzungsmanagement
Sitzungsmanagement – Logout, Linking
Logout
Timeout für Session konfigurieren
Session.invalidate()
Besonderheit: Links
eigene Links ggf. mit Session-ID versehen
sonst springen“ Links aus dem Session-Context
”
Response.encodeURL()
” ; jsessionid=c0o7fszeb1” wird an alle Links angehängt, oder
ID in Cookies Client-seitig gespeichert, falls zulässig
Outgoing Links ohne Zustandsmarkierung
Session bleibt hängen bis zum Timeout!
Andreas I. Schmied (schmied@inf...)
AVID Übung1
SS2005
47 / 74
Exkurs Java Beans
Und nun. . .
5
Exkurs Java Beans
Andreas I. Schmied (schmied@inf...)
AVID Übung1
SS2005
48 / 74
Exkurs Java Beans
Exkurs Java Beans
nicht verwechseln mit Enterprise Java Beans
Ziel: auf Objekt-Properties generisch zugreifen
in JSP deklarativ ohne Java-Code,
in graphischem Editor, ...
strikte Regeln
read-only Accessor: PropertyType getProperty();
optional Mutator: void setProperty(PropertyType value);
Default Constructor: public void BeanType()
aus getMyData() wird Property myData
Erweiterungen: java.beans.PropertyEditor, ...
Andreas I. Schmied (schmied@inf...)
AVID Übung1
SS2005
49 / 74
JSP
Und nun. . .
6
JSP
Life Cycle, Inhalt erzeugen
Expression Language (EL)
Beans
Modularisierung, Wiederverwendung
Klassische JSP vs. XML
Andreas I. Schmied (schmied@inf...)
AVID Übung1
SS2005
50 / 74
JSP
JSP – Ziele (JSP Version 2.0)
Rollentrennung Doc-Author/Designer vs. Programmierer
Inversion der Servlets
Textdokument durch Kommandos und Servletfragmente
angereichert
Forwarding/Inclusion
Zugriff auf Kontextdaten
deklarativer Zugriff auf Beans
Zusatzfunktionen (DB, ...)
Kommandos klassisch: <%...%>
XML-Variante <jsp:something>...
File Extension .jsp, für Fragmenterzeuger .jspf
Kurzreferenz Syntax-Card: http:
//java.sun.com/products/jsp/docs.html#syntax
Andreas I. Schmied (schmied@inf...)
AVID Übung1
SS2005
52 / 74
JSP
JSP – Beispiel JSP-Seite (1)
1
2
3
4
<%@ page contentType= ” t e x t / h t m l ; c h a r s e t =UTF−8” %>
<%@ t a g l i b u r i = ” h t t p : / / j a v a . sun . com / j s p / j s t l / core ” p r e f i x = ” c ” %>
<%@ t a g l i b u r i = ” / f u n c t i o n s ” p r e f i x = ” f ” %>
<% S t r i n g header= ” Caption ” ; %>
5
6
7
<h t m l> <head>< t i t l e>Example</ t i t l e></ head>
<body>
8
9
<jsp:useBean i d = ” l o c a l e s ” scope= ” a p p l i c a t i o n ” c l a s s = ” mypkg . MyLocales ” /
10
11
<h1><%=header%></ h1>
12
13
14
<c : s e t v a r = ” l o c a l e S t r i n g ” v a l u e = ” ${param . l o c a l e } ” />
<c : s e t v a r = ” i s S e l e c t e d ” v a l u e = ” $ { ! empty s e l e c t e d L o c a l e S t r i n g } ” />
15
16
<h2>L o c a l e :</ h2>
17
18
...
Andreas I. Schmied (schmied@inf...)
AVID Übung1
SS2005
54 / 74
JSP
JSP – Beispiel JSP-Seite (2)
1
...
2
3
4
5
6
7
<p>
<c : f o r E a c h v a r = ” l o c a l e S t r i n g ” i t e m s = ” ${ l o c a l e s . localeNames } ” >
l o c a l e ${ l o c a l e S t r i n g } ,
</ c : f o r E a c h>
</ p>
8
9
10
11
12
<jsp:useBean i d = ” date ” c l a s s = ” mypkg . MyDate ” />
<j s p : s e t P r o p e r t y name= ” date ” p r o p e r t y = ” l o c a l e ”
v a l u e = ” ${ l o c a l e s . s e l e c t e d L o c a l e } ” />
<p>D a t e : ${ date . date }</ p>
13
14
15
</ body>
</ h t m l>
Andreas I. Schmied (schmied@inf...)
AVID Übung1
SS2005
56 / 74
JSP
Life Cycle, Inhalt erzeugen
JSP – Life Cycle, Inhalt erzeugen
Life Cycle
Prüfung, ob Servlet im Cache älter als JSP
ggf. Transformation in Servlet und Übersetzung
Compilerfehler werden ggf. erst bei erster Nutzung erkannt!
jspInit () ... jspService() ... jspDestroy()
zentrale Fehlerseite
<%@ page errorPage=”...”%>
<%@ page isErrorPage=”true”%>
automatisches Buffering, <%@ page buffer=”none|xxxkb”%>
Inhalt erzeugen
<%@ page contentType=”text/html; charset=UTF−8”%>
auf Thread-safety achten!
Zugriff auf implizite Objekte über Kommandos/EL (s.u.)
Scriptlets
eingebetteter Servlet-Code, durch Custom Tags ersetzbar (s. Ü2)
Andreas I. Schmied (schmied@inf...)
AVID Übung1
SS2005
58 / 74
JSP
Expression Language (EL)
JSP – Expression Language (EL)
vgl. XPath
${expr} in statischem Text und Tag-Attributwerten
Escaping für Klammeranfang: ${’${’}
Variablen-Traversierung mit . und [] , a.b = a[”b”]
Map[String-Key], List[int-Offset], JavaBean[Property-Name]
Implizite Objekte definiert
div. Kontexte: pageContext.servletContext, .session, .request,
.response
Maps: param, header, param/headerValues, cookie, initParam
Attribut-Maps: page-, request-, session-, applicationScope
Literale: true,false,null , \” , \’, \\, floats , ints , Strings
übliche arith./log. Operatoren inkl. conditional a?b:c und Präfix
empty x
eigene Funktionen wie Tags als function“ entwickeln (s. Ü2)
”
Andreas I. Schmied (schmied@inf...)
AVID Übung1
SS2005
60 / 74
JSP
Beans
JSP – Beans
Deklaration:
1
2
3
<jsp:useBean i d = ” beanName ” c l a s s = ” classname ” scope= ” scope ”>
<j s p : s e t P r o p e r t y . . . / > <!−− o p t i o n a l −−>
</ jsp:useBean>
Scope: application, session, request, page
Zugriff:
<jsp:getProperty name=”beanName”property=”propName”/>
Property-Traversierung mit EL: ${bean.prop1.prop2}
Andreas I. Schmied (schmied@inf...)
AVID Übung1
SS2005
62 / 74
JSP
Modularisierung, Wiederverwendung
JSP – Modularisierung, Wiederverwendung
Properties für JSP-Gruppen deklarierbar
Tag Files: enthalten Dokumentfragmente (s. Ü2)
Inclusion
bei Übersetzung <%@ include file=”banner.jspf”%>
bei Ausführung <jsp:include page=”response.jsp”/>
Forwarding: <jsp:forward page=”/main.jsp” />
Preludes+Codas
global deklarierte Fragmente vor/nach Ausgabe
Andreas I. Schmied (schmied@inf...)
AVID Übung1
SS2005
64 / 74
JSP
Klassische JSP vs. XML
JSP – Klassische JSP vs. XML
JSP Documents
Wohlgeformte .jspx-Dokumente
Entities statt <, >, ...
${EL−expr} weiterhin möglich
<jsp:something>... statt <%...%>
xmlns:x=”URI” statt <%@ taglib uri=”URI”prefix=”x” %>
Deployment: Property is-xml“ setzen
”
Anwendung
Postprocessing mittels XSLT
XML-Streaming zwischen Anwendungen
automatische Anpassung zw. klassisch/XML bei Imports
optional: <jsp:root version=”2.0” > als DocRoot
Multi-Document Ausgaben
Ziel-DTD angebbar
<jsp:output doctype−root−element=”books”...
doctype−system=”books.dtd”/>
Andreas I. Schmied (schmied@inf...)
AVID Übung1
SS2005
66 / 74
Tomcat
Und nun. . .
7
Tomcat
Andreas I. Schmied (schmied@inf...)
AVID Übung1
SS2005
67 / 74
Tomcat
Tomcat – Integration in Webserver-Umgebung
http://www.apache.de/dist/jakarta/tomcat-5/v5.5.
9/bin/jakarta-tomcat-5.5.9.tar.gz
Umfangreiche Beispielsammlung!
Tomcat liefert kleinen HTTP-Server mit (Default Port 8080)
inkl. Admin/Managemente-Konsole
Anbindung an HTTP-Server
Bsp.: Apache Proxy Modul greif ab best. Pfadpräfix
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
”
Andreas I. Schmied (schmied@inf...)
AVID Übung1
SS2005
68 / 74
Tomcat
Tomcat – Deployment
Web ARchive (.war)
JAR-File mit striktem Aufbau
/ – 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
WAR in ${TOMCAT}/webapps/... kopieren
Auto-Deployment und Entpacken durch Tomcat
Archivname ohne WAR wird Context Root
Andreas I. Schmied (schmied@inf...)
AVID Übung1
SS2005
70 / 74
Tomcat
Tomcat – Deployment-Descriptor (stark gekürzt)
1
2
<web−app>
<d i s p l a y −name>My Web A p p l i c a t i o n</ d i s p l a y −name>
3
4
5
6
<c o n t e x t −param>
<param−name>webmaster</ param−name>
<param−v a l u e>myaddress@mycompany . com</ param−v a l u e> . . .
7
8
9
10
11
12
13
14
<s e r v l e t>
<s e r v l e t −name> f i r s t</ s e r v l e t −name>
<s e r v l e t −c l a s s>sw . myhost . F i r s t S e r v l e t</ s e r v l e t −c l a s s>
< i n i t −param>
<param−name> t e s t I n i t</ param−name>
<param−v a l u e>b l a</ param−v a l u e>
</ i n i t −param> . . .
15
16
17
18
<s e r v l e t −mapping>
<s e r v l e t −name> f i r s t</ s e r v l e t −name>
<u r l −p a t t e r n>∗ . do</ u r l −p a t t e r n> . . .
19
20
21
<session−c o n f i g>
<session−t i m e o u t>30</ session−t i m e o u t> . . .
22
23
</ web−app>
Andreas I. Schmied (schmied@inf...)
AVID Übung1
SS2005
72 / 74
Aufgabe
Und nun. . .
8
Aufgabe
Andreas I. Schmied (schmied@inf...)
AVID Übung1
SS2005
73 / 74
Aufgabe
Aufgabe
Tomcat installieren
Doku/Beispiele studieren
J2EE-Tutorial
Google, ...
einfacher Kalender mittels JSP/Servlets
Login per Filter, falls noch kein User angegeben
Logout-Button
Kalendermodell auf zwei Objektklassen beschränken
PersonName has EntriesTimestamp,Text
einfache GUI zum Verwalten/Auflisten der Einträge
Daten in XML-Datei gespeichert
bei Serverstart laden, bei Shutdown speichern
Schema spezifizieren
validierendes Parsen der Daten
Andreas I. Schmied (schmied@inf...)
AVID Übung1
SS2005
74 / 74
Herunterladen