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