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, Hibernate, Spring? Web Framework Experience: Struts, Spring MVC, WebWork, Tapestry, JSF Others: Wicket, Ruby on Rails?
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 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 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 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