180 likes | 319 Views
Java veebitehnoloogiad. Jaak Simm. Kava. Veebirakenduste arendamine (põhiideed) Tehnoloogiad: Tavamudel: servletid ja JSP Struts Templatetehnoloogiad (Velocity) XML ja XSLT Cocoon Kokkuvõte. Hea, kui: Eraldatakse disain, sisu ja loogika Ka äri- ja esitlusloogika
E N D
Java veebitehnoloogiad Jaak Simm
Kava • Veebirakenduste arendamine (põhiideed) • Tehnoloogiad: • Tavamudel: servletid ja JSP • Struts • Templatetehnoloogiad (Velocity) • XML ja XSLT • Cocoon • Kokkuvõte
Hea, kui: Eraldatakse disain, sisu ja loogika Ka äri- ja esitlusloogika Mugav ja läbipaistev andmesisestuse ja veaparandus mudel Kuidas seda teha? Veebirakenduste arendamine • Veebirakenduse eripärad tavalisest: • püsiva seisundi puudumine • request-response • HTML sisaldab nii andmeid kui nende esitamisviisi
JSP import javax.servlet.http.*; import javax.servlet.ServletException; ... public class Lihtne extends HttpServlet { public void doPost(...) { /// sisendite kontrollimine ... /// loogika: bean/andmebaas ... /// väljund: PrintWriter out = response.getWriter(); out.println(“<html>”); ... } } <html> <%@ page language=“java” imports=“veebirakendus.* %> <H1>Tere</H1> <P>Täna on</P> <jsp:useBean id=“clock” class=“calendar.jspCalendar/> <ul><li>Päev:<%= clock.getDayOfMonth() %> <li>Kuu: <%= clock.getYear() %> </ul> <% if (Calendar.getInstance(). get(Calendar.AM_PM)==Calendar.AM){ %> Tere hommikust! <% } else } %>Tere õhtust! <%} %> <%@ include file = “footer.html” %> </html> Lihtsad servletid ja JSP • Lihtne servlet • Kõik küsimused jäetakse arendaja lahendada.
Struts (1) • Veebirakenduste tehnoloogia, põhineb Model-View-Control'l (MVC): • Model’i kiht sisaldab äriloogikat, klassistruktuure ja andmebaasidega suhtlust • View’i kiht määrab, kuidas tulemust esitada. • JSP+taglibraries • Template’d (Velocity, Tiles) • XML+XSL (StrutsCX) • Control’i kiht määrab mida teha (Struts ise). • Tegevuse juhtimine käib Action klasside kaudu. • Sisendi töötlemiseks kasutatakse ActionForm klasse. • action’ite ülesehitus ja seosed(mapping’ud) on defineeritud struts-config.xml’s.
Struts (2) 1) millist action’t teha 2) struts-config.xml’s seotakse actioni vastava ActionjaActionForm klassiga.
<forward name="welcome“ path="/welcome.do"/> <forward name=“logon“ path="/logon.do"/> ... <action path="/welcome" type="veebirakendus.ForwardAction"> <forward name=“destination“ path="/veebirakendus/welcome.jsp"/> </action> <action path=“/logon” ...>...</action> ... public final class ForwardAction extends Action { ... public ActionForward perform (...) { return mapping.findForward("destination"); } } <html><body> Welcome page <html:link forward="logon"> Sign in </html:link> </body></html> Struts (3): näiteke Tuleb päring URL-le “welcome.do” 1. action “welcome” 2. kutsutakse Action klass ForwardAction.perform() 3. welcome.jsp Kutsutav Action klass struts-config.xml view ForwardAction.java welcome.jsp
... <form-bean name="logonForm" type="veebirakendus.LogonForm"/> ... <action path="/logon" type="veebirakendus.ForwardAction" name="logonForm" scope="request" validate="false"> <forward name=“destination“ path="/veebirakendus/logon.jsp"/> </action> ... public final class LogonForm extends ActionForm { private String password = null; private String username = null; ...// get/set meetodid public void reset (...) { setPassword(null); setUsername(null); } public ActionErrors validate (...) { // business logic... if (ok) return null; else return errors; } } Struts (4): näiteke • Formi kuvamine: • actioni jaoks, mis võtab sisendit, määratakse ActionForm bean. ActionFormid on määratud <form-bean>’s Formi nimi Bean (ActionForm) struts-config.xml LogonForm.java
<%@ page language="java" %> <%@ taglib uri="/WEB-INF/struts-bean.tld" prefix="bean" %> <%@ taglib uri="/WEB-INF/struts-html.tld" prefix="html" %> <%@ taglib uri="/WEB-INF/struts-logic.tld" prefix="logic" %> <html> <head> ... </head> <body> <html:errors/> <p>Logige palun sisse!</p> <html:form action="/logonSubmit" focus="username"> Username: <html:text property="username"/><br/> Password: <html:password property="password"/><br/> <html:submit property="submit" value="Submit"/> <html:reset/> </body> </html> Struts (5): näiteke logon.jsp
... <action path="/logonSubmit" type="veebirakendus.LogonAction" name="logonForm" scope="request" validate=“true“ input=“/veebirakendus/logon.jsp”> <forward name=“success" path="/veebirakendus/logged-in.jsp"/> </action> ... Struts (6): näiteke Sisendit ootav action struts-config.xml • Kuna validate=“true”, siis kutsutakse välja ActionFormi validate() meetod: • Kui vigu pole, siis lastakse käima LogonAction.perform() • Kui validate() annab vea, siis minnakse tagasi input atribuudiga määratud aadressi. Antud juhul “/veebirakendus/logon.jsp”, milles saab <html:errors> tagiga vigu kuvada.
Template'd: Velocity (1) • Lihtne keel dünaamilise sisuga HTML-i esitamiseks. • Võimaldab eraldada disaini ja sisu muust. • Järgmised võimalused: • Kuvada objekte, nende meetodeid/välju • Kontrollelemendid (if-else jaloop-id) • Lihtsamad operatsioonid: aritmeetika, oma muutujad • Makrod
public class MinuServlet extends VelocityServlet { ... // kleint on EJB, millel on getName(); Vector petsInStore = getPetsInStore(); ... try { template = getTemplate("templ.vm"); } catch( ResourceNotFoundException rnfe ) { // template'i ei leitud } catch( ParseErrorException pee ) { // süntaksi viga // template'i parsemine ebaõnnestus } catch( Exception e ) {} return template; } <HTML> <BODY> Tere $klient.Name! <table> #foreach( $pet in $petsInStore ) #if ( $customer.hasNotPurchased($pet) ) <tr> <td> $promos.getPromo( $pet ) </td> </tr> #end #end </table> Template'd: Velocity (2) Velocity (templ.vm): • Tulemuseks HTML • Lihtne luua dünaamilist veebi • Kuid sisu ja disain on omavahel segatud Servlet (MinuServlet):
XML ja XSL (1) • Idee: • salvestada XML formaati puhtad andmed, ilma esitlusviisi sisaldamata. • Esitluse määrab ära XSL-i fail, mis kirjeldab, kuidas XML transformeerida HTML-iks (soovikorral mõneks muuks tüübiks) • Sisu ja disain on üksteisest lahutatud ja seega saab neid sõltumatult muuta. • Laialdane rakenduspind.
<?xml version="1.0" encoding="UTF-8"?> <?xml-stylesheet type="text/xsl" href="disain.xsl"?> <leht> <aknake> <pealkiri>Teade</pealkiri> <aknalooja epost="jaaksimm@ut.ee">Jaak Simm</aknalooja> <kuupaev>02.04.2003</kuupaev> <sisu>See siin on väike teade.</sisu> </aknake> </leht> XML ja XSL (2) • Praktikas: • Kasutajale saadetav sisu genereeritakse tavalisel meetodil (nt. Servlet, JSP, Struts jne). • Disain lisatakse viimases faasis. On ka võimalus sisu ja disain kliendile eraldi saata • Näide: sisu.xml
... <xsl:template match="aknake"> <div style="border-width: …;"> <h3><xsl:value-of select="pealkiri"/> </h3> <i>Kuupäev: <xsl:value-of select="kuupäev"/> </i><br/> <i>Akna looja: </i> <xsl:element name="a"> <xsl:attribute name="href"> <xsl:text>mailto:</xsl:text> <xsl:value-of select="aknalooja/@epost"/> </xsl:attribute> <xsl:value-of select="aknalooja"/> </xsl:element> <br/> <p style="color: #black;"> <xsl:value-of select="sisu"/></p> </div> </xsl:template> ... ... <div style="border-width: 1px; border-style:solid; padding: 5px;"> <h3>Teade</h3> <i>Kuupäev: 02.04.2003</i> <br> <i>Akna looja: </i> <a href="mailto:jaaksimm@ut.ee">Jaak Simm</a> <br> <p style="color: #black;"> See siin on väike teade.</p> </div> ... XML ja XSL (3) tulemus.html disain.xsl • Eriti hea juhtudel, kus sisu on eraldi disainist või juba XML kujul. • XML-XSL tehnoloogial on õppimiskõver.
Juhtimine Loogika Disain Sisu Cocoon (1) • XML tehnoloogiatel põhinev veebiarenduse raamistik. • Loogika eraldataksesisust läbi XSPfailide, missisaldavad koodi. • Suhtluse juhtimiseks on Cocoon-s Sitemap ja Action. Idee poolest MVC lähenemine. • Sisaldab ka tag-librareid ja formide mugavat töötlemist.
<page> ... <item/> ... </page> <xsl:stylesheet ...> <template match=“page”> ... <xsp:logic> ...functions... </xsp:logic> </template> <template match=“item”> <xsp:expr> ...function calls... </xsp:expr> </template> </page> <xsp> <xml> <html> <xsl> Cocoon (2) page-xsp.xsl (loogika) page.xml (sisu) disain.xsl (disain) page.html (tulemus)
Kokkuvõte • Java veebitehnoloogiate eelised: • Arenduse protsessi kiirus ja mugavus • Lihtne luua selge struktuuriga rakendusi • Pole vaja jalgrattast uuesti leiutada • Kuid tehnoloogaid on kallid: • Õppimiskõver • Ressursinõudlikkus