Colorado Software Summit: October 23 – 28, 2005 © Copyright 2005, Virtuas, LLC

Comparing Web Frameworks Struts, Spring MVC, WebWork, Tapestry & JSF

Matt Raible [email protected]

Matt Raible — Comparing Web Frameworks Struts, Spring MVC, WebWork, Tapestry & JSF Page 1 Colorado Software Summit: October 23 – 28, 2005 © Copyright 2005, Virtuas, LLC

Introductions

 Your experience with webapps?  Your experience with J2EE?  What do you want to get from this session?  Experience with Ant, Tomcat, , Spring?  Experience: Struts, Spring MVC, WebWork, Tapestry, JSF  Others: Wicket, ?

Anyone used AppFuse or Equinox?

Matt Raible — Comparing Web Frameworks Struts, Spring MVC, WebWork, Tapestry & JSF Page 2 Colorado Software Summit: October 23 – 28, 2005 © Copyright 2005, Virtuas, LLC

Matt Raible — Comparing Web Frameworks Struts, Spring MVC, WebWork, Tapestry & JSF Page 3 Colorado Software Summit: October 23 – 28, 2005 © Copyright 2005, Virtuas, LLC

Matt Raible — Comparing Web Frameworks Struts, Spring MVC, WebWork, Tapestry & JSF Page 4 Colorado Software Summit: October 23 – 28, 2005 © Copyright 2005, Virtuas, LLC

Matt Raible — Comparing Web Frameworks Struts, Spring MVC, WebWork, Tapestry & JSF Page 5 Colorado Software Summit: October 23 – 28, 2005 © Copyright 2005, Virtuas, LLC

Matt Raible — Comparing Web Frameworks Struts, Spring MVC, WebWork, Tapestry & JSF Page 6 Colorado Software Summit: October 23 – 28, 2005 © Copyright 2005, Virtuas, LLC

Matt Raible — Comparing Web Frameworks Struts, Spring MVC, WebWork, Tapestry & JSF Page 7 Colorado Software Summit: October 23 – 28, 2005 © Copyright 2005, Virtuas, LLC

Matt Raible — Comparing Web Frameworks Struts, Spring MVC, WebWork, Tapestry & JSF Page 8 Colorado Software Summit: October 23 – 28, 2005 © Copyright 2005, Virtuas, LLC

Matt Raible — Comparing Web Frameworks Struts, Spring MVC, WebWork, Tapestry & JSF Page 9 Colorado Software Summit: October 23 – 28, 2005 © Copyright 2005, Virtuas, LLC

Matt Raible — Comparing Web Frameworks Struts, Spring MVC, WebWork, Tapestry & JSF Page 10 Colorado Software Summit: October 23 – 28, 2005 © Copyright 2005, Virtuas, LLC

Matt Raible — Comparing Web Frameworks Struts, Spring MVC, WebWork, Tapestry & JSF Page 11 Colorado Software Summit: October 23 – 28, 2005 © Copyright 2005, Virtuas, LLC

Matt Raible — Comparing Web Frameworks Struts, Spring MVC, WebWork, Tapestry & JSF Page 12 Colorado Software Summit: October 23 – 28, 2005 © Copyright 2005, Virtuas, LLC

Matt Raible — Comparing Web Frameworks Struts, Spring MVC, WebWork, Tapestry & JSF Page 13 Colorado Software Summit: October 23 – 28, 2005 © Copyright 2005, Virtuas, LLC

Matt Raible — Comparing Web Frameworks Struts, Spring MVC, WebWork, Tapestry & JSF Page 14 Colorado Software Summit: October 23 – 28, 2005 © Copyright 2005, Virtuas, LLC

Matt Raible — Comparing Web Frameworks Struts, Spring MVC, WebWork, Tapestry & JSF Page 15 Colorado Software Summit: October 23 – 28, 2005 © Copyright 2005, Virtuas, LLC

Who is Matt Raible?

 Father, Husband, Open Source Practice Leader  Developing websites since 1994 - Developing J2EE webapps since 1999  Committer on several open source projects: AppFuse, Roller Weblogger, XDoclet, Struts Menu, Display Tag  J2EE 5.0 and JSF 1.2 Expert Group Member  Author: Spring Live (SourceBeat) and contributor to Pro JSP (Apress)

Matt Raible — Comparing Web Frameworks Struts, Spring MVC, WebWork, Tapestry & JSF Page 16 Colorado Software Summit: October 23 – 28, 2005 © Copyright 2005, Virtuas, LLC

J2EE 5.0 and JSF 1.2 Expert Group Member

Matt Raible — Comparing Web Frameworks Struts, Spring MVC, WebWork, Tapestry & JSF Page 17 Colorado Software Summit: October 23 – 28, 2005 © Copyright 2005, Virtuas, LLC

Why are you all here today?

Because Struts sucks?

Matt Raible — Comparing Web Frameworks Struts, Spring MVC, WebWork, Tapestry & JSF Page 18 Colorado Software Summit: October 23 – 28, 2005 © Copyright 2005, Virtuas, LLC

My Experience

 Struts: used since June 2001 - same time 1.0 was released.  Spring MVC: used since January 2004 - before 1.0 was released.  WebWork: used since July 2004.  Tapestry: used since July 2004.  JSF: used since July 2004 - both Sun’s RI and MyFaces.

Matt Raible — Comparing Web Frameworks Struts, Spring MVC, WebWork, Tapestry & JSF Page 19 Colorado Software Summit: October 23 – 28, 2005 © Copyright 2005, Virtuas, LLC

Meet the Candidates

Matt Raible — Comparing Web Frameworks Struts, Spring MVC, WebWork, Tapestry & JSF Page 20 Colorado Software Summit: October 23 – 28, 2005 © Copyright 2005, Virtuas, LLC

Struts

 Pros: The “Standard” - lots of Struts jobs Lots of information and examples HTML tag library is one of the best  Cons: ActionForms - they’re a pain Can’t unit test - StrutsTestCase only does integration Project has been rumored as “dead”

Matt Raible — Comparing Web Frameworks Struts, Spring MVC, WebWork, Tapestry & JSF Page 21 Colorado Software Summit: October 23 – 28, 2005 © Copyright 2005, Virtuas, LLC

Struts Action

public class UserAction extends DispatchAction { private UserManager mgr = null;

public void setUserManager(UserManager userManager) { this.mgr = userManager; }

public ActionForward delete(ActionMapping mapping, ActionForm form, HttpServletRequest request, HttpServletResponse response) throws Exception { DynaActionForm userForm = (DynaActionForm) form; User user = (User) userForm.get("user");

mgr.removeUser(request.getParameter("user.id"));

ActionMessages messages = new ActionMessages(); messages.add(ActionMessages.GLOBAL_MESSAGE, new ActionMessage("user.deleted", user.getFullName()));

saveMessages(request.getSession(), messages);

return mapping.findForward("users"); }

Matt Raible — Comparing Web Frameworks Struts, Spring MVC, WebWork, Tapestry & JSF Page 22 Colorado Software Summit: October 23 – 28, 2005 © Copyright 2005, Virtuas, LLC

Struts Action

public class UserAction extends DispatchAction { private UserManager mgr = null;

public void setUserManager(UserManager userManager) { this.mgr = userManager; }

public ActionForward delete(ActionMapping mapping, ActionForm form, HttpServletRequest request, HttpServletResponse response) throws Exception { DynaActionForm userForm = (DynaActionForm) form; User user = (User) userForm.get("user");

mgr.removeUser(request.getParameter("user.id"));

ActionMessages messages = new ActionMessages(); messages.add(ActionMessages.GLOBAL_MESSAGE, new ActionMessage("user.deleted", user.getFullName()));

saveMessages(request.getSession(), messages);

return mapping.findForward("users"); }

Matt Raible — Comparing Web Frameworks Struts, Spring MVC, WebWork, Tapestry & JSF Page 23 Colorado Software Summit: October 23 – 28, 2005 © Copyright 2005, Virtuas, LLC

Struts Action

public class UserAction extends DispatchAction { private UserManager mgr = null;

public void setUserManager(UserManager userManager) { this.mgr = userManager; }

public ActionForward delete(ActionMapping mapping, ActionForm form, HttpServletRequest request, HttpServletResponse response) throws Exception { DynaActionForm userForm = (DynaActionForm) form; User user = (User) userForm.get("user");

mgr.removeUser(request.getParameter("user.id"));

ActionMessages messages = new ActionMessages(); messages.add(ActionMessages.GLOBAL_MESSAGE, new ActionMessage("user.deleted", user.getFullName()));

saveMessages(request.getSession(), messages);

return mapping.findForward("users"); }

Matt Raible — Comparing Web Frameworks Struts, Spring MVC, WebWork, Tapestry & JSF Page 24 Colorado Software Summit: October 23 – 28, 2005 © Copyright 2005, Virtuas, LLC

Display Tag

Matt Raible — Comparing Web Frameworks Struts, Spring MVC, WebWork, Tapestry & JSF Page 25 Colorado Software Summit: October 23 – 28, 2005 © Copyright 2005, Virtuas, LLC

Struts: userForm.jsp

Matt Raible — Comparing Web Frameworks Struts, Spring MVC, WebWork, Tapestry & JSF Page 26 Colorado Software Summit: October 23 – 28, 2005 © Copyright 2005, Virtuas, LLC

Struts: userForm.jsp

"/> [${datePattern}]

Matt Raible — Comparing Web Frameworks Struts, Spring MVC, WebWork, Tapestry & JSF Page 27 Colorado Software Summit: October 23 – 28, 2005 © Copyright 2005, Virtuas, LLC

Spring MVC

Matt Raible — Comparing Web Frameworks Struts, Spring MVC, WebWork, Tapestry & JSF Page 28 Colorado Software Summit: October 23 – 28, 2005 © Copyright 2005, Virtuas, LLC

Spring MVC (Continued)

 Pros: Lifecyle for overriding binding, validation, etc. Integrates with many view options seamlessly: JSP/JSTL, Tiles, Velocity, FreeMarker, Excel, XSL, PDF Inversion of Control makes it easy to test  Cons: Configuration intensive - lots of XML Requires writing lots of code in JSPs Almost too flexible - no common parent Controller

Matt Raible — Comparing Web Frameworks Struts, Spring MVC, WebWork, Tapestry & JSF Page 29 Colorado Software Summit: October 23 – 28, 2005 © Copyright 2005, Virtuas, LLC

Spring Controller

public class UserController implements Controller { private final Log log = LogFactory.getLog(UserController.class); private UserManager mgr = null;

public void setUserManager(UserManager userManager) { this.mgr = userManager; }

public ModelAndView handleRequest(HttpServletRequest request, HttpServletResponse response) throws Exception { if (log.isDebugEnabled()) { log.debug("entering 'handleRequest' method..."); }

return new ModelAndView("userList", "users", mgr.getUsers()); } }

Matt Raible — Comparing Web Frameworks Struts, Spring MVC, WebWork, Tapestry & JSF Page 30 Colorado Software Summit: October 23 – 28, 2005 © Copyright 2005, Virtuas, LLC

Spring Controller

public class UserController implements Controller { private final Log log = LogFactory.getLog(UserController.class); private UserManager mgr = null;

public void setUserManager(UserManager userManager) { this.mgr = userManager; }

public ModelAndView handleRequest(HttpServletRequest request, HttpServletResponse response) throws Exception { if (log.isDebugEnabled()) { log.debug("entering 'handleRequest' method..."); }

return new ModelAndView("userList", "users", mgr.getUsers()); } }

Matt Raible — Comparing Web Frameworks Struts, Spring MVC, WebWork, Tapestry & JSF Page 31 Colorado Software Summit: October 23 – 28, 2005 © Copyright 2005, Virtuas, LLC

Spring: userForm.jsp

" onsubmit="return validateUser(this)" name="userForm">

"/> [${datePattern}]

Matt Raible — Comparing Web Frameworks Struts, Spring MVC, WebWork, Tapestry & JSF Page 32 Colorado Software Summit: October 23 – 28, 2005 © Copyright 2005, Virtuas, LLC

Spring: userForm.jsp

" onsubmit="return validateUser(this)" name="userForm">

${status.errorMessage}

Matt Raible — Comparing Web Frameworks Struts, Spring MVC, WebWork, Tapestry & JSF Page 33 Colorado Software Summit: October 23 – 28, 2005 © Copyright 2005, Virtuas, LLC

Spring Web Flow

Matt Raible — Comparing Web Frameworks Struts, Spring MVC, WebWork, Tapestry & JSF Page 34 Colorado Software Summit: October 23 – 28, 2005 © Copyright 2005, Virtuas, LLC

WebWork

Matt Raible — Comparing Web Frameworks Struts, Spring MVC, WebWork, Tapestry & JSF Page 35 Colorado Software Summit: October 23 – 28, 2005 © Copyright 2005, Virtuas, LLC

WebWork (Continued)

 Architecture: With Struts and Spring - I felt overwhelmed whenever I dived into the code and tried to fix or extend. With WebWork/ XWork - it was easy to find how stu worked.  Not bound to the Servlet API is not much of an advantage in my book.

 Pros: Simple architecture - easy to extend Tag Library is easy to customize - backed by Velocity Interceptors are pretty slick  Cons: Small Community Documentation only recently written, few examples Client-side validation immature

Matt Raible — Comparing Web Frameworks Struts, Spring MVC, WebWork, Tapestry & JSF Page 36 Colorado Software Summit: October 23 – 28, 2005 © Copyright 2005, Virtuas, LLC

WebWork Action

public class UserAction extends ActionSupport { private UserManager mgr; private User user; private String id;

public void setUserManager(UserManager userManager) { this.mgr = userManager; }

public void setId(String id) { this.id = id; }

public User getUser() { return user; }

public String edit() { // check for an add if (id != null) { user = mgr.getUser(id); } else { user = new User(); } return SUCCESS; }

Matt Raible — Comparing Web Frameworks Struts, Spring MVC, WebWork, Tapestry & JSF Page 37 Colorado Software Summit: October 23 – 28, 2005 © Copyright 2005, Virtuas, LLC

WebWork: userForm.jsp

Matt Raible — Comparing Web Frameworks Struts, Spring MVC, WebWork, Tapestry & JSF Page 38 Colorado Software Summit: October 23 – 28, 2005 © Copyright 2005, Virtuas, LLC

OGNL

Matt Raible — Comparing Web Frameworks Struts, Spring MVC, WebWork, Tapestry & JSF Page 39 Colorado Software Summit: October 23 – 28, 2005 © Copyright 2005, Virtuas, LLC

Tapestry

Matt Raible — Comparing Web Frameworks Struts, Spring MVC, WebWork, Tapestry & JSF Page 40 Colorado Software Summit: October 23 – 28, 2005 © Copyright 2005, Virtuas, LLC

Tapestry (Continued)

 User community seems almost cultish - everyone that uses it loves it  Seems like the WebWork users last year  No one has heard of it - tough for jobs  Ugly URLs - dicult for integrating container-managed authentication (patch exists)

 Pros:  Very productive once you learn it  Templates are HTML - great for designers  Healthy and smart user community  Cons:  Documentation very conceptual, rather than pragmatic  Steep learning curve - very few examples  Long release cycles - major upgrades every year

Matt Raible — Comparing Web Frameworks Struts, Spring MVC, WebWork, Tapestry & JSF Page 41 Colorado Software Summit: October 23 – 28, 2005 © Copyright 2005, Virtuas, LLC

Tapestry Page

public abstract class UserForm extends BasePage {

public abstract UserManager getUserManager(); public abstract void setUserManager(UserManager manager);

public abstract void setUser(User user); public abstract User getUser();

public void save(IRequestCycle cycle) { if (log.isDebugEnabled()) { log.debug("entered 'save' method"); }

getUserManager().saveUser(getUser());

UserList nextPage = (UserList) cycle.getPage("users"); nextPage.setMessage(format("user.saved", getUser().getFullName())); throw new PageRedirectException(nextPage); }

Matt Raible — Comparing Web Frameworks Struts, Spring MVC, WebWork, Tapestry & JSF Page 42 Colorado Software Summit: October 23 – 28, 2005 © Copyright 2005, Virtuas, LLC

Tapestry: userForm.html

${status.errorMessage}
"/> [${datePattern}]

Matt Raible — Comparing Web Frameworks Struts, Spring MVC, WebWork, Tapestry & JSF Page 43 Colorado Software Summit: October 23 – 28, 2005 © Copyright 2005, Virtuas, LLC

DatePicker Component

:
:
:

Matt Raible — Comparing Web Frameworks Struts, Spring MVC, WebWork, Tapestry & JSF Page 44 Colorado Software Summit: October 23 – 28, 2005 © Copyright 2005, Virtuas, LLC

JSF

Matt Raible — Comparing Web Frameworks Struts, Spring MVC, WebWork, Tapestry & JSF Page 45 Colorado Software Summit: October 23 – 28, 2005 © Copyright 2005, Virtuas, LLC

JSF (Continued)

 JSF to be developed with tools. In my experience, tools suck and just get in the way.  Java Studio Creator is for the “corporate developer”. Should corporate developers be developing enterprise applications?  Could easily become a truly great framework if folks stop bitching and pitch in to make it better.  JavaScript everywhere - wouldn’t be so bad if the testing frameworks (i.e. WebTest and jWebUnit) supported JavaScript better  Everything is a POST - GETs are good for bookmarking and refreshing

 Pros:  J2EE Standard - lots of demand and jobs  Fast and easy to develop with  Rich Navigation framework  Cons:  Tag soup for JSPs  Immature technology - doesn’t come with everything  No single source for implementation

Matt Raible — Comparing Web Frameworks Struts, Spring MVC, WebWork, Tapestry & JSF Page 46 Colorado Software Summit: October 23 – 28, 2005 © Copyright 2005, Virtuas, LLC

JSF Managed Bean

public class UserForm { private String id; public User user = new User(); public UserManager mgr;

public void setId(String id) { this.id = id; }

public void setUser(User user) { this.user = user; }

public void setUserManager(UserManager userManager) { this.mgr = userManager; }

public String edit() {

if (id != null) { // assuming edit setUser(mgr.getUser(id)); }

return "success"; }

Matt Raible — Comparing Web Frameworks Struts, Spring MVC, WebWork, Tapestry & JSF Page 47 Colorado Software Summit: October 23 – 28, 2005 © Copyright 2005, Virtuas, LLC

JSF: userForm.jsp

:
:
:

Matt Raible — Comparing Web Frameworks Struts, Spring MVC, WebWork, Tapestry & JSF Page 48 Colorado Software Summit: October 23 – 28, 2005 © Copyright 2005, Virtuas, LLC

Let’s Compare!

Matt Raible — Comparing Web Frameworks Struts, Spring MVC, WebWork, Tapestry & JSF Page 49 Colorado Software Summit: October 23 – 28, 2005 © Copyright 2005, Virtuas, LLC

Evaluation Criteria

 List Screens: How easy is it to code pageable, sortable lists?  Bookmarkability: Can users bookmark pages and return to them easily?  Validation: How easy is it to use and does it support client-side (JavaScript) validation?  Testability: How easy is it to test Controllers out of container?

Matt Raible — Comparing Web Frameworks Struts, Spring MVC, WebWork, Tapestry & JSF Page 50 Colorado Software Summit: October 23 – 28, 2005 © Copyright 2005, Virtuas, LLC

Evaluation Criteria (Continued)

 Post and Redirect: How does the framework handle the duplicate post problem?  Spring Integration: Does the framework support using Spring in the middle tier; how easily?  Internationalization: How is i18n supported and how easy is it to get messages in Controllers?  Page Decoration: What sort of page decoration/composition mechanisms does the framework support?

Matt Raible — Comparing Web Frameworks Struts, Spring MVC, WebWork, Tapestry & JSF Page 51 Colorado Software Summit: October 23 – 28, 2005 © Copyright 2005, Virtuas, LLC

Evaluation Criteria (Continued)

 Tools: Is there good tool (particularly IDE) support for the framework?  Marketability of Skills: If you learn the framework, will it help you get a job?  Job Count: What is the demand for framework skills on dice.com?

Matt Raible — Comparing Web Frameworks Struts, Spring MVC, WebWork, Tapestry & JSF Page 52 Colorado Software Summit: October 23 – 28, 2005 © Copyright 2005, Virtuas, LLC

List Screens

 How easy is it to integrate a sortable/ pageable list of data? Struts, Spring MVC and WebWork can all use Tag Libraries like the Display Tag Tapestry has a contrib:Table component JSF has a dataTable with no sorting - have to write your own logic if you want it

I thought JSF’s real power was going to be its widgets? It’s still early - this should be something easy to solve. You can use the displaytag in JSF, but you can’t link items to actions - even with an

Matt Raible — Comparing Web Frameworks Struts, Spring MVC, WebWork, Tapestry & JSF Page 53 Colorado Software Summit: October 23 – 28, 2005 © Copyright 2005, Virtuas, LLC

Bookmarking and URLs

 Using container-managed authentication (or other filter- based security systems) allow users to bookmark pages. They can click the bookmark, login and go directly to the page. WebWork has namespaces - makes it easy Struts and Spring allow full URL control Tapestry has ugly URLs - difficult to segment the app for different roles JSF does a POST for everything

Matt Raible — Comparing Web Frameworks Struts, Spring MVC, WebWork, Tapestry & JSF Page 54 Colorado Software Summit: October 23 – 28, 2005 © Copyright 2005, Virtuas, LLC

Validation

 Validation should be easy to configure, be robust on the client side and either provide good out of the box messages or allow you to easily customize them. Struts and Spring MVC use Commons Validator - a mature solution WebWork uses OGNL for powerful expressions - client-side support very new Tapestry has very robust validation - good messages without need to customize JSF - ugly default messages, but easiest to configure

I’ve heard that the code under commons validator is ugly - who cares it works!

Matt Raible — Comparing Web Frameworks Struts, Spring MVC, WebWork, Tapestry & JSF Page 55 Colorado Software Summit: October 23 – 28, 2005 © Copyright 2005, Virtuas, LLC

Testability

 Struts - can use StrutsTestCase  Spring and WebWork allow easy testing with mocks (e.g. EasyMock, jMock, Spring Mocks)  Tapestry appears difficult to test because page classes are abstract, Tapestry Test Assist to the rescue  JSF page classes can be easily tested and actually look a lot like WebWork actions

StrutsTestCase requires struts-config.xml and web.xml. More of an integration test (which are more important than unit tests IMO) Spring Mocks (spring-mock.jar) mocks the Servlet API and is not Spring-specific JSF page classes are true POJOs and don’t extend any classes

Matt Raible — Comparing Web Frameworks Struts, Spring MVC, WebWork, Tapestry & JSF Page 56 Colorado Software Summit: October 23 – 28, 2005 © Copyright 2005, Virtuas, LLC

Post and Redirect

 The duplicate-post problem, what is it?  Easiest way to solve: redirect after POST  Is there support for allowing success messages to live through a redirect? Struts and Spring are the only framework that allows success messages to live through a redirect WebWork requires a custom solution Tapestry requires you to throw an Exception to redirect JSF requires a custom solution, i18n messages difficult to get in page beans

Struts makes it fairly easy to get i18n messages in a Struts Action. Spring has long classnames / method arguments make it kinda clunky to get messages. WebWork has the cleanest way to get messages using a simple "getText()" method. Tapestry requires you to throw an exception to redirect and it still doesn't redirect JSF requires lots of code to get a ResourceBundle With JSF - you could use Spring's IoC to inject a "messageSource" bean

Matt Raible — Comparing Web Frameworks Struts, Spring MVC, WebWork, Tapestry & JSF Page 57 Colorado Software Summit: October 23 – 28, 2005 © Copyright 2005, Virtuas, LLC

Spring Integration

 All frameworks have integration with Spring Struts: ContextLoaderPlugin and Base classes WebWork: SpringObjectFactory Tapestry: override base engine, grab from servlet context, put into global map JSF: DelegatingVariableResolver or JSF-Spring Library

Struts Spring Plugin is nice because you can actually have Spring manage your beans. WebWork is only framework that requires support and doesn’t have code in Spring Tapestry integration requires a little more setup but works great once you’ve done it JSF: DelegateVariableResolver only works with MyFaces, which reports errors. JSF-Spring works nicely with both Sun’s RI and MyFaces

Matt Raible — Comparing Web Frameworks Struts, Spring MVC, WebWork, Tapestry & JSF Page 58 Colorado Software Summit: October 23 – 28, 2005 © Copyright 2005, Virtuas, LLC

Internationalization

 JSTL’s tag makes it easy  No standard for getting i18n messages in controller classes  Struts, Spring and JSF encourage one ResourceBundle per locale  WebWork and Tapestry advocate separate files for each page/action

Sample app gets messages from JSTL - so there’s a standard way in each app’s Base controller class WebWork and Tapestry’s approach probably better for large teams. Dicult for AppFuse though

Matt Raible — Comparing Web Frameworks Struts, Spring MVC, WebWork, Tapestry & JSF Page 59 Colorado Software Summit: October 23 – 28, 2005 © Copyright 2005, Virtuas, LLC

Page Decoration

 Tiles Experience: used since it first came out  SiteMesh is much easier to setup and use  Tiles can be used in Struts, Spring and JSF Requires configuration for each page  SiteMesh can be used with all frameworks Requires very little maintenance after setup  Use both for powerful decoration/composition

All five sample apps use SiteMesh w/ the same decorator. Changes were not required for any of the frameworks.

Matt Raible — Comparing Web Frameworks Struts, Spring MVC, WebWork, Tapestry & JSF Page 60 Colorado Software Summit: October 23 – 28, 2005 © Copyright 2005, Virtuas, LLC

SiteMesh

 Tiles Experience: used since it first came out  SiteMesh is much easier to setup and use  Tiles can be used in Struts, Spring and JSF Requires configuration for each page  SiteMesh can be used with all frameworks Requires very little maintenance after setup  Use both for powerful decoration/composition

Matt Raible — Comparing Web Frameworks Struts, Spring MVC, WebWork, Tapestry & JSF Page 61 Colorado Software Summit: October 23 – 28, 2005 © Copyright 2005, Virtuas, LLC

SiteMesh: web.xml

sitemesh com.opensymphony.module.sitemesh.filter.PageFilter

sitemesh /* REQUEST FORWARD

Matt Raible — Comparing Web Frameworks Struts, Spring MVC, WebWork, Tapestry & JSF Page 62 Colorado Software Summit: October 23 – 28, 2005 © Copyright 2005, Virtuas, LLC

/WEB-INF/sitemesh.xml

Matt Raible — Comparing Web Frameworks Struts, Spring MVC, WebWork, Tapestry & JSF Page 63 Colorado Software Summit: October 23 – 28, 2005 © Copyright 2005, Virtuas, LLC

/WEB-INF/decorators.xml

/demos/* /resources/* /*

Matt Raible — Comparing Web Frameworks Struts, Spring MVC, WebWork, Tapestry & JSF Page 64 Colorado Software Summit: October 23 – 28, 2005 © Copyright 2005, Virtuas, LLC

Sample Decorator

<%@ include file="/taglibs.jsp"%>

<decorator:title default="Equinox"/> >

<%@ include file="/messages.jsp"%>

Matt Raible — Comparing Web Frameworks Struts, Spring MVC, WebWork, Tapestry & JSF Page 65 Colorado Software Summit: October 23 – 28, 2005 © Copyright 2005, Virtuas, LLC

Before SiteMesh

Matt Raible — Comparing Web Frameworks Struts, Spring MVC, WebWork, Tapestry & JSF Page 66 Colorado Software Summit: October 23 – 28, 2005 © Copyright 2005, Virtuas, LLC

After SiteMesh

Matt Raible — Comparing Web Frameworks Struts, Spring MVC, WebWork, Tapestry & JSF Page 67 Colorado Software Summit: October 23 – 28, 2005 © Copyright 2005, Virtuas, LLC

Tools

 Struts has a lot of IDE support and even has frameworks built on top of it (i.e. Beehive’s PageFlow)  Spring has Spring IDE - only does XML validation, not a UI/web tool  WebWork has EclipseWork  Tapestry has Spindle - great for coders  JSF has many, all cost money and hook into proprietary app servers

Matt Raible — Comparing Web Frameworks Struts, Spring MVC, WebWork, Tapestry & JSF Page 68 Colorado Software Summit: October 23 – 28, 2005 © Copyright 2005, Virtuas, LLC

Tools Available

15.00 Cocoon Struts 11.25 Spring MVC WebWork Tapestry 7.50 JSF

3.75

0

Matt Raible — Comparing Web Frameworks Struts, Spring MVC, WebWork, Tapestry & JSF Page 69 Colorado Software Summit: October 23 – 28, 2005 © Copyright 2005, Virtuas, LLC

Marketability of Skills

 Struts is still in high-demand and widely-used  Spring is getting more press, but mostly due to the framework’s other features  WebWork is gaining ground, but very scarce on job boards  Tapestry is even more scarce - needs more marketing  JSF is quickly becoming popular

Struts: a lot of enterprise applications are based on it WebWork: gig is likely word-of-mouth and you’ll probably be working with some pretty smart folks. Often used with Spring and Hibernate JSF: want to stay employed - learn JSF. The best reason: so you can back up your arguments on why you do/don’t like it.

Matt Raible — Comparing Web Frameworks Struts, Spring MVC, WebWork, Tapestry & JSF Page 70 Colorado Software Summit: October 23 – 28, 2005 © Copyright 2005, Virtuas, LLC

Dice Job Count 1,500

1,125

750

375

0 October 15, 2004 June 9, 2005 Struts: 1006 Spring: 15 (tough to search) WebWork: 14 Tapestry: 9 JSF: 147 (Lockheed Joint Strike Fighter) w/o 26

Matt Raible — Comparing Web Frameworks Struts, Spring MVC, WebWork, Tapestry & JSF Page 71 Colorado Software Summit: October 23 – 28, 2005 © Copyright 2005, Virtuas, LLC

Jobs sans Struts 55.00

41.25

27.50

13.75

0 October 15, 2004June 9, 2005

Struts: 1006 Spring: 15 (tough to search) WebWork: 14 Tapestry: 9 JSF: 147 (Lockheed Joint Strike Fighter) w/o 26

Matt Raible — Comparing Web Frameworks Struts, Spring MVC, WebWork, Tapestry & JSF Page 72 Colorado Software Summit: October 23 – 28, 2005 © Copyright 2005, Virtuas, LLC

Employer Search on Monster.com Resumes posted 6/10 - 6/13/2005

650 Struts 520 Spring MVC WebWork 390 JSF Tapestry 260

130

0

Matt Raible — Comparing Web Frameworks Struts, Spring MVC, WebWork, Tapestry & JSF Page 73 Colorado Software Summit: October 23 – 28, 2005 © Copyright 2005, Virtuas, LLC

Mailing List Traffic

Wicket MyFaces Tapestry WebWork Struts Cocoon

0 625 1,250 1,875 2,500

* Spring MVC is not listed here because they have a forum instead of a mailing list and I couldn’t figure out a way to count the number of messages for each month.

Matt Raible — Comparing Web Frameworks Struts, Spring MVC, WebWork, Tapestry & JSF Page 74 Colorado Software Summit: October 23 – 28, 2005 © Copyright 2005, Virtuas, LLC

Books on Amazon

Matt Raible — Comparing Web Frameworks Struts, Spring MVC, WebWork, Tapestry & JSF Page 75 Colorado Software Summit: October 23 – 28, 2005 © Copyright 2005, Virtuas, LLC

Which would I choose?

My Opinion

Struts ActionForms suck, but AppFuse/XDoclet takes those out of the equation Struts is fast to develop with because most problems have been solved. HTML tag library the best of the bunch. Spring is nice, but lack of form tags drops it down a notch or two. JSP 2.0 tag files exist in issue tracker. I like WebWork a lot, easy to learn, use and test. Used in a log of products (i.e. JIRA, Jive, NoFlu sites) Tapestry - seems nice, users like it, powers TSS. JSF - needs to listen to developers to see what they want instead of tools vendors.

Which would I choose?

Quick and dirty project?  Whichever one needs the most work in AppFuse ;-) Massive enterprise project?  Tapestry for its reusable components If I got a job as an open source developer?  WebWork because using it requires you to dig into the frameworks

Passion might be the most important factor. Massive project would have to have time to budgeted for learning curve. Audience: which would you choose and why? Has anyone switched a major project from one framework to another? When will JSF be ready (w/o Tools)?

Matt Raible — Comparing Web Frameworks Struts, Spring MVC, WebWork, Tapestry & JSF Page 76 Colorado Software Summit: October 23 – 28, 2005 © Copyright 2005, Virtuas, LLC

What do others think? Spring MVC 20 Struts WebWork JSF 15 Tapestry

10

5

0 AppFuse Usage http://raibledesigns.com/page/rd?entry=spring_mvc_the_most_popular

Matt Raible — Comparing Web Frameworks Struts, Spring MVC, WebWork, Tapestry & JSF Page 77 Colorado Software Summit: October 23 – 28, 2005 © Copyright 2005, Virtuas, LLC

Resources

 Download sample apps from this presentation http://equinox.dev.java.net/framework-comparison  Struts - http://struts.apache.org StrutsTestCase: http://strutstestcase.sf.net  Spring MVC - http://www.springframework.org Spring IDE: http://www.springide.org Gaijin Studio: http://gaijin-studio.sf.net  WebWork - http://opensymphony.org/webwork Eclipse Plugin: http://sf.net/projects/eclipsework IDEA Plugin: http://wiki.opensymphony.com/display/WW/IDEA +Plugin

Matt Raible — Comparing Web Frameworks Struts, Spring MVC, WebWork, Tapestry & JSF Page 78 Colorado Software Summit: October 23 – 28, 2005 © Copyright 2005, Virtuas, LLC

Resources (Continued)

 Tapestry - http://jakarta.apache.org/tapestry Spindle: http://spindle.sourceforge.net  JSF - http://java.sun.com/j2ee/javaserverfaces and http:// myfaces.apache.org Java Studio Creator: http://sun.com/software/products/jscreator MyEclipse: http://myeclipseide.com  IDEA: http://www.jetbrains.com/idea  SiteMesh: http://opensymphony.com/sitemesh

Matt Raible — Comparing Web Frameworks Struts, Spring MVC, WebWork, Tapestry & JSF Page 79 Colorado Software Summit: October 23 – 28, 2005 © Copyright 2005, Virtuas, LLC

Resources (Continued)

 Testing Frameworks JUnit: http://junit.org EasyMock: http://easymock.org jMock: http://jmock.org jWebUnit: http://jwebunit.sourceforge.net Canoo WebTest: http://webtest.canoo.com Tapestry Test Assist: http://howardlewisship.com/blog/ 2004/05/tapestry-test-assist.html  XDoclet - http://xdoclet.sourceforge.net  AppFuse - http://appfuse.dev.java.net  javablogs.com  theserverside.com  raibledesigns.com  jroller.com

Matt Raible — Comparing Web Frameworks Struts, Spring MVC, WebWork, Tapestry & JSF Page 80 Colorado Software Summit: October 23 – 28, 2005 © Copyright 2005, Virtuas, LLC

Books

 Struts in Action, Ted Husted and Team  Struts Live, Rick Hightower and Jonathan Lehr  Spring Live, Matt Raible  Pro Spring, Rob Harrop and Jan Machacek  Spring in Action, Craig Walls and Ryan Breidenbach  Professional Java Development with Spring, Rod Johnson, Juergen Hoeller and Team

Matt Raible — Comparing Web Frameworks Struts, Spring MVC, WebWork, Tapestry & JSF Page 81 Colorado Software Summit: October 23 – 28, 2005 © Copyright 2005, Virtuas, LLC

Books (Continued)  WebWork Live, Matthew Porter  WebWork in Action, Patrick Lightbody and Team  Tapestry Live, Warner Onstine  Tapestry in Action, Howard Lewis Ship  Core JSF, David Geary and Cay Horstmann  JSF in Action, Kito Mann

Matt Raible — Comparing Web Frameworks Struts, Spring MVC, WebWork, Tapestry & JSF Page 82 Colorado Software Summit: October 23 – 28, 2005 © Copyright 2005, Virtuas, LLC

What’s Next? AJAX Wicket Seam Clarity Ruby on Rails Trails OpenLaszlo

Don’t worry, the current web frameworks will also be around for a long time to come!

Matt Raible — Comparing Web Frameworks Struts, Spring MVC, WebWork, Tapestry & JSF Page 83 Colorado Software Summit: October 23 – 28, 2005 © Copyright 2005, Virtuas, LLC

Please fill out the evals! Questions? [email protected]

www.springlive.com

http://tinyurl.com/agczp

Matt Raible — Comparing Web Frameworks Struts, Spring MVC, WebWork, Tapestry & JSF Page 84

:
: