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