Your SlideShare is downloading. ×
[DSBW Spring 2009] Unit 07: WebApp Design Patterns & Frameworks (3/3)
Upcoming SlideShare
Loading in...5
×

Thanks for flagging this SlideShare!

Oops! An error has occurred.

×

Saving this for later?

Get the SlideShare app to save on your phone or tablet. Read anywhere, anytime - even offline.

Text the download link to your phone

Standard text messaging rates apply

[DSBW Spring 2009] Unit 07: WebApp Design Patterns & Frameworks (3/3)

1,732
views

Published on

Published in: Technology, Education

0 Comments
3 Likes
Statistics
Notes
  • Be the first to comment

No Downloads
Views
Total Views
1,732
On Slideshare
0
From Embeds
0
Number of Embeds
1
Actions
Shares
0
Downloads
0
Comments
0
Likes
3
Embeds 0
No embeds

Report content
Flagged as inappropriate Flag as inappropriate
Flag as inappropriate

Select your reason for flagging this presentation as inappropriate.

Cancel
No notes for slide

Transcript

  • 1. Unit 7: Design Patterns and Frameworks  “A framework is a defined support structure in which another software project can be organized and developed. A framework may include support programs, code libraries, a scripting language, or other software to help develop and glue together the different components of a software project” (from Wikipedia)  Here we are going to consider 3 MVC-based Web frameworks for Java: Struts 1  Spring MVC  JavaServer Faces  dsbw 2008/2009 2q 1
  • 2. Struts 1: Overview dsbw 2008/2009 2q 2
  • 3. dsbw 2008/2009 2q 3
  • 4. dsbw 2008/2009 2q 4
  • 5. Struts 1: Terminology wrt. J2EE Core Patterns Struts 1 J2EE Core Patterns Implementation Concept ActionServlet Front Controller RequestProcessor Application Controller UserAction Businesss Helper ActionMapping View Mapper ActionForward View Handle dsbw 2008/2009 2q 5
  • 6. Struts 1: Example - Wall’s New User dsbw 2008/2009 2q 6
  • 7. Struts 1: Example – wall_register.vm (Velocity template) <html><head> .... </head> <body> … <form action = “register.doquot; method=quot;postquot;> User’s Nickname: <input name=“usernamequot; value=quot;$!registrationForm.usernamequot; size=40> $!errors.wrongUsername.get(0) Password : <input name=“userpassword“ size=40> $!errors.wrongPassword.get(0) <!–- CAPTCHA CODE --> <input type=quot;submitquot; name=quot;insertquot; value=“insertquot;> </form> <center>$!errors.regDuplicate.get(0)</center> </body></html> dsbw 2008/2009 2q 7
  • 8. Struts 1: Example – Form validation dsbw 2008/2009 2q 8
  • 9. Struts 1: Example - RegistrationForm public class RegistrationForm extends ActionForm { protected String username; // ... The remaining form attributes + getter & setter methods public void reset(ActionMapping mapping, HttpServletRequest request) { /* ... Attribute initialization */ } public ActionErrors validate(ActionMapping mapping, HttpServletRequest request) { ActionErrors errors = new ActionErrors(); if (username== null || username.equals(quot;quot;)) { errors.add(“wrongUsernamequot;, new ActionMessage(quot;errors.username”)); } // .... Remaining validations return errors; } } dsbw 2008/2009 2q 9
  • 10. Struts 1: Example – Error Messages (Message.properties file) errors.username=(*) Username required errors.password=(*) Password required errors.regCAPTCHA=(*) Invalid CAPTCHA values errors.duplicateUser = Username '{0}' is already taken by another user dsbw 2008/2009 2q 10
  • 11. Struts 1: Example – Application Error (duplicated username) dsbw 2008/2009 2q 11
  • 12. Struts 1: Example - UserAction public class RegisterAction extends Action { public ActionForward execute(ActionMapping mapping, ActionForm form, HttpServletRequest request, HttpServletResponse response) { String username = ((RegistrationForm) form).getUsername(); String password = ((RegistrationForm) form).getUserpassword(); TransactionFactory txf = (TransactionFactory) request. aaaagetSession().getServletContext().getAttribute(quot;transactionFactoryquot;); try { Transaction trans = txf.newTransaction(quot;RegisterTransquot;); trans.getParameterMap().put(quot;usernamequot;, username); trans.getParameterMap().put(quot;passwordquot;, password); trans.execute(); request.getSession().setAttribute(quot;userquot;,username); request.getSession().setAttribute(quot;userIDquot;, trans.getParameterMap().get(quot;userIDquot;)); return (mapping.findForward(quot;successquot;)); } dsbw 2008/2009 2q 12
  • 13. Struts 1: Example – UserAction (cont.) catch (BusinessException ex) { if (ex.getMessageList().elementAt(0).startsWith(quot;Usernamequot;)) { ActionMessages errors = new ActionMessages(); errors.add(quot;regDuplicatequot;, new ActionMessage(quot;errors.duplicateUserquot;,username)); this.saveErrors(request, errors); form.reset(mapping,request); return (mapping.findForward(quot;duplicateUserquot;)); } else { request.setAttribute(quot;theListquot;,ex.getMessageList()); return (mapping.findForward(quot;failurequot;)); } } } } dsbw 2008/2009 2q 13
  • 14. Struts 1: Example - struts-config.xml (fragment) <action-mappings> <action path=quot;/registerquot; type=quot;wallFront.RegisterActionquot; name=quot;registrationFormquot; scope=quot;requestquot; validate=quot;truequot; input=quot;/wall_register.vmquot;> <forward name=quot;failurequot; path=quot;/error.vmquot;/> <forward name=quot;duplicateUser“ path=quot;/wall_register.vmquot;/> <forward name=quot;successquot; path=quot;/wallquot; redirect=quot;truequot;/> </action> … </action-mappings> dsbw 2008/2009 2q 14
  • 15. Struts 1: Example - web.xml (fragment) <!-- Standard Action Servlet Configuration --> <servlet> <servlet-name>action</servlet-name> <servlet-class> org.apache.struts.action.ActionServlet </servlet-class> <init-param> <param-name>config</param-name> <param-value>/WEB-INF/struts-config.xml</param-value> </init-param> </servlet> <!-- Standard Action Servlet Mapping --> <servlet-mapping> <servlet-name>action</servlet-name> <url-pattern>*.do</url-pattern> </servlet-mapping> dsbw 2008/2009 2q 15
  • 16. Struts 1: Example - web.xml (fragment, cont.) <servlet> <servlet-name>velocity</servlet-name> <servlet-class> org.apache.velocity.tools.view.servlet.VelocityViewServlet </servlet-class> <init-param> <param-name>org.apache.velocity.toolbox</param-name> <param-value>/WEB-INF/toolbox.xml</param-value> </init-param> <init-param> <param-name>org.apache.velocity.properties</param-name> <param-value>/WEB-INF/velocity.properties</param-value> </init-param> </servlet> <servlet-mapping> <servlet-name>velocity</servlet-name> <url-pattern>*.vm</url-pattern> </servlet-mapping> dsbw 2008/2009 2q 16
  • 17. Struts 2  Struts 1 + Webwork = Struts 2  Struts 2 vs Struts 1 (according to struts.apache.org/2.x)  Enhanced Results - Unlike ActionForwards, Struts 2 Results can actually help prepare the response.  Enhanced Tags - Struts2 tags don't just output data, but provide stylesheet- driven markup, so that we consistent pages can be created with less code.  POJO forms - No more ActionForms: we can use any JavaBean we like or put properties directly on our Action classes.  POJO Actions - Any class can be used as an Action class. Even the interface is optional!  First-class AJAX support - The AJAX theme gives interactive applications a boost. Easy-to-test Actions – Struts 2 Actions are HTTP independent and can be  tested without resorting to mock objects.  Intelligent Defaults - Most framework configuration elements have a default value that we can set and forget. dsbw 2008/2009 2q 17
  • 18. Struts 2: Tagging example <s:actionerror/> <s:form action=quot;Profile_updatequot; validate=quot;truequot;> <s:textfield label=quot;Usernamequot; name=quot;usernamequot;/> <s:password label=quot;Passwordquot; name=quot;passwordquot;/> <s:password label=quot;(Repeat) Passwordquot; name=quot;password2quot;/> <s:textfield label=quot;Full Namequot; name=quot;fullNamequot;/> <s:textfield label=quot;From Addressquot; name=quot;fromAddressquot;/> <s:textfield label=quot;Reply To Addressquot; name=quot;replyToAddressquot;/> <s:submit value=quot;Savequot; name=quot;Savequot;/> <s:submit action=quot;Register_cancelquot; value=quot;Cancelquot; name=quot;Cancelquot; onclick=quot;form.onsubmit=nullquot;/> </s:form> dsbw 2008/2009 2q 18
  • 19. Spring MVC  Spring's own implementation of the Front Controller Pattern  Flexible request mapping and handling  Full forms support  Supports several view technologies  JSP/Tiles, Velocity, FreeMarker  Support integration with other MVC frameworks  Struts, Tapestry, JavaServerFaces, WebWork  Provides a JSP Tag Library dsbw 2008/2009 2q 19
  • 20. Spring Framework Architecture Spring Web Spring ORM WebApplicationContext Hibernate support Struts integration Spring MVC iBatis support Tiles integration Spring AOP JDO support Web MVC Web utilities AOP infrastructure Framework Metadata support JSP support Declarative transaction Velocity/FreeMarker Spring Context Spring DAO management support PFD/Excel support Transaction Infrastructure ApplicationContext JDBC support JNDI, EJB support DAO support Remoting Spring Core IoC Container dsbw 2008/2009 2q 20
  • 21. Spring MVC: Request Lifecycle dsbw 2008/2009 2q 21
  • 22. Spring MVC: Terminology wrt. J2EE Core Patterns Spring MVC J2EE Core Patterns Concept DispatcherServlet Front Controller / Application Controller HandlerMapping Command Mapper ModelAndView View Handle / Presentation Model ViewResolver View Mapper Controller Business Helper dsbw 2008/2009 2q 22
  • 23. Spring MVC: Setting Up 1. Add the Spring dispatcher servlet to the web.xml 2. Configure additional bean definition files in web.xml 3. Write Controller classes and configure them in a bean definition file, typically META-INF/<appl>-servlet.xml 4. Configure view resolvers that map view names to to views (JSP, Velocity etc.) 5. Write the JSPs or other views to render the UI dsbw 2008/2009 2q 23
  • 24. Spring MVC: Controllers public class ListCustomersController implements Controller { private CustomerService customerService; public void setCustomerService(CustomerService customerService) { this.customerService = customerService; } public ModelAndView handleRequest(HttpServletRequest req, HttpServletResponse res) throws Exception { return new ModelAndView(“customerList”, “customers”, customerService.getCustomers()); } }  ModelAndView object is simply a combination of a named view and a Map of objects that are introduced into the request by the dispatcher dsbw 2008/2009 2q 24
  • 25. Spring MVC: Controllers (cont.)  Interface based Do not have to extend any base classes (as in Struts)   Have option of extending helpful base classes Multi-Action Controllers   Command Controllers Dynamic binding of request parameters to POJO (no  ActionForms) Form Controllers  Hooks into cycle for overriding binding, validation, and inserting  reference data Validation (including support for Commons Validation)  Wizard style controller  dsbw 2008/2009 2q 25
  • 26. JavaServer Faces (JSF)  Sun’s “Official” Java-based Web application framework  Specifications:  JSF 1.0 (11-03-2004)  JSF 1.1 (25-05-2004)  JSF 1.2 (11-05-2006)  JSF 2.0 (2009?)  Main characteristics: UI component state management across requests   Mechanism for wiring client-generated events to server side application code  Allow custom UI components to be easily built and re-used  A well-defined request processing lifecycle  Designed to be tooled dsbw 2008/2009 2q 26
  • 27. JSF: Application Architecture Servlet Container Client JSF Application Devices Business DB Phone Objects JSF Framework PDA Model Objects Laptop EJB Container dsbw 2008/2009 2q 27
  • 28. JSF framework: MVC Request Response Model Objects Component FacesServlet Tree Managed JavaBeans View Resources Delegates JavaBeans Converters Config Property Files Validators XML Renderers Action Business Objects Handlers Controller EJB Model & Event JDO Listeners JDBC dsbw 2008/2009 2q 28
  • 29. JSF: Request Processing Lifecycle Response Complete Response Complete Restore Request Apply Request Process Process Process Component Value Events Validations Events Tree Render Response Response Complete Response Complete Response Render Process Invoke Process Update Model Response Events Application Events Values Conversion Errors Validation or Conversion Errors dsbw 2008/2009 2q 29
  • 30. JSF: Request Processing Lifecycle  Restore Component Tree: The requesting page’s component tree is retrieved/recreated.   Stateful information about the page (if existed) is added to the request.  Apply Request Value:  Each component in the tree extracts its new value from the request parameters by using its decode method.  If the conversion of the value fails, an error message associated with the component is generated and queued .  If events have been queued during this phase, the JSF implementation broadcasts the events to interested listeners.  Process Validations:  The JSF implementation processes all validators registered on the components in the tree. It examines the component attributes that specify the rules for the validation and compares these rules to the local value stored for the component. dsbw 2008/2009 2q 30
  • 31. JSF: Request Processing Lifecycle  Update Model Values:  The JSF implementation walks the component tree and set the corresponding model object properties to the components' local values.  Only the bean properties pointed at by an input component's value attribute are updated  Invoke Application:  Action listeners and actions are invoked  The Business Logic Tier may be called  Render Response:  Render the page and send it back to client dsbw 2008/2009 2q 31
  • 32. JSF: Anatomy of a UI Component Event Render Handling Model binds has has Id has has Validators UIComponent Local Value Attribute Map has has Child Converters UIComponent dsbw 2008/2009 2q 32
  • 33. JSF: Standard UI Components  UIInput  UICommand  UIOutput  UIForm  UISelectBoolean  UIColumn  UISelectItem  UIData  UISelectMany  UIPanel  UISelectOne  UISelectMany  UIGraphic dsbw 2008/2009 2q 33
  • 34. JSF: HTML Tag Library  JSF Core Tag Library (prefix: f)  Validator, Event Listeners, Converters  JSF Standard Library (prefix: h)  Express UI components in JSP dsbw 2008/2009 2q 34
  • 35. JSF: HTML Tag Library <f:view> <h:form id=”logonForm”> <h:panelGrid columns=”2”> <h:outputLabel for=”username”> <h:outputText value=”Username:”/> </h:outputLabel> <h:inputText id=”username” value=”#{logonBean.username}”/> <h:outputLabel for=”password”> <h:outputText value=”Password:”/> </h:outputLabel> <h:inputSecret id=”password” value=”#{logonBean.password}”/> <h:commandButton id=”submitButton” type=”SUBMIT” action=”#{logonBean.logon}”/> <h:commandButton id=”resetButton” type=”RESET”/> </h:panelGrid> </h:form> </f:view> dsbw 2008/2009 2q 35
  • 36. JSF: Managed (Model) Bean  Used to separate presentation from business logic  Based on JavaBeans  Similar to Struts ActionForm concept  Can also be registered to handle events and conversion and validation functions  UI Component binding example: <h:inputText id=”username” value=”#{logonBean.username}”/> dsbw 2008/2009 2q 36
  • 37. References  Books:  B. Siggelkow. Jakarta Struts Cookbook. O'Reilly, 2005  J. Carnell, R. Harrop. Pro Jakarta Struts, 2nd Edition. Apress, 2004  C. Walls, R. Breidenbach. Spring in Action. Manning, 2006.  B. Dudney, J. Lehr, B. Willis, L. Mattingly. Mastering JavaServer Faces. Willey, 2004.  Web sites:  struts.apache.org  rollerjm.free.fr/pro/Struts11.html  www.springframework.org  static.springframework.org/spring/docs/1.2.x/reference/mvc.html  java.sun.com/javaee/javaserverfaces dsbw 2008/2009 2q 37