Java Server Faces
description
Transcript of Java Server Faces
Java Server Faces
Tomasz Nowak
Konspekt
1. Historia
2. Wstęp
3. Architektura JSF
4. 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
Przykład – greeting.jsp
Przykład – greeting.jsp
Przykład – response.jsp
Kontroler JSF
• Serwlet FacesServlet pełni funkcję kontrolera• Pojedynczy punkt wejścia do aplikacji (web.xml)• Konfiguracja poprzez plik faces-config.xml
<servlet>
<servlet-name>FacesServlet</servlet-name>
<servlet-class>javax.faces.webapp.FacesServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>FacesServlet</servlet-name>
<url-pattern>/guess/*</url-pattern>
</servlet-mapping>
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() {…}…
Managed-bean (faces-config.xml)<managed-bean>
<managed-bean-name>
UserNumberBean
</managed-bean-name>
<managed-bean-class>
guessNumber.UserNumberBean
</managed-bean-class>
<managed-bean-scope>
session
</managed-bean-scope>
<managed-property>
<property-name>minimum</property-name>
<property-class>long</property-class>
<value>0</value>
</managed-property>
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>
Nawigacjafaces-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.jspresponse.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