170 likes | 264 Views
Dynamikken i JSF. Hvordan hænger JSF sammen?. I dette kapitel ser vi på hvordan de forskellige dele af JSF hænger sammen og samarbejder på runtime. I løbet af kapitlet gennemgår vi en JSF-applikation. Du kan finde denne applikation i projektet: JSF-Ex-Intro-CustomerApplication.
E N D
Hvordan hænger JSF sammen? • I dette kapitel ser vi på hvordan de forskellige dele af JSF hænger sammen og samarbejder på runtime. • I løbet af kapitlet gennemgår vi en JSF-applikation. Du kan finde denne applikation i projektet: JSF-Ex-Intro-CustomerApplication
Det store overblik JSF-WebApp http-req Faces Servlet faces-config.xml Browser Managed JavaBeans Managed JavaBeans Managed JavaBeans JSP/Facelets med JSF-UI JSF TagLibs Validators http-resp Events Messages Forretningslogik, fx EJB eller Business Delegate
Et eksempel på en JSF-applikation • I det følgende gennemgås en simpel applikation, som simulerer oprettelsen af en kunde. hvis alt går godtender vi her men af og til simulererprogrammet en fejl og vi enderher i stedet
Et eksempel på en JSF-applikation • Applikationen består af følgende elementer • web.xml, som bl.a. registerer FacesServlet • 3 views (implementeret både som Facelets og JSP: createCustomer.xhtml/.jsp, viewCustomer.xhtml/jsp og error.xhtml/.jsp) • en customerBean, som repræsenterer en kunde • en faces-config.xml-fil
Sammenhængen faces-config.xml Controller læser modtager request :FacesServlet tilgår context instantiererpropagerer parametre renderes JSP-sider/ Facelets forwarder JSP-sider/ Facelets :CustomerBean name=”Peter Jensen”... Model View læser
Views – createCustomer.xhtml <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <f:viewcontentType="text/html" xmlns="http://www.w3.org/1999/xhtml" xmlns:ui="http://java.sun.com/jsf/facelets" xmlns:h="http://java.sun.com/jsf/html" xmlns:f="http://java.sun.com/jsf/core"> <html> <head><title>Customer Application</title></head> <body> <h1>JSF (Facelets) Demo</h1> <h2>Create customer</h2> <h:form> <h:outputText value="Name" /> <h:inputText value="#{customerBean.name}" /> <br /> <h:outputText value="Password" /> <h:inputSecret value="#{customerBean.password}" /> <br /> <h:outputText value="Important" /> <h:selectBooleanCheckbox value="#{customerBean.important}" /> <br /> <h:commandButton action="#{customerBean.createCustomer}” value="Create Customer" /> </h:form> </body> </html> </f:view>
Views – createCustomer.jsp • <%@ taglib uri="http://java.sun.com/jsf/html" prefix="h"%> • <%@ taglib uri="http://java.sun.com/jsf/core" prefix="f"%> • <html> • <head><title>Customer Application</title></head> • <body> • <f:view> • <h1>JSF (JSP) Demo</h1> • <h2>Create customer</h2> • <h:form> • <h:outputText value="Name" /> • <h:inputText value="#{customerBean.name}" /> • <br /> • <h:outputText value="Password" /> • <h:inputSecret value="#{customerBean.password}" /> • <br /> • <h:outputText value="Important" /> • <h:selectBooleanCheckbox value="#{customerBean.important}" /> • <br /> • <h:commandButton action="#{customerBean.createCustomer}" • value="Create Customer" /> • </h:form> • </f:view> • </body> • </html>
Views – viewCustomer.xhtml • <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" • "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> • <f:viewcontentType="text/html" xmlns="http://www.w3.org/1999/xhtml" xmlns:ui="http://java.sun.com/jsf/facelets" xmlns:h="http://java.sun.com/jsf/html" xmlns:f="http://java.sun.com/jsf/core"> • <html> • <head><title>Customer Application</title></head> • <body> • <h1>JSF (Facelets) Demo</h1> • <h2>View customer</h2> • <h:outputText value="Name" /> • <h:outputText value="#{customerBean.name}" /> • <br /> • <h:outputText value="Password" /> • <h:outputText value="#{customerBean.password}" /> • <br /> • <h:outputText value="Important" /> • <h:selectBooleanCheckbox value="#{customerBean.important}" /> • <h:outputText value="!!!" rendered="#{customerBean.important}" • style="color: red; font-weight: bold;" /> • </body> • </html> • </f:view>
Views – viewCustomer.jsp • <%@ taglib uri="http://java.sun.com/jsf/html" prefix="h"%> • <%@ taglib uri="http://java.sun.com/jsf/core" prefix="f"%> • <html> • <head><title>Customer Application</title></head> • <body> • <f:view> • <h1>JSF (JSP) Demo</h1> • <h2>View customer</h2> • <h:outputText value="Name" /> • <h:outputText value="#{customerBean.name}" /> • <br /> • <h:outputText value="Password" /> • <h:outputText value="#{customerBean.password}" /> • <br /> • <h:outputText value="Important" /> • <h:selectBooleanCheckbox value="#{customerBean.important}" /> • <h:outputText value="!!!" rendered="#{customerBean.important}" • style="color: red; font-weight: bold;" /> • </f:view> • </body> • </html>
Model - CustomerBean.java • public class CustomerBean { • String password; • String name; • boolean important; • // getters og setters til 'password' og 'important' står her • public String getName() { return name; } • public void setName(String name) {this.name = name;} • public String createCustomer() { • System.out.println("createCustomer() invoked"); • if (Math.random()<0.5) { • return "success"; • } else { • return "failure"; • } • } • } JSF kan automatisk propagere data mellem UI-komponenter og Managed Beans. value-binding <h:inputText id="name" value="#{customerBean.name}"...>
faces-config.xml <?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE ...> <faces-config> <managed-bean> <managed-bean-name>customerBean</managed-bean-name> <managed-bean-class> dk.lundogbendsen.bean.CustomerBean </managed-bean-class> <managed-bean-scope>session</managed-bean-scope> </managed-bean> <navigation-rule> <from-view-id>/pages/createCustomer.xhtml</from-view-id> <navigation-case> <from-outcome>success</from-outcome> <to-view-id>/pages/viewCustomer.xhtml</to-view-id> </navigation-case> <navigation-case> <from-outcome>failure</from-outcome> <to-view-id>/pages/error.xhtml</to-view-id> </navigation-case> </navigation-rule> </faces-config> Faces-config.xml-filen beskriver sammenhængen mellem delelementerne i en JSF-applikation. I dette eksempel: • Managed Beans • Navigationsregler
Actions JSF er eventorienteret i modsætning til ’normale’ Web-applikationer, som er request/response-orienterede. Princippet er, at vi laver en Action-metode (en event-listener) som vi registerer på en knap. Action-metoder vil typisk invokere forretningslogik, fx placeret i EJB’er. package dk.lundogbendsen.bean; public class CustomerBean { .... public StringcreateCustomer() { System.out.println("createCustomer() invoked"); if (Math.random()<0.5) { //simulerer en ret ustabil database;-) return "success"; } else { return "failure"; } } ... <h:commandButton action="#{customerBean.createCustomer}" value="Create Customer" /> En action-metode tager ingen parametre og har String som retur-type. Vi har her valgt at placere den i CustomerBean, men den kunne i princippet være placeret i en hvilken som helst Bean.
Navigation • Action-metoder returnerer en String, der fortæller JSFs navigationssystem, hvilken side der skal forwardes til. I faces-config.xml er String-værdier mappet til Facelets og/eller JSP-sider. package dk.lundogbendsen.bean; public class CustomerBean { .... public StringcreateCustomer() { System.out.println("createCustomer() invoked"); // simulerer en ret ustabil database ;-) if (Math.random()<0.5) { return "success"; } else { return "failure"; } } ... Exadel JSFStudios visualisering af faces-config.xml’s navigationsregler
web.xml web.xml i en JSF-applikation vil altid som minimumregistrere FacesServletten og mappe den til en url, fx *.jsf eller /faces/*.
Overblik over applikationen En JSF-applikation er ’blot’ en almindelig web-applikation, som indeholder en række JSF-jar-filer,bestemte entries i web.xml og xml-filer til konfiguration af applikationen.
1) Et login-skærmbillede Øvelse