Struts 2 Architecture and Overview Objectives: 1. Understand MVC and Struts 2 Architecture 2. Analyze Page-centric and Servlet-centric Designs 3. Develop JSP Interactive Interfaces Topics Introduction to Struts 2 Model-View-Controller Architecture Struts and MVC Architecting Web Applications Page-centric Design Servlet-centric Design JSP Interactive Interfaces FormBean Struts Classic Project Combines JSPs and Servlets Targets a Model-View-Controller (MVC) Architecture Conceived by Craig McClanahan in May 2000 Support by Application Servers BEA GlassFish JBoss Apache’s Tomcat Struts 2 Apache Project Based on OpenSymphony WebWork framework Implements MVC Takes advantage of the lessons learned from Struts Classic to present a cleaner implementation of MVC New Features Interceptors Annotation-based Configuration and more… Other Web Application Frameworks Stripes Cocoon Echo Nacho Spring MVC JBanana WebWork (now Struts 2) many others… What is a Web Application Framework? A web application framework is a piece of structural software that provides automation of common tasks of the domain as well as a builtin architectural solution that can be easily inherited by applications implemented on the framework. Common Tasks of the Web Application Binding Request Parameters to Java Types Validating Data Making calls to business logic Making calls to the data layer Rendering presentation layer (HTML, …) Providing internationalization and localization Struts 2 Project Keep Presentation Layer Separate from Data Layer Model-View-Controller Architecture Model (Struts 2: action) • Represents the Data Objects View (Struts 2: result) • Screen representation of the Model Controller (Struts 2: FilterDispatcher) • How the user interface reacts to the user’s input Advantages of MVC Reliability High Reuse and Adaptability Low Development Costs Rapid Deployment Maintainability MVC Architecture Goals View Controller Model Applying MVC to Web Applications View: HTML form; native Java interface; client-side script; applet Controller: Java servlet; session Bean Model: Entity Bean or other business logic object Interchangeable Elements View: HTML form becomes touch-screen Controller: JSP becomes session bean Model: Entity Bean MVC and GUIs Views and Controllers closely interact (HTML/JSP) If HTML code is written out entirely through JSP, the Controller and View (conceptually) merge A Controller-View pair works with one Model One Model may have multiple Controller-View pairs MVC Advantages Single point of entry to Model object Multiple-client support Design clarity Modularity Controlled growth Portable Struts 2 and MVC To support MVC, struts uses: JSPs Custom JSP Tags Java Servlets POJOs for Actions Struts 2 and MVC View request FilterDispatcher (Controller) Struts 2 and MVC Controller - FilterDispatcher Front Controller pattern Maps Requests to Actions Servlet Filter that inspects each incoming request to determine which Struts 2 action should handle the request. Struts 2 and MVC FilterDispatcher (Controller) Action 1 Action 2 ActionInvocation Action 3 Action 4 Struts 2 and MVC Action 1 Action 2 Models Action 3 Action 4 Struts 2 and MVC Action 1 Action 2 ActionInvocation Action 3 Action 4 Struts 2 and MVC View ActionInvocation Struts 2 and MVC The Struts 2 solution to implementing MVC View – JSP Page, Velocity, XSLT, RIA, AJAX Controller – FilterDispatcher in conjunction with user-defined Action classes Model – Action classes is a locus of data transfer, a single unit of work that conducts calls to the business logic Designing Web Applications High Level Architecture Presentation Layer Control Layer Application Logic Data Sources Architectural Approaches Page-centric Design Model 1 Control and application Logic handled by JSP Servlet-centric Design Model 2 Intermediate servlet ( or servlets ) manage control and application logic Page-Centric Design Series of interrelated JSP pages JSP page Perform request processing Communicate with back-end data sources Generate dynamic content elements Page-centric Program Flow Role-based Pages Options.jsp Query.jsp Data Sources Display.jsp Simple page-centric application Password.htm <HTML> <BODY> <form action="PasswordGen.jsp" method="POST"> <H3>Welcome to the Password Generator</H3> First Name: <input type="text" name="firstName"><br> Last Name: <input type="text" name="lastName"><br> <p> <input type="submit" value="Generate Password"> </form> </BODY> </HTML> Simple page-centric application PasswordGen.jsp Simple page-centric application <html> <body> <% String firstName = request.getParameter("firstName"); String lastName = request. getParameter("lastName"); String password; if( (firstName.length()>=2) && (lastName.length()>=2)) password = lastName.substring(0,2)+firstName.substring(0,2); else password = "NoGo"; %> <h1> Password Generated! </h1> Your super secret password is <%= password %>. <br><a href="Password.htm">To generate another password.</a> </body> </html> Simple page-centric application Page-centric Strategy Page-centric approach Benefits Very little abstraction Few components Minimum of layers Page-centric approach Limitations Maintainability Flow Control Servlet-centric Design Servlet handles control and application logic Requests are routed to the JSP pages via the servlet Servlet can perform the following: Execution of specific business actions on behalf of a JSP Deliver data to a JSP Control flow among JSP pages Command Pattern Encapsulate each command our servlet can handle into its own class String cmd = req.getParameter(“cmd”); if (cmd.equals(“buy”)) { BuyCmd bcmd = new BuyCmd(); bcmd.buy(); } if (cmd.equals(“sell”)) { SellCmd scmd = new SellCmd(); scmd.sell(); } Servlet-centric Program Flow Client Servlet JSP Data Sources Simple Servlet-centric application Password.htm <HTML> <BODY> <form action="/webapp/passwordservlet" method="POST"> <H3>Welcome to the Password Generator</H3> First Name: <input type="text" name="firstName"><br> Last Name: <input type="text" name="lastName"><br> <p> <input type="submit" value="Generate Password"> </form> </BODY> </HTML> passwordServlet.java Simple Servlet-centric application public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { GenBean gb = new GenBean(); gb.setFirstName(request.getParameter("firstName")); gb.setLastName(request.getParameter("lastName")); gb.generate(); request.setAttribute("gen", gb); RequestDispatcher rd = getServletContext().getRequestDispatcher("/PasswordGen.j sp"); rd.forward(request, response); } GenBean.java public class GenBean { private String firstName; private String lastName; private String password = "NoGo"; Simple Servlet-centric application public String getFirstName(){return firstName;} public void setFirstName(String fn){ firstName = fn;} public String getLastName(){return lastName;} public void setLastName(String ln){ lastName = ln;} public String getPassword(){return password;} public String generate() { if( (firstName.length() >= 2) && (lastName.length() >= 2)) password = lastName.substring(0,2) + firstName.substring(0,2); return password; } } PasswordGen.jsp Simple Servlet-centric application <html> <body> <jsp:useBean id = "gen" class = “genpackage.GenBean" scope="request"/> <h1> Password Generated! </h1> Your super secret password is <jsp:getProperty name="gen" property="password"/> <br><a href="Password.htm">To generate another password.</a> </body> </html> Interactive Interfaces using JSP Creating Web-based applications that exhibit behavior of desktop programs Must address the stateless nature of Web pages and Form elements Sticky Widgets Validation Dynamically Generated HTML Use HTML form elements in Web applications State is encoded into the HTML typically as value attributes or the checked keyword To maintain state Cookies with JavaScript Dynamically generated HTML with JSP • Create a JSP that combines the form and results on the same page • Use with Model 1 approach Sticky Widget Example: Text Fields Text Field state is defined in the value attribute <input type=“text” name=“desc” value=“<%= getParam(request, “desc”) %>”> public String getParam(HttpServletRequest req, String param) { if (req.getParameter(param) == null) return “”; else return req.getParameter(param); } Sticky Widget Example: Radio Buttons Radio Button state is defined by the checked keyword <input type=“radio” name=“binary” value=“yes” <%= isChecked(request,“binary”,“yes”) %>>Yes<br> <input type=“radio” name=“binary” value=“no” <%= isChecked(request,“binary”,“no”) %>>No<br> public String isChecked(HttpServletRequest req, String param, String testValue) { return testValue.equals(req.getParameter(param)) ? “checked” : “”; } Validating Form Data Client-Side Performed with JavaScript User is prohibited from submitting form until validated Server-Side Request data not guaranteed to come from browser Use JSP sticky widgets to maintain state in case of input error Performance not as good Form Bean More streamlined technique for communicating the state of form data within a specific request Allows for Model 2 approach public class FormBean { private String name; public void setName(String nm) { name = nm; } public String getName() { return name; } … } Review Introduction to Struts Model-View-Controller Architecture Struts and MVC Architecting Web Applications Page-centric Design Servlet-centric Design JSP Interactive Interfaces FormBean