Vergleich der Model 2 Umsetzung von Struts und Cocoon
Transcrição
Vergleich der Model 2 Umsetzung von Struts und Cocoon
Vergleich der Model 2 Umsetzung von Struts und Cocoon Tobias Kieninger [email protected] Orientation in Objects GmbH Weinheimer Str. 68 68309 Mannheim www.oio.de Struts & Cocoon im Vergleich © 2001-2002 Orientation in Objects GmbH Ziele der Session XML BeanHelper FO MVC SVG Formulare Struts Cocoon Validierung Web Tiles ... XML-DB ... Struts & Cocoon im Vergleich © 2001-2002 Orientation in Objects GmbH 1 Inhalt • Model 1, Model 2, MVC, Front Controller... • Struts – Formularhandling • Cocoon – XMLForm – Flows & Continuations • Gegenüberstellung Struts & Cocoon im Vergleich © 2001-2002 Orientation in Objects GmbH J2EE - Model 1 Web Server Servlet Servlet Engine JSP Servlet JSP JSP Bean PräsentationsSchicht Bean Bean Application Server EJB EJB EJB BusinessSchicht EJB DatenSchicht Struts & Cocoon im Vergleich © 2001-2002 Orientation in Objects GmbH 2 Model View Controller View View Controller Model Struts & Cocoon im Vergleich © 2001-2002 Orientation in Objects GmbH J2EE - MVC im Webbereich Web Server Servlet Engine View View Controller Application Server PräsentationsSchicht BusinessSchicht Model DatenSchicht Struts & Cocoon im Vergleich © 2001-2002 Orientation in Objects GmbH 3 Der Trend? Frameworks! Web Server Servlet Engine Servlet JSP Action XSP Template Action EJB Struts Cocoon Turbine Webmacro .... EJB JDO Bean Struts & Cocoon im Vergleich © 2001-2002 Orientation in Objects GmbH Model 2, Front Controller, Dispatcher View Servlet Container Business-Logik Controller Dispatcher View View View Quelle: J2EE-Patterns (Bien) Struts & Cocoon im Vergleich © 2001-2002 Orientation in Objects GmbH 4 Inhalt • Model 1, Model 2, MVC, ... • Struts – Formularhandling • Cocoon – XMLForm – Flows & Continuations • Gegenüberstellung Struts & Cocoon im Vergleich © 2001-2002 Orientation in Objects GmbH Was ist Struts? • • • • Open Source Framework für Web Anwendungen Umsetzung diverser J2EE Muster Unter der Lizenz der Apache Software Foundation Basiert auf Standardtechnologien – JSP, JavaBeans, ResourceBundles, ... • Ermöglicht den Model-View-Controller Ansatz • Teil des Apache Jakarta Projektes – http://jakarta.apache.org/struts Struts & Cocoon im Vergleich © 2001-2002 Orientation in Objects GmbH 5 Struts allgemein Servlet Container Request Controller ActionServlet Model EJB, Beans,.. Action Business Logik Bean Bean Response View JSP Bean FormBean Struts Taglibs Bean Struts & Cocoon im Vergleich © 2001-2002 Orientation in Objects GmbH Struts Model Servlet Container Request Controller ActionServlet Action Model EJB, Beans,.. ruft auf Business Logik füllt / liest Beans Bean Bean liest Beans Response View JSP Bean FormBean Struts Taglibs liest Form Struts & Cocoon im Vergleich Bean © 2001-2002 Orientation in Objects GmbH 6 Struts View Servlet Container Request Controller ActionServlet Action Bean liest Beans View JSP Business Logik Bean wählt die View Response Model EJB, Beans,.. Bean FormBean Struts Taglibs liest Form Struts & Cocoon im Vergleich Bean © 2001-2002 Orientation in Objects GmbH JSP mit Struts Tags <%@ taglib uri="/WEB-INF/struts-bean.tld" prefix="bean" %> <%@ taglib uri="/WEB-INF/struts-html.tld" prefix="html" %> <%@ taglib uri="/WEB-INF/struts-logic.tld" prefix="logic" %> <h1><%=request.getAttribute(„hello“)%>!</h1> <html:errors/> <table> <logic:iterate id="aPage" name="pages" type="de.oio.util.web.Page"> <tr> <td><bean:write name="aPage" property="host"/></td> <td><bean:write name="aPage" property="head.title"/></td> </tr> </logic:iterate> </table> Struts & Cocoon im Vergleich © 2001-2002 Orientation in Objects GmbH 7 Struts Controller Servlet Container Request ruft auf Controller ActionServlet liefert Mapping Action Model EJB, Beans,.. ruft auf Business Logik füllt / liest Beans Bean wählt die View Response View JSP Bean Bean FormBean Struts Taglibs Struts & Cocoon im Vergleich Bean © 2001-2002 Orientation in Objects GmbH Action public class HelloWorldAction extends Action { public ActionForward execute(ActionMapping mapping, ActionForm form, HttpServletRequest request, HttpServletResponse response) throws Exception { // Request verarbeiten / Aufruf der Business Logik ... // Ergebnis publizieren request.setAttribute("hello", "world"); session.setAttribute(...); application.setAttribute(...); } // Nächste Seite wählen return (mapping.findForward("success")); } execute() für Version 1.1 perform() für Version 1.0 Struts & Cocoon im Vergleich © 2001-2002 Orientation in Objects GmbH 8 Konfiguration der Action <struts-config> ... <action-mappings> <action path="/HelloWorld" validate="false" type="HelloWorldAction"> <forward name="success" path="/HelloWorld.jsp"/> </action> </action-mappings> </struts-config> Struts & Cocoon im Vergleich © 2001-2002 Orientation in Objects GmbH Struts & Cocoon im Vergleich © 2001-2002 Orientation in Objects GmbH Inhalt • Model 1, Model 2, MVC, ... • Struts – Formularhandling • Cocoon – XMLForm – Flows & Continuations • Gegenüberstellung 9 Struts Formularhandling Request JSP Struts Formular ActionForm Response Struts & Cocoon im Vergleich © 2001-2002 Orientation in Objects GmbH Beispiel ActionForm Klasse public class LoginForm extends ActionForm { private String passwd, username; public String getUsername() { return username; } public void setUsername(String aUser) { user = aUser; } ... public void reset(ActionMapping mapping, HttpServletRequest request) { username = ""; passwd = ""; } public ActionErrors validate(ActionMapping mapping, HttpServletRequest request) { ActionErrors errors = new ActionErrors(); return errors; } } Struts & Cocoon im Vergleich © 2001-2002 Orientation in Objects GmbH 10 Entwurf der View <%@ taglib uri="/WEB-INF/struts-html.tld" prefix="html"%> <html> ... <html:form action="login.do" method="get"> <html:text property="user"/><br/> <html:password property="passwd"/><br/> <html:submit property="submit" value="Login"/><br/> </html:form> ... </html> Struts & Cocoon im Vergleich © 2001-2002 Orientation in Objects GmbH Die Action public class LoginAction extends Action { public ActionForward perform(ActionMapping mapping, ActionForm form, HttpServletRequest request, HttpServletResponse response) { if(form instanceof LoginForm) { LoginForm lf = (LoginForm) form; if(“qwertz”.equals(lf.getPasswd())) { return mapping.findForward("home"); } else { return mapping.findForward("login"); } } } Struts & Cocoon im Vergleich © 2001-2002 Orientation in Objects GmbH 11 Fazit Struts? • Produktivere Entwicklung und Wartung von Web Anwendungen • Einfache Validierung • Struts kombiniert: – – – – JSPs Servlets Custom Tags Message Resourcen • Unterstützt Entwicklung im Team • Klar • Strukturiert • Geradlinig Struts & Cocoon im Vergleich © 2001-2002 Orientation in Objects GmbH Struts & Cocoon im Vergleich © 2001-2002 Orientation in Objects GmbH Inhalt • Model 1, Model 2, MVC, ... • Struts – Formularhandling • Cocoon – XMLForm – Flows & Continuations • Gegenüberstellung 12 Cocoon Apache Cocoon is a 100% pure Java publishing framework that relies on new W3C technologies (such as XML, XSL, SVG, etc..) to provide web content. Quelle: Cocoon 2 README • Unter der Apache Software License • http://xml.apache.com/cocoon/ Struts & Cocoon im Vergleich © 2001-2002 Orientation in Objects GmbH Separation of Concerns (SoC) Management Logic Content Style Quelle: Cocoon Dokumentation Struts & Cocoon im Vergleich © 2001-2002 Orientation in Objects GmbH 13 XSLT Prozessor csv.xsl html.xsl txt.xsl news.html docbook.xsl news.txt news.xml XSLT Prozessor news.csv docbook.xml Struts & Cocoon im Vergleich © 2001-2002 Orientation in Objects GmbH Transformation mit XSLT ... <cd> <titel>Music</titel> <interpret>Madonna</interpret> </cd> ... XML-Quelle ... <xsl:template match=“cd"> <b><xsl:value-of select="titel"/></b>, Interpret: <xsl:value-of select="interpret"/><br/> </xsl:template> XSL-Stylesheet ... <b>Music</b>, Interpret: Madonna<br/> Output Struts & Cocoon im Vergleich © 2001-2002 Orientation in Objects GmbH 14 Pipeline Model Serializer ... Transformer Transformer Generator Struts & Cocoon im Vergleich © 2001-2002 Orientation in Objects GmbH HTTP mit Pipeline Client Webserver Request Servlet-Engine Context (Cocoon) Response Struts & Cocoon im Vergleich © 2001-2002 Orientation in Objects GmbH 15 HelloWorld in 3 Schritten - 1 Die XML-Quelle (hello.xml) <?xml version="1.0"?> <page> <title>Erstes Beispiel - OIO Seminar</title> <greeting>Hello World</greeting> </page> Struts & Cocoon im Vergleich © 2001-2002 Orientation in Objects GmbH HelloWorld in 3 Schritten - 2 Das XSLT-Stylesheet <?xml version="1.0"?> <xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0"> <xsl:template match="page"> <html> <body> <h1><xsl:value-of select="title"/></h1> <p><xsl:value-of select="greeting"/></p> </body> </html> </xsl:template> </xsl:stylesheet> Struts & Cocoon im Vergleich © 2001-2002 Orientation in Objects GmbH 16 HelloWorld in 3 Schritten - 3 Definiert die Pipeline, die zu einem Seitenaufruf gehört http://localhost:8080/cocoon/hello/hello.html Auflösung durch Sitemap <map:match pattern=“hello/hello.html"> <map:generate type=“file" src="hello/hello.xml"/> <map:transform src=“hello/hello.xslt"/> <map:serialize type=“html"/> </map:match> Struts & Cocoon im Vergleich © 2001-2002 Orientation in Objects GmbH eXtensible Server Pages .xsp file Request Cocoon <xsp:page langua... . <...............> . </xsp:page> XSLT Generator Response 34 Struts & Cocoon im Vergleich © 2001-2002 Orientation in Objects GmbH 17 XSP - Beispiel <?xml version="1.0" encoding="ISO-8859-1"?> <xsp:page language="java" xmlns:xsp="http://apache.org/xsp"> ... public BigInteger getBig() { return new BigInteger("10000000000000000000"); } </xsp:logic> <page> <xsp:expr>getBig()</xsp:expr> <xsp-request:get-attribute name="hello"/> </page> </xsp:page> Struts & Cocoon im Vergleich © 2001-2002 Orientation in Objects GmbH Cocoon Actions Cocoon Action Generator Generator Pipeline ActionSet Generator Generator Transformer Transformer Transformer Transformer Transformer Transformer Response Controller Serializer Serializer Request Action Action Model Struts & Cocoon im Vergleich © 2001-2002 Orientation in Objects GmbH 18 Action public class HelloWorldAction extends AbstractAction { public Map act (...) { // Request verarbeiten / Aufruf der Business Logik ... // Ergebnis publizieren request.setAttribute("hello", "world"); // Nächste Seite wählen Map sitemapParams = new HashMap(); sitemapParams.put("nextpage", “success"); return sitemapParams; } } Struts & Cocoon im Vergleich © 2001-2002 Orientation in Objects GmbH Konfiguration der Action <map:components> <map:actions> <map:action name="HelloWorldAction" src="de.oio.HelloWorldAction"/> ... </map:actions> <map:components> ... <map:match pattern="HelloWorld.html"> <map:act type="HelloWorldAction"> <map:generate type="serverpages“ src=“{nextpage}.xsp"/> </map:act> <map:serialize/> </map:match> Struts & Cocoon im Vergleich © 2001-2002 Orientation in Objects GmbH 19 success.xsp & error.xsp success.xsp: <xsp:page language="java" xmlns:xsp="http://apache.org/xsp"> <html> <p>Die Aktion wurde erfolgreich durchgeführt. Folgende Ergebnisse wurden erzielt: <xsp-request:get-attribute name="hello"/> ...</p> </html> </xsp:page> error.xsp: <xsp:page language="java" xmlns:xsp="http://apache.org/xsp"> <html> <h1>Es ist ein Fehler aufgetreten!</h1> </html> </xsp:page> Struts & Cocoon im Vergleich © 2001-2002 Orientation in Objects GmbH Struts & Cocoon im Vergleich © 2001-2002 Orientation in Objects GmbH Inhalt • Model 1, Model 2, MVC, ... • Struts – Formularhandling • Cocoon – XMLForm – Flows & Continuations • Gegenüberstellung 20 XMLForm (Alpha) XML Forms JavaBeans Struts & Cocoon im Vergleich © 2001-2002 Orientation in Objects GmbH Cocoon XMLForm allgemein Servlet Container Controller Cocoon Request Model EJB, Beans,.. Business Logik Pipeline Generator Generator XMLFormXMLFormTransformer Transformer Transformer Transformer Response Serializer Serializer View Model XMLFormAction Form Struts & Cocoon im Vergleich © 2001-2002 Orientation in Objects GmbH 21 Cocoon XMLForm - Model Servlet Container Model EJB, Beans,.. Controller Cocoon Request Business Logik Pipeline Generator Generator XMLFormXMLFormTransformer Transformer Transformer Transformer Response Serializer Serializer View XMLFormAction füllt liest Form Model liest Struts & Cocoon im Vergleich © 2001-2002 Orientation in Objects GmbH Die LoginBean (Model) public class LoginBean { private String user = ""; ... public String getUser() { return (this.user); } public void setUser(String user) { this.user = user; } ... } Struts & Cocoon im Vergleich © 2001-2002 Orientation in Objects GmbH 22 Cocoon XMLForm - View Servlet Container Controller Cocoon Request Model EJB, Beans,.. Business Logik Pipeline Generator Generator XMLFormXMLFormTransformer Transformer Transformer Transformer Response Serializer Serializer View wählt XMLFormAction Form Model liest Struts & Cocoon im Vergleich © 2001-2002 Orientation in Objects GmbH XForms Presentation Options XForms User Interface XHTML WML Proprietary Proprietary Proprietary User User User Interfaces Interfaces Interfaces XForms Model Struts & Cocoon im Vergleich © 2001-2002 Orientation in Objects GmbH 23 Login.xsp <document xmlns:xf="http://xml.apache.org/cocoon/xmlform/2002"> ... <body> <xf:form id="loginF" view="login" action="login.html"> ... <xf:textbox ref="/user"> <xf:caption>Benutzername</xf:caption> <xf:violations class="error"/> </xf:textbox> ... </xf:form> </body> Struts & Cocoon im Vergleich © 2001-2002 Orientation in Objects GmbH Cocoon XMLForm - Controller Servlet Container Controller Cocoon Request Model EJB, Beans,.. ruft auf ruft auf Business Logik Pipeline Generator Generator XMLFormXMLFormTransformer Transformer Transformer Transformer Response Serializer Serializer View wählt XMLFormAction füllt liest Struts & Cocoon im Vergleich Form Model © 2001-2002 Orientation in Objects GmbH 24 XMLFormAction public class HelloAction extends AbstractXMLFormAction { public Map perform() { Form f = getForm(); LoginBean lb = (LoginBean) f.getModel(); if(form instanceof LoginForm) { LoginForm lf = (LoginForm) form; if(“qwertz”.equals(lf.getPasswd())) { return page("success"); } else { return page("login"); } } } Struts & Cocoon im Vergleich © 2001-2002 Orientation in Objects GmbH Fazit XMLForm • Gute Formularbehandlung • Erweiterung der vorhandenen Actions • Grenzen? – Alphastadium – Dokumentation – Debugging Struts & Cocoon im Vergleich © 2001-2002 Orientation in Objects GmbH 25 Inhalt • Model 1, Model 2, MVC, ... • Struts – Formularhandling • Cocoon – XMLForm – Flows & Continuations • Gegenüberstellung Struts & Cocoon im Vergleich © 2001-2002 Orientation in Objects GmbH Flow Control (Alpha) Cocoon Sitemap Request (calc/) function calculator() { var a, b; Response id sendPage("getA.html"); wait continue a = request.getParameter("a"); Request + ContinuationId + a=5 Response Flow Script id sendPage("getB.html"); wait Request + ContinuationId + b=6 continue b = request.getParameter("b"); Response a+b sendPage("result.html", a + b); } Struts & Cocoon im Vergleich © 2001-2002 Orientation in Objects GmbH 26 Cocoon Flow - allgemein Servlet Container Model EJB, Beans,.. Controller Cocoon Request Business Logik Generator Generator Transformer Transformer Transformer Transformer Response Serializer Serializer View / Pipeline FlowScript Continuation Parameter JPath-Logicsheet Struts & Cocoon im Vergleich © 2001-2002 Orientation in Objects GmbH Cocoon Flow - Model Servlet Container Model EJB, Beans,.. Controller Cocoon Request ruft auf Generator Generator Transformer Transformer Transformer Transformer Response Serializer Serializer View / Pipeline Business Logik FlowScript Continuation füllt Parameter JPath-Logicsheet liest Struts & Cocoon im Vergleich © 2001-2002 Orientation in Objects GmbH 27 Cocoon Flow - View Servlet Container Model EJB, Beans,.. Controller Cocoon Request Business Logik Generator Generator Transformer Transformer Transformer Transformer Response Serializer Serializer View / Pipeline FlowScript Continuation ruft auf Parameter JPath-Logicsheet liest Struts & Cocoon im Vergleich © 2001-2002 Orientation in Objects GmbH Login.xsp <form> <xsp:attribute name="action"> <xsp:expr>"../kont/"+<jpath:continuation/></xsp:expr> </xsp:attribute> Login: <input type="text" name="login"> <xsp:attribute name="value"> <jpath:value-of select="login"/> </xsp:attribute> </input> ... </form> Struts & Cocoon im Vergleich © 2001-2002 Orientation in Objects GmbH 28 Cocoon Flow - Controller Servlet Container ruft auf Controller Cocoon Request Model EJB, Beans,.. ruft auf Generator Generator Transformer Transformer Transformer Transformer Response Serializer Serializer View / Pipeline Business Logik FlowScript Continuation ruft auf füllt Parameter JPath-Logicsheet Struts & Cocoon im Vergleich © 2001-2002 Orientation in Objects GmbH Rhino Script function login() { login=""; while (!"qwertz“.equals(passwd)) { sendPage("login.html", {"login" : login}); login = cocoon.request.getParameter("login"); } } Struts & Cocoon im Vergleich © 2001-2002 Orientation in Objects GmbH 29 Fazit Flows & Continuations • Keine Actions mehr notwendig • Leichte Programmierung des Screenflows • • • • Validierung von Formularen im Skript? Internationalisierung? Keine Verbindung zu XForms oder Webformularen Modularisierung? Struts & Cocoon im Vergleich © 2001-2002 Orientation in Objects GmbH Inhalt • Model 1, Model 2, MVC, Front Controller... • Struts – Formularhandling • Cocoon – XMLForm – Flows & Continuations • Gegenüberstellung Struts & Cocoon im Vergleich © 2001-2002 Orientation in Objects GmbH 30 Technologien, Erlernbarkeit, Dokumentation Struts • JSP • Taglibraries • Struts Taglibs • Struts Framework (Actions / Forms) Cocoon • XML • XSLT / XPath • Cocoon • XSP • Logicsheets • XMLForms – XForms – Schematron – XMLForm Komponenten • Continuations – Cocoon Flow Komponenten – JPath-Logicsheet – Rhino JavaScript Struts & Cocoon im Vergleich © 2001-2002 Orientation in Objects GmbH Struts Patterns • • • • „Synchronizer Token“ für doppelten Submit „Base ActionForm“ zur Wiederverwendung von Funktionen „Link only to Actions“ zur Abschirmung von JSPs „Use ActionMapping Parameter property to distinguish operations“ • Verwendung von BeanUtils zum anlegen von VOs Quelle: http://husted.com/struts Struts & Cocoon im Vergleich © 2001-2002 Orientation in Objects GmbH 31 Anwendung von Cocoon “MVC is one of the possible examples of 'separation of concerns' (SoC). Since Cocoon is designed around SoC, it is entirely possible to design a web application in Cocoon using this pattern, even if, admittedly, webapp frameworks that have their focus on this are easier to use and much faster to learn than an XML-based framework.” Stefano Mazzochi Quelle: Bayer, Thomas im Interview mit Stefano Mazzochi (http://www.oio.de/public) Struts & Cocoon im Vergleich © 2001-2002 Orientation in Objects GmbH Offenheit & Integrationsfähigkeit • Beide basieren auf Servlet API • Struts – PlugIn-Mechanismus ab Version 1.1 • Cocoon – Jede Avalon-Komponente ist austauschbar (Generator, Transformer, Serializer,...) – Cocoon mit idealer XML-Integration Struts & Cocoon im Vergleich © 2001-2002 Orientation in Objects GmbH 32 Wartbarkeit und Erweiterbarkeit • Deklaratives Hinzuschalten von Prozessen / Actions • Struts: – Seiten deklarativ austauschbar (Mappings) • Cocoon: – Austausch von Avalon Komponenten – Anwendungsdesign ist entscheidend – Trennung der SoC muss klar sein • Welche Logik kommt XSLT zu? • XML muss darstellungsfrei sein • Actions und XSPs sollten klar abgegrenzt sein (Redirect) Struts & Cocoon im Vergleich © 2001-2002 Orientation in Objects GmbH Effektivität (nach Erlernen) • Durch Modularisierung der Arbeit steigt Effektivität im Team • PlugIns für JBuilder, Eclipse, etc... • Struts: – Struts kann JSP-Tools nutzen • Cocoon: – Verwendung von XML-Tools – Kein XSP-Editor Struts & Cocoon im Vergleich © 2001-2002 Orientation in Objects GmbH 33 XML-Unterstützung Positionierung von Struts und Cocoon Cocoon Struts MVC-Unterstützung Struts & Cocoon im Vergleich © 2001-2002 Orientation in Objects GmbH Fragen? ? ? ? ? ? Struts & Cocoon im Vergleich © 2001-2002 Orientation in Objects GmbH 34