Java Server Faces

Z FI WIKI
Přejít na: navigace, hledání


Úvod

Java Server Faces je rámec postavený přímo na Servlet API. Může používat JSP, ale nemusí. Pokud používá JSP, jsou k dispozici dvě knihovny JSP značek.

Stránky jsou skládány z komponent. Jedna komponenta může mít více různých rendererů, např. pro HTML, pro XHTML, pro WAP/WML, nebo i různé varianty v rámci HTML. Standardně je k dispozici základní sada komponent a renderery do HTML.

Např. komponenta UICommand se může zobrazit

  • jako hyperlink pomocí značky <h:commandLink>
  • jako tlačítko pomocí značky <h:commandButton>

Nevýhodou implementací JSF je, že renderery pro HTML si často vypomáhají JavaScriptem, a aplikace tak nebudou fungovat v prohlížečích, které mají JavaScript vypnutý.

Implementace JSF má předpřipravené komponenty pro běžné prvky - hyperlinky, tlačítka, editovatelná pole, výběry se seznamů, zobrazení seznamu chyb atd.

Konfigurace JSF aplikace

Celá JSF aplikace se konfiguruje pomocí souboru /WEB-INF/faces-config.xml.

Stav komponent a stránek se pamatuje pomocí tzv. managed JavaBeans, které se musí popsat v konfiguračním souboru. K jejich properties se pak dá přistupovat pomocí výrazů jazyka EL.

 
 //faces-config.xml
 <managed-bean>
    <description>
      The backing bean that backs up the guessNumber Web application
    </description>
    <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>
    <managed-property>
      <property-name>maximum</property-name>
      <property-class>long</property-class>
      <value>10</value>
    </managed-property>
  </managed-bean>

Ve verzi JavaEE 5.0 byl sjednocen JSTL EL a JSF EL do jednoho Unified EL jazyka:

  • výrazy ${neco} označují výrazy pro čtení
  • výrazy #{neco} označují výrazy, které umožňují i zápis, volání metod a odložené vyhodnocování výrazů

K vše uvedenému managed JavaBeanu můžete tedy přistupovat např. pomocí

 
 <%@ page contentType="text/html; charset=utf-8" %>
 <%@ taglib uri="http://java.sun.com/jsf/html" prefix="h" %>
 <%@ taglib uri="http://java.sun.com/jsf/core" prefix="f" %>
 <body bgcolor="white">
    <f:view>
            <h:form id="mujForm" >
                max: <h:outputText value="#{UserNumberBean.maximum}"/> <br>
                min: <h:outputText value="#{UserNumberBean.minimum}"/> <br>
                Novy max: <h:inputText id="newMax" value="#{UserNumberBean.maximum}" > </h:inputText><br>
                Novy min: <h:inputText id="newMin" value="#{UserNumberBean.minimum}" > </h:inputText><br>
                <h:commandButton id="submit" action="success" value="Submit" />
            </h:form>
        </f:view>
 </body>

Data jsou ve dvou formách - ve tvaru pro model, např. integer, a ve tvaru pro prezentaci, typicky řetězce. JSF zajišťuje konverze mezi těmito dvěma tvary.

Navigace

Navigace mezi stránkami se konfiguruje opět ve /WEB-INF/faces-config.xml.

 
 <navigation-rule>
    <from-view-id>/moje.jsp</from-view-id>
    <navigation-case>
      <from-outcome>dobre</from-outcome>
      <to-view-id>/dobre.jsp</to-view-id>
    </navigation-case>
    <navigation-case>
      <from-outcome>spatne</from-outcome>
      <to-view-id>/spatne.jsp</to-view-id>
    </navigation-case>
 </navigation-rule>

Ve stránce pak lze specifikovat, že výstup z akce poskytuje určité metoda:

<h:commandButton id="submit" action="#{mujManagedBean.jakDopadlo}" value="Submit" />

a metoda musí vracet jeden z očekávaných řetězců:

 
    public String jakDopadlo() {
        if(...) return "dobre";
        else return "spatne";
    }

Životní cyklus stránky

Zpracování JSF stránky je komplikovanější než JSP stránky samotné. Viz obrázek.

JsfIntro-lifecycle.gif

Rozlišují se dva druhy volání:

  • initial requests - při prvním zobrazené stránky, provádí se pouze restore view and render response fáze
  • postbacks - uživatel odeslal formulář na stránce, aktivují se všechny fáze.