390 likes | 497 Views
Case Study: The Design of a JSP Framework. By Michael Alford malford@orbitz.com March 29, 2001. Acknowledgments. Xqsite, Inc. Zak Jacobson John Koszarek Nick.Vujasin Greg Skudlarick Orbitz LLC. Web Development. Forces. Quick and easy development Simple to maintain High performance.
E N D
Case Study: The Design of a JSP Framework By Michael Alford malford@orbitz.com March 29, 2001
Acknowledgments • Xqsite, Inc. • Zak Jacobson • John Koszarek • Nick.Vujasin • Greg Skudlarick • Orbitz LLC
Forces • Quick and easy development • Simple to maintain • High performance
Quick and Easy Development • Just get the damn thing out the door! • Engineers vary widely in skill/experience. • Make common case very simple. • Make difficult stuff easy to plug in. • Mismatch: Graphic artists work visually, while engineers work with code. • Reuse previously written code.
Simple to Maintain • Low complexity. • Easily extensible with use of patterns. • Easily configurable. • Straightforward to debug & monitor. • Judicious logging. • Don’t impair app server tools.
High Performance • Instantiate as few objects as possible. • Cache reusable objects. • Avoid Java reflection. • Minimize synchronization. • Minimize indirection. • Minimize dynamic content.
Custom Tags • <html:iterate collection=“aList” > <html:valueOf obj=“anObject” /> • </html:iterate/> • Tag Handler • Java code • Evaluates custom tags • Properties • pageContext • parent tag
Benefits of Custom Tags • Eliminate Java code from HTML. • Greater separation of content from presentation. • Promote consistency across site. • Reusable within context of a website.
Liabilities of Custom Tags • Designers cannot work visually. • Inefficient iterative back-and-forth between designer and developer. • Custom modules for visual tool? • Closely tied to HTML, limiting reusability. • Lower performance versus embedded code. • No industry standard set of tags.
Benefits of MVC • Multiple views of same model. • Pluggable views and controllers. • Separation of development tasks. • Reuse potential. • Frameworks potential.
Liabilities of MVC • Increased complexity. • Close coupling between view & controller. • Close coupling of views & controllers to a model. • Difficulty of using MVC with some web development tools.
Document-View • Combine View and Controller • MVC variant • Java Swing’s UIDelegate
Xqsite Page Architecture Core Classes
Design Goals • Fast to develop for the common tasks. • Even at the cost of flexibility. • Most of a website is specific to a project. • Simple. • Pluggable services for the hard stuff. • JSP 1.0.
Page • Container of Fields • Mediator between View and Business Layer • The “use bean” tag in JSP is simple and easy to use.
Page Benefits • Standardizes development team on a common design. • Automates validation and formatting of various types of data. • Automates required field handling. • Extensible - add new field types or services without modifying existing architecture. • Provides file uploading services. • Easily configurable page-specific, field-specific, and locale-specific error messages; can even use a properties file.
Page: Init & Control • <jsp:useBean id="pageObject" • scope="request" • class="yourPageSubclass"> • pageObject.onLoad(pageContext); • </jsp:useBean> • onLoad • Calls initFields • Calls business layer depending on whether this is first view or a submission of form data.
Page: Example OnLoad With Validation • public void onLoad(PageContext pageContext) throws Exception { • super.onLoad(pageContext); • // Check if submit button was pressed • if (isButtonSelected("createAccount")) { • // Process the state when createAccount is clicked • if (isFormValid()) { • // call business objects here • } • } • if (isButtonSelected("cancel")) { • // Process the state when cancel is clicked • redirect("/location/of/maybe/the/previous/page"); • } • else { • // User’s initial visit or reload of page • // Typically do nothing here • } • }
Submit form back to JSP • <form name=“myForm" action="<%= request.getServletPath() %>" method="POST">
Page: Buttons • Radio buttons • <input type="radio" name="salutation" value="mrs" <%= page.getButtonSelected("salutation", "mrs") %>> • Checkboxes • <input type="checkbox" name=“factor" value="10" <%= page.getButtonSelected(“factor", "10") %>>
Page: Text Field and Error Messages • String getErrorMessage(String key, String fieldName) • String getRequiredMessage(String fieldName) • JSP: • <input type="text" name=“lastName" size="20" maxlength="40" value='<%= page.getFieldValue(“lastName") %>' required="true"> • <%=page.getErrorMessage(page.MESSAGE_FIELD_MISSING, “lastName")%>
Field Abstract Class • abstract void validate(); • boolean isRequired(); • boolean isValid(); • read/write properties: • Name • Description • Value • Invalid and Missing Messages
Field Subclasses • ButtonField • DateField • NumericField • SelectField • TextField
Xqsite Page Architecture Minimizing the Designer/Engineer Conflict
PageGenerator • Uses the HTML Parser sunlabs.brazil.handler.HtmlRewriter • For every HTML page, creates a subclass of Page. • For every HTML input field, adds a Field to the Page subclass. • Stubs out the onLoad method of Page subclass. • Creates JSP with most of the necessary code to access the Page.
HTML Layer Requirements • Each input field must be named uniquely. • Add a fieldType attribute to those fields that need to be specified less generically. • Will not adversely affect visual HTML editors. • Example: HTML Text field may have a fieldType attribute of DateField. • Add a required attribute for those fields that the user is required to enter.
Xqsite Page Architecture Service Delegation
Interceptor Pattern • “Allows services to be added transparently to a framework and triggered automatically when certain events occur.” • Services are defined in a config file, and registered upon app startup. • Page class onLoad acts as central dispatcher, passing a Context object to services.
Context control • Context object provides accessors for services to retrieve state information. • Context object provides mutators so that services may modify request. • Example: Authorization service forwards user to a login page by setting target on Context object.
Possible Services • File upload • Configuration • Authorization/Authentication • Throttling • Logging • 3rd-Party Integration
Adopt Custom Tags • All Field subclasses can be made into custom tag handlers. • PageGenerator creates a JSP of custom tags instead of embedded Java code.
Adopt MVC • Eliminate Page in favor of FrontController • Make FrontController a Interceptor dispatcher. • If using Struts, PageGenerator can create an ActionForm.
Other Java-based Web Frameworks • Struts • WebMacro and Velocity • HyperQbs • Janx • WebWork • Cocoon (XSP) • Resin (XTP) • Brazil
References Crupi, Malks, Alur, Core J2EE Patterns, or http://developer.java.sun.com/developer/technicalArticles/J2EE/patterns/ Gamma, et al.,(aka Gang of Four), Design Patterns Buschmann, et al., Pattern-Oriented Software Architecture; A System of Patterns Schmidt, et al., Pattern-Oriented Software Architecture; Patterns for Concurrent and Networked Objects Struts Framework, http://jakarta.apache.org/struts