Cocoon is a powerful framework for XML web publishing which brings a whole new world of abstraction and ease to consolidated web site creation and management based on the XML paradigm and related technologies. Started by the Italian student Stefano Mazzocchi 11-1 1. Grundlagen 2. Servlets 3. JSP 4 1.1. JAR Files 4 1.2. TCP/IP, Sockels 4 1.3. HTTP 4 1.4. Java Web Service Developer Pack (WSDP) 4 1.5. Ant 4 1.6. JAVA Fehlermeldungen 4 2.1. Servlet Framework 4 2.2. Tomcat Servlet Container 4 2.3. Lebenszyklus 4 2.4. Hello World Servlet 4 2.5. Implizite Objekte 4 2.6. Einfache Servlets 4 2.7. Konfiguration (web.xml) 4 2.8. Anfrage weiterleiten 4 2.9. Filter 4 2.10. Cookies 4 2.11. Session Tracking 4 3.1. Architektur 4 3.2. Syntax, Skripte, Direktiven 4 3.3. Implizite Objekte 4 3.4. Aktionen 4 3.5. JavaBeans 4 3.6. Custom Tags 4. Servlet JSP Framework Struts 5. XML 4 4.1.Architektur 4 4.2.Planung einer Webanwendung 4 4.3.Implementierung 4 5.1.Grundlagen 4 5.2.DTD & Schemata 4 5.3.Parser (SAX, DOM) 4 5.4.XPath 4 5.5.XSLT 4 5.6.XSL-FO 6. XML Framework Cocoon 4 6.1.Architektur 4 6.2.Cocoon Beispiel 4 6.3.Sitemap 4 6.4.XSP 7. JAVA Webservices 4 7.1.SOAP 4 7.2.UDDI / ebxml 4 7.3.WSDL 4 7.4.Implementierung eines Webservice 11-2 1
Was ist cocoon? XML publishing framework Verwendet XML und XSLT Separation of Concerns, d. h. Trennung von Inhalt, Logik und Darstellung Datenquellen: Filesysteme, RDBMS, LDAP, native XML Datenbanken, und Netzwerkbasierte Quellen Content Ausgabe in HTML, WML, PDF, SVG, RTF,... 11-3 Was ist cocoon? Cocoon ist als Servlet implementiert Als Teil des Apache XML Projekts integriert cocoon unter anderem 4Xerces - XML Parser Apache Cocoon 2 Framework (XML Publishing) 4Xalan - XSLT Prozessor 4FOP XSL Print Formatter Apache Avalon Framework (Component Management) 4 Batik - Scalable Vector Graphics (SVG) Toolkit Apache Xalan 4 (XSLT Processor) Apache Xerces (XML Parser) Custom Components Apache LogKit (Logging) Apache FOP (XSL:FO) Apache Batik (SVG) Other Projects 11-4 2
SoC Separation of Concerns pyramid of contracts Klare Trennung der verschiedenen Arbeitsbereiche in einem Entwicklungsteam Management: Inhalt, Abläufe, Aufbau Content: redaktioneller Teil aller Inhalte Logic: Integration der dynamischen Inhalte Style: Präsentation, look & feel, Grafik Austausch nach bestimmten Regeln möglich, die vom Management gesteuert werden 11-5 SoC Separation of Concerns Beispiel <page> <content> <para>today is <dynamic:today/> </para> </content> </page> <dynamic:today/> regelt die Logik Inhalt Beziehung 11-6 3
SoC Separation of Concerns Content: XML Files, RDBMS, LDAP, native XML Datenbanken, Netzwerkbasierte Quellen, Streams Style: XSL Files Logic: in XSL Files als XSP instructions... <xsp:logic> // Java Code, SQL,... String msg = "Hello, world!"; </xsp:logic>... XSP kann auch in Logicsheets oder in Taglibs definiert und dann in XSL Files als Komponente wiederverwendet werden 11-7 Pipeline request Request nach Muster verarbeiten XML Source generieren Generator Transformation nach XSL-Vorgaben Evtl. Weitere XML Quellen aggregieren Ausgabe in ein bestimmtes Format Transformer Aggregator stylesheet Serializer 11-8 4
Request - Response Zyklus Request Sitemap Request Transformer Generator Transformer Serializer XML DB XSL Response (HTML) 11-9 Sitemap Die Sitemap entält Konfigurationsinformationen für die Cocoon engine Matchers für URI Patterns Selectors Unterscheidungen im Pipeline-Ablauf Generators XML Sources einlesen Transformers XML Transformationen Serializers Ausgabeformat definieren Die Sitemap wird zu einer ausführbaren Klasse kompiliert 11-10 5
Sitemap - Matcher <map:match pattern="vortrag/**"> <map:mount check-reload="yes"src="vortrag/" uriprefix="vortrag"/> In der main-sitemap können weitere Sitemaps für Unterprogramme gemountet werden Baumstruktur der Sitemaps für einfachere Wartung 11-11 Sitemap processing pipeline <map:match pattern="hello.html"> <map:generate src="hello-page.xml"/> <map:transform src="simple-page2html.xsl"/> <map:serialize type="html"/> URI pattern hello.html erkennen Aus der Source hello-page.xml xml auslesen Nach den Regeln des XSL stylesheets Transformieren Als html Ausgabe serialisieren 11-12 6
Sitemap Selector <map:match pattern="hello.html"> <map:generate src="hello-page.xml"/> <map:select> <map:when test="wap"> <map:transform src="simple-page2wml.xsl"/> </map:when> <map:when test="explorer"> <map:transform src="simple-page2html.xsl"/>... 11-13 Selector HTML Capable Device HTML Stylesheet Serialize HTML File Generator Browser Selector WML Stylesheet Serialize WML Single Entry Point: E.g. http://server/cocoon/helloworld WML Capable Device 11-14 7
Einfache Anwendung 11-15 Wie geht s? 1. Content <?xml version="1.0"?> <page> <title>hello</title> <content> <para>this is my first Cocoon2 page!</para> </content> </page> 11-16 8
Wie geht s? 2. Style <?xml version="1.0"?> <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/xsl/transform"> <xsl:template match="page"> <svg width="450" height="160"> <defs> <filter id="blur1"><fegaussianblur stddeviation="3"/></filter> <filter id="blur2"><fegaussianblur stddeviation="1"/></filter> </defs> <g title="this is a tooltip"> <rect style="fill:#0086b3;stroke:#000000;stroke-width:4;filter:url(#blur1);" x="30" y="30" rx="20" ry="20" width="400" height="80"/> <xsl:apply-templates/> </g> </svg> </xsl:template> <xsl:template match="para"> <text style="fill:#ffffff;font-size:24;font-family:trebuchetms- Bold;filter:url(#blur2);" x="65" y="80"> <xsl:apply-templates/> </text> </xsl:template> </xsl:stylesheet> 11-17 Wie geht s? 3. Logic - 4. Management <map:match pattern="hello.svg"> <map:generate src="docs/samples/hello-page.xml"/> <map:transform src="stylesheets/page/simple-page2svg.xsl"/> <map:serialize type="svg2jpeg"/> 11-18 9
weitere Hello World Beispiele <map:pipeline> <map:match pattern=""> <map:redirect-to uri="welcome"/> <map:match pattern="welcome"> <map:generate src="docs/samples/samples.xml"/> <map:transform src="stylesheets/simple-samples2html.xsl"/> <map:serialize/> <map:match pattern="hello.html"> <map:generate src="docs/samples/hello-page.xml"/> <map:transform src="stylesheets/page/simple-page2html.xsl"/> <map:serialize type="html"/> <map:match pattern="hello.wml"> <map:generate src="docs/samples/hello-page.xml"/> <map:transform src="stylesheets/page/simple-page2wml.xsl"/> <map:serialize type="wap"/> 11-19 Sitemap <?xml version="1.0"?> <map:sitemap xmlns:map= "http://apache.org/cocoon/sitemap/1.0"> <map:components/> <map:views/> <map:resources/> <map:pipelines/> <map:action-sets/> </map:sitemap> Action JAVA Program 11-20 10
SVG erzeugen <map:match pattern="hello2.svg"> <map:generate src="docs/samples/hello-page.xml"/> <map:transform src="stylesheets/page/simple-page2svg.xsl"/> <map:serialize type="svgxml" /> 11-21 Verschieden Ausgaben <?xml version="1.0"?> <molecule convention="mdlmol" id="histamine" title="histamine"> <date day="23" month="11" year="1995"> </date> <atomarray> <atom id="a1"> <string builtin="elementtype">c</string> <float builtin="x2">-0.9175</float> <float builtin="y2">-0.7733</float> </atom> <atom id="a2"> <string builtin="elementtype">c</string> <float builtin="x2">0.2185</float> <float builtin="y2">-1.2277</float> </atom> <atom id="a3"> 11-22 11
Sitemap Legi I <?xml version="1.0"?> <map:sitemap xmlns:map="http://apache.org/cocoon/sitemap/1.0"> <!-- =========================== Components ================================ --> <map:components> <map:generators default="file"/> <map:transformers default="xslt"/> <map:readers default="resource"/> <map:serializers default="html"/> <map:selectors default="browser"/> <map:matchers default="wildcard"/> <map:serializer name="fo2ps" src="org.apache.cocoon.serialization.fopserializer" mime-type="application/postscript"/> <map:serializer name="fo2pdf" src="org.apache.cocoon.serialization.fopserializer" mime-type="application/pdf"/> <map:serializer name="wap" mime-type="text/vnd.wap.wml" src="org.apache.cocoon.serialization.xmlserializer"> <doctype-public>-//wapforum//dtd WML 1.1//EN</doctype-public> <doctype-system>http://www.wapforum.org/dtd/wml_1.1.xml</doctype-system> <encoding>ascii</encoding> <omit-xml-declaration>yes</omit-xml-declaration> </map:serializer> </map:components> <!-- =========================== Pipelines ================================= --> 11-23 Sitemap Legi II <map:match pattern="*.*.html"> <map:generate src="xml/{1}.{2}.xml"/> <map:transform src="xsl/legi_html.xsl"/> <map:serialize type="html"/> <map:match pattern="*.*.pdf"> <map:generate src="xml/{1}.{2}.xml"/> <map:transform src="xsl/legi_pdf.xsl"/> <map:serialize type="fo2pdf"/> <map:match pattern="*.*.ps"> <map:generate src="xml/{1}.{2}.xml"/> <map:transform src="xsl/legi_pdf.xsl"/> <map:serialize type="fo2ps"/> <map:match pattern="*.*.wml"> <map:generate src="xml/{1}.{2}.xml"/> <map:transform src="xsl/legi_wml.xsl"/> <map:serialize type="wap"/> Institut für Informatik 11-24 12
Beispiele http://www.urlaubstage.de http://www.bethe1.com/cocoon/asp1/2/index.htm http://www.sparkasse-gelsenkirchen.de/sunshine/vgs/index.xhtml 11-25 extensible Server Pages (XSPs) Analog zu JSP nur Trennung von Code Logic Presentation 11-26 13
extensible Server Pages II 11-27 XSP Bsp. I <?xml version="1.0" encoding="iso-8859-1"?> <xsp:page language="java" xmlns:xsp="http://apache.org/xsp"> <xsp:logic> static private int counter = 0; private synchronized int count() { return counter++; } </xsp:logic> <page> <p>i have been requested <xsp:expr>count()</xsp:expr> times.</p> </page> </xsp:page> 11-28 14
XSP Bsp. II <?xml version="1.0" encoding="iso-8859-1"?> <xsp:page language="java" xmlns:xsp="http://apache.org/xsp" xmlns:xsp-request="http://apache.org/xsp/request/2.0" xmlns:log="http://apache.org/xsp/log/2.0" xmlns:capture="http://apache.org/cocoon/capture/1.0"> <page> <log:logger name="xsp-sample" filename="xsp-sample.log"/> <log:debug>jax: start jax page</log:debug> <title>a Simple XSP Page</title> <content> <capture:fragment-variable name="page_part"> <para>these 2 paragraphs were generated at the start of the XSP, and captured for insertion at the end.</para> <para>brought to you by Cocoon2 at <xsp:expr>new Date()</xsp:expr>.</para> </capture:fragment-variable> <para>i was requested as the URI: <b><xsp-request:get-uri as="xml"/></b></para> 11-29 XSP Bsp. II <para>the following list was dynamically generated:</para> <ul> <xsp:logic> <![CDATA[ for (int i=0; i<3; i++) { ]]> <li> Punkt: <xsp:expr>i</xsp:expr> </li> <![CDATA[ } ]]> </xsp:logic> </ul> <xsp-request:get-parameter-values name="name"/> <xsp-request:get-parameter-names/> <para> Header "user-agent" as String: <xsp-request:get-header name="user-agent"/> </para> <xsp:expr>page_part</xsp:expr> </content> <log:debug>processing the end of the JAX page</log:debug> </page> </xsp:page> 11-30 15
Model 1 in the servlet world HTTP request JSP page template HTTP response Java bean Data source 11-31 Model 1 in Cocoon HTTP request Page template Pipeline HTTP response Data source Cocoon 11-32 16
Model 2 in the servlet world (Struts) HTTP request Controller servlet instantiates HTTP response JSP page template Java bean Data source 11-33 Benefits of Model 2 Logic and controlling the flow of pages are separated from presentation Uses the well-understood Model-View- Controller pattern Easier to scale as the application (read number of pages) grows 11-34 17
Control flow: MVC+ for Cocoon? HTTP request HTTP response 1 Controller 2 flow script 4 5 6 Pipeline Business logic Context 3 Data source 11-35 Quellen Cocoon Homepage: http://xml.apache.org/cocoon/index.html Apache XML Project: http://xml.apache.org Cocoon howtos: http://www.cocooncenter.org Cocoon tips: http://www.galatea.com/flashguides/cocoon-tips-2.xml 11-36 18