280 likes | 417 Views
Java Server Faces. Tomasz Nowak. Konspekt. Historia Wstęp Architektura JSF Składniki aplikacji JSF. Historia. 1. Serwlety 2. JSP 3. Struts. Wstęp. Projekt Sun Microsystems JSF - specyfikacja JSF 1.0 (2004-03-11) JSF 1.2 (2006-05-11) Połączenie Struts i Swinga. Architektura JSF.
E N D
Java Server Faces Tomasz Nowak
Konspekt • Historia • Wstęp • Architektura JSF • Składniki aplikacji JSF
Historia 1. Serwlety 2. JSP 3. Struts
Wstęp • Projekt Sun Microsystems • JSF - specyfikacja • JSF 1.0 (2004-03-11) • JSF 1.2 (2006-05-11) • Połączenie Struts i Swinga
Architektura JSF • API do reprezentacji komponentów, zarządzania stanem, obsługi zdarzeń i walidacji • Biblioteki znaczników do opisu interfejsu użytkownika
Składniki aplikacji JSF • Backing Beans • Strony JSP • Komponenety UI • Pomocnicze klasy po stronie serwera • Walidatory, obsługa zdarzeń oraz obsługa nawigacji • Plik konfiguracji zasobów
Serwlet FacesServlet pełni funkcję kontrolera Pojedynczy punkt wejścia do aplikacji (web.xml) Konfiguracja poprzez plik faces-config.xml Kontroler JSF
Backing Bean • Spełnia reguły JavaBeans • Właściwości i metody związane z komponentami użytkownika • Dodatkowo: - walidacja - obsługa zdarzeń - nawigacja
Backing Bean public class UserNumberBean { Integer randomInt = null; Integer userNumber = null; String response = null; private long maximum = 0; private long minimum = 0; public UserNumberBean() { …} public String getResponse() {…} …
Strona JSF <HTML xmlns="http://www.w3.org/1999/xhtml"xml:lang="en"> <HEAD> <title>Hello</title> </HEAD> <%@ page contentType="application/xhtml+xml" %> <%@ taglib uri="http://java.sun.com/jsf/html" prefix="h" %> <%@ taglib uri="http:.//java.sun.com/jsf/core" prefix="f" %> <body> <f:view> <h:form id="helloForm1"> … </h:form> </f:view> </body> </HTML>
Strona JSF - omowienie <h2> Hi. My name is Lock. I'm thinking of a number from <h:outputText value="#{UserNumberBean.minimum}"/> to <h:outputText value="#{UserNumberBean.maximum}"/>. Can you guess it? </h2>
Strona JSF - omówienie <h:inputText id="userNo" value="#{UserNumberBean.userNumber}" converterMessage="#{ErrMsg.userNoConvert}"> <f:validateLongRange minimum="#{UserNumberBean.minimum}" maximum="#{UserNumberBean.maximum}" /> </h:inputText> <h:commandButton id="submit" action="success" value="Submit" /> … <h:message id="errors1" for="userNo"/>
Walidacja • Walidacja w metodzie BackingBeana • Niejawna walidacja automatyczna (atrybutu REQUIRED) • Predefiniowane walidatory ( f:validateLength, f:validateDoubleRange, f:validateLongRange) • Własne walidatory (implementujące interfejs Validator, rejestrowane w faces-config.xml)
Komunikaty o błędzie Pliki *.properties ApplicationMessages.properties userNoConvert=The value you entered is not a number.
Komunikaty o błędzie (faces-config) <application> <resource-bundle> <base-name> guessNumber.ApplicationMessages </base-name> <var>ErrMsg</var> </resource-bundle> </application>
Komunikaty o błędzie <h:inputText id="userNo" label="User Number" value="#{UserNumberBean.userNumber}" converterMessage="#{ErrMsg.userNoConvert}"> ... </h:inputText>
Nawigacja faces-config.xml <navigation-rule> <from-view-id>/greeting.jsp</from-view-id> <navigation-case> <from-outcome>success</from-outcome> <to-view-id>/response.jsp</to-view-id> </navigation-case> </navigation-rule> greeting.jsp <h:commandButton id="submit" action="success" />
response.jsp response.jsp <h:outputText id="result" value="#{UserNumberBean.response}"/> UserNumberBean.java public String getResponse() { if ((userNumber != null) && (userNumber.compareTo(randomInt) == 0)) return "Yay! You got it!"; else return "Sorry, " + userNumber + " is incorrect.";
Procedury obsługi zdarzeń • ActionListener • ValueChangeListener
ActionListener <h:commandButton actionListener=”#bean.sideEffect}” Immediate=„true”/> public void sideEffect(ActionEvent event) { //np. aktywacja/deaktywacja innych //elementów formularza
ValueChangeListener <h:commandButton value=‘Zaloguj’ disabled=”true”/> <h:selectBooleanCheckbox binding=”#{loginBean.selectBooleanCheckbox1}” id=”selectBooleanCheckbox” valueChangeListener=”loginBean.checkbox1Changed}” onchange=”submit()”/> Public void checkbox1Changed(ValueChangeEvent valueChangeEvent) { if(selectBooleanCheckbox1.isSelected()) commandButton1.setDisabled(false); FacesContext context = FacesContext.getCurrentInstance(); context.renderResponse();
Internacjonalizacja (faces-config) <application> <message-bundle> com.sun.bookstore6.resources.ApplicationMessages </message-bundle> <resource-bundle> <base-name> com.sun.bookstore6.resources.CustomMessages </base-name> <var>customMessages</var> </resource-bundle> <locale-config> <default-locale>en</default-locale> <supported-locale>es</supported-locale> <supported-locale>de</supported-locale> <supported-locale>fr</supported-locale> </locale-config> </application>
Internacjonalizacja <f:loadBundle var=” customMessages” /> String current = event.getComponent().getId(); FacesContext context =FacesContext.getCurrentInstance(); context.getViewRoot() .setLocale((Locale) locales.get(current));
Źródła • http://java.sun.com/javaee/javaserverfaces/ - strona domowa • http://java.sun.com/javaee/5/docs/tutorial/doc/index.html - tutorial • http://wazniak.mimuw.edu.pl/index.php?title=AWWW-1st3.6-w11.tresc-1.0-toc – prezentacja o JSF