eCommerce Struts
Transcrição
eCommerce Struts
Jakarta Struts Webanwendungen mit dem Jakarta Struts Framework entwickeln Prof. Dr. Nikolaus Wulff Agenda • • • • • Struts Architektur Übersicht Struts in den BookStore einbinden Struts Taglibs Konfigurationsdateien Notwendige Migrationsschritte Prof. Dr. Nikolaus Wulff Struts 2 Metamorphose • BookStore Servlet zentriert – Java Bean als Model – Servlet als Controller – Servlet erzeugt den HTML Output • Servlet & JSP MVC II Pattern – Servlet als Controller – einzelne JSPs zum Erzeugen der View • Dynamisches Layout mit generischen JSPs • Struts Framework – Action Command Objekte als Controller – JSP und Struts Tiles für das Layout der View Prof. Dr. Nikolaus Wulff Struts 3 Jakarta Struts • Struts ist eines der Apache Projekte seit 1999. • Struts ist ein offenes erweiterbare Framework basierend auf dem Model-View-Controller Muster. • Struts stellt einen erweiterbaren Controller mit einem parametrisierbaren RequestProcessor zur Verfügung. • Als Modell können alle Java Technologien wie POJOs, JDBC oder EJBs eingesetzt werden. • Als View eignen sich JSP mit JSTL oder JSF und XSLT sowie viele weitere Frameworks... • Struts wird zunehmend im kommerziellen Bereich von Herstellen wie IBM und BEA eingesetzt => Webportale Prof. Dr. Nikolaus Wulff Struts 4 Struts Kernidee • Der Page-Control-Flow der Web-Site wird von Struts intern als Statemachine modelliert. • Statusübergänge werden vom Benutzer durch entsprechende Eingaben ausgelöst. • Eingaben werden vom ActionValidator validiert. • Nach dem Command Pattern wird die execute Methode eines Action Objekts ausgeführt. • Dieses gibt je nach Ausgang der Aktion ein ActionForward Objekt zurück, das vom ActionServlet anschließend als View gerufen wird. Prof. Dr. Nikolaus Wulff Struts 5 Bookstore Pageflow Find Dialog Show Booklist Book Details anonymous Help Index admin Add Book Prof. Dr. Nikolaus Wulff user Logon Shopping Cart Struts 6 Pageflow als Statemachine • Dieser einfache Pageflow wird von Struts via einer externen struts-config.xml Datei verwaltet. • Ausgelöst durch Benutzereingaben lösen Action Command Objekte Statusübergänge aus, die entsprechende ForwardMappings parametrisieren. • Der Status selber muss in entsprechenden Modellklassen oder der HttpSession hinterlegt werden. • Eventuelle Validierung der Eingaben vor dem Auslösen der Actions kann deklariert werden. Prof. Dr. Nikolaus Wulff Struts 7 Login Sequence Diagramm Application defined : Request Processor loginForm : ActionForm loginAction : Action map : Action Mapping nextPage : ActionForward validate( ) execute( ) findForward select Prof. Dr. Nikolaus Wulff Struts 8 Bookstore Layout Layout Control Tiles.xm l ActionServlet (from org.apache.struts.action) Header ShopLayout BookStoreServlet (from bookstore) forward ActionForward Navigation Pageflow Book Store-Struts.xml (from org.apache.struts.action) <<link>> content cmd Footer ActionMapping (from org.apache.struts.action) findForward() View Prof. Dr. Nikolaus Wulff Struts 9 Servlet Architektur HttpServlet (from ja v ax. ser vl et.http) doPost & doGet forward to doService BookStoreServlet doService dispatches depending on task to doFind, doHelp, ... init() doGet() doPost() doService() doAddBook() doFind() doFindAll() doHelp() init initializes BookStore at Startup -bookS tore BookStore (from de.bookstore .db) database will be handeled by BookStore • Das BookStoreServlet bildet die Controller Instanz für den Webzugriff und erzeugt die HTML Views. • Die BookStore Beanklasse kapselt die JDBC Verbindung zur Datenbank. Prof. Dr. Nikolaus Wulff eCommerce 10 MVC II Architektur Controller BookStore <<Controller>> BookStoreServlet -bookStore forward/include (from de.bookstor e.db) <<creates>> find/store Fi ndDial og Book displays View (from de.bookstore.db) Model • Anstatt alle HTML Seiten per PrintWriter selbst zu erzeugen, kann das BookStoreServlet die Ausgabe an eine oder mehrere JSP/Html Seiten delegieren. Prof. Dr. Nikolaus Wulff eCommerce 11 Struts Architektur HttpServletRequest HttpServlet (from j av ax.serv let.http) HttpServletResponse (from (from j av ax.serv let.http) ActionServlet 0..1 HttpSession RequestProcessor (from proc essXXX() <<create>> <<create>> ActionForm ActionErrors Action uses validate() execute() <<create>> <<returns>> 0..* ActionMessage ActionMapping key <<link>> ActionForward findForward() ActionError Prof. Dr. Nikolaus Wulff Controller defined in struts.xml Struts 12 Command Validierung public M essageErrors validate(...) { return doValidate(...); } public ActionForward execute(...) { return doExecute(...); } Action actions ActionForm (from forms (from uses execute() validate() BookStore (from book store ) BookStoreBaseAction BookStoreBaseForm (from actions) (from forms) <<abstract>> doExecute() LoginAction <<abstract>> doValidate() LoginForm FindBookAction Fi ndBookForm Show BookActi on Prof. Dr. Nikolaus Wulff ShowBookForm Struts 13 web.xml (1) <web-app> <servlet> <servlet-name>BookStore</servlet-name> <servlet-class>servlet.StrutsBookStore</servlet-class> <init-param> <!-- Settings for the JDBC connection --> <param-name>driver</param-name> <param-value>org.gjt.mm.mysql.Driver</param-value> </init-param> <init-param> <!-- Struts related stuff --> <param-name>config</param-name> <param-value>/WEB-INF/struts-config.xml</param-value> </init-param> </servlet> <servlet-mapping> <servlet-name>BookStore</servlet-name> <url-pattern>*.cmd</url-pattern> </servlet-mapping> <welcome-file-list> <welcome-file>/index.html</welcome-file> </welcome-file-list> Prof. Dr. Nikolaus Wulff Struts 14 web.xml (2) <web-app> <!-- JSTL Tag Library Descriptor --> <taglib> <taglib-uri>http://java.sun.com/jstl/core</taglib-uri> <taglib-location>/WEB-INF/tld/c.tld</taglib-location> </taglib> ... <!-- Struts Tag Library Descriptors --> <taglib> <taglib-uri>/struts-bean</taglib-uri> <taglib-location>/WEB-INF/tld/struts-bean.tld </taglib-location> </taglib> ... </web-app> Prof. Dr. Nikolaus Wulff Struts 15 struts-config.xml (1) <struts-config> <!-- ============== Form Bean Definitions ================= --> <form-beans> <form-bean name="addToCartForm" type="forms.AddToCartForm"/> ... </form-beans> <!-- ============== Action Mapping Definitions ============ --> <action-mappings> <action path="/addToCard" <!-- == addToCard.cmd --> type="actions.AddToCartAction" name="addToCartForm" validate="true" > <forward name="nologin" path="/login.cmd" /> <forward name="success" path="/showCart.cmd" /> <forward name="failure" path="/message.cmd" /> </action> ... </action-mappings> Prof. Dr. Nikolaus Wulff Struts 16 Action Exit public ActionForward doExecute(ActionMapping mapping, ActionForm form,HttpServletRequest request, HttpServletResponse response) throws Exception { if (!isLogin(request)) { return mapping.findForward("nologin"); } long id = ((AddToCartForm)form).getId(); Iterator books = getBookStore().findById(id).iterator(); Book book = null; if (books.hasNext()) { book = (Book) books.next(); } if(book == null) { return mapping.findForward("failure"); } Collection shoppingCard = getShoppingCard(request); if (!shoppingCard.contains(book)) { shoppingCard.add(book); } return mapping.findForward("success"); } Prof. Dr. Nikolaus Wulff Struts 17 struts-config.xml (2): Struts Tiles <!-- ============== Tiles plugin ============================ --> <plug-in className="org.apache.struts.tiles.TilesPlugin" > <!-- Path to XML definition file --> <set-property property="definitions-config" value="/WEB-INF/tiles-defs.xml" /> <!-- Set Module-awareness to true --> <set-property property="moduleAware" value="true" /> </plug-in> • Der BookStore verwendet das Struts Tiles PlugIn zum Layout der JSP Seiten a la Portlets. Prof. Dr. Nikolaus Wulff Struts 18 tiles-defs.xml <tiles-definitions> <definition name=".mainLayout" path="/jsp/BookStoreLayout.jsp"> <put name="title" value="BookStore" /> <put name="header" value="/jsp/Header.jsp" /> <put name="navigation" value="/jsp/Navigation.jsp" /> <put name="footer" value="/jsp/Footer.jsp" /> <put name="content" value="/jsp/Empty.jsp" /> </definition> <definition name="EmptyContent" extends=".mainLayout"> </definition> <definition name="LoginContent" extends=".mainLayout"> <put name="title" value="BookStore Login" /> <put name="content" value="/jsp/Logon.jsp" /> </definition> Prof. Dr. Nikolaus Wulff Struts 19 BookStoreLayout mit Tiles <%@ page language="java" errorPage="/error.jsp" %> <%@ taglib uri="/struts-tiles" prefix="tiles" %> <html> <head> <title><tiles:getAsString name="title"/></title> <link rel='stylesheet' type='text/css' href='BookStore.css' /> <script src='BookStore.js' type='text/javascript'> </script> </head> <body> <table border="0" width="100%" heigth="100%"> <tr><td colspan="2"> <tiles:insert attribute="header" /> </td> </tr> <tr> <td width="20%"><div class='navigation'> <tiles:insert attribute="navigation" /> </div></td> <td width="80%"><div class='content'> <tiles:insert attribute="content" /> </div></td> </tr> <tr> Prof. Dr. Nikolaus Wulff Struts 20 Migrationsschritte • web.xml anpassen – URL: *.cmd – include: Struts config und Taglibs • struts-config.xml erstellen/anpassen – bean/action Paare beschreiben – success/failure Forward links definieren • tiles-def.xml erstellen/anpassen – generisches Layout beschreiben – links aus struts-config.xml deklarieren • Refactor BookstoreServlet – Methoden sukzessive aufsplitten in Actions und Forms • JSTL Tags gegen Struts Tags austauschen Prof. Dr. Nikolaus Wulff Struts 21