Upload
fola
View
36
Download
1
Embed Size (px)
DESCRIPTION
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. - PowerPoint PPT Presentation
Citation preview
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