JavaServer Faces (zkratka JSF) technologie byla vyvinuta společností Sun Microsystems, Inc. Je součástí Java 5 Enterprise Edition. Hlavní myšlenkou je možnost čistějšího vývoje profesionálních Web aplikací. Vývojáři definují uživatelský interface pomocí speciálních XML tagů, kterým jsou předávána data k zobrazení / editaci ze standardních Java beanů. Takto je rozdělena Web aplikace čistě na uživatelské rozhraní (GUI) a aplikační logiku (business logic).
Úvod
Už název technologie napovídá, že tento framework se používá k oddělení definice uživatelského rozhraní (faces) od programování aplikační logiky v jazyce Java. Faces jsou soubory speciálních XML značek, kterým se specifikují odkazy na Java beans uložené v aplikačním serveru.
Uživatelské rozhraní
Při psaní těchto XML souborů se používají speciální XML značky, které se importují z tzv. Tag Library Description (TLD) souborů. Každý TLD soubor je součástí nějaké JavaServer Faces knihovny. Sun Microsystems specifikoval základní knihovnu tagů pro výpis textu, vstup textu, combo box, atd. pro základní použití. Implementaci této základní specifikace můžeme najít např. v aplikačním serveru od Sunu, nebo v rámci projektu MyFaces od Apache Software Foundation, a jinde.
Vzhledem k možnosti používání několika různých JSF knihoven je samozřejmostí vyřešení konfliktů v názvech tagů. Většina knihoven se nedrží pouze specifikace od Sunu, ale přidává mnohá rozšíření. K odlišení tagů se stejným jménem se požívá prefix tagu, kterým si programátor pojmenoval importovanou knihovnu:
<?xml version="1.0" encoding="UTF-8" ?>
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<%@ taglib uri="http://java.sun.com/jsf/html" prefix="h"%>
<%@ taglib uri="http://java.sun.com/jsf/core" prefix="f"%>
<html xmlns="http://www.w3.org/1999/xhtml">
<body>
<f:view>
<h:outputText value="Hello world!" />
</f:view>
</body>
</html>
Tento příklad by vygeneroval klasický „Hello world!“ příklad, tj. HTML GUI, kde je pouze uvedený text. Jako hodnoty pro atribut value se samozřejmě nepoužívají statická data, ale odkazy na dynamicky generovaná data z Java beanů.
<h:outputText value="#{Slovnik.pozdrav}" />
Tento příklad už pracuje sofistikovaněji. JSF framework si vyhledá backing bean se jménem Slovnik a získá hodnotu standardním Java Bean mechanizmem: Slovnik.getPozdrav().
Aplikační logika
Aplikační logika spočívá v konfiguraci Webové aplikace a implementaci backing beanů (standardní Java Beans). Na této úrovni již programátora vůbec nezajímá kdo a jakým způsobem zobrazí informace uživateli, nebo jakým způsobem je od uživatele získá. O toto se stará vrstva uživatelského rozhraní (vizte výše).
Konfigurace JSF je poměrně jednoduchá – stačí vytvořit soubor faces-config.xml v rámci adresáře WEB-INF Vaší Webové aplikace. Zde nakonfigurujete mapování Vašich backing beanů na jména, která budete používat v odkazech na data v definicích GUI, atd.
Příklad faces-config.xml
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE faces-config PUBLIC "-//Sun Microsystems, Inc.//DTD JavaServer Faces Config 1.1//EN" "http://java.sun.com/dtd/web-facesconfig_1_1.dtd">
<faces-config>
<application>
<locale-config>
<default-locale>cs_CZ</default-locale>
<supported-locale>cs_CZ</supported-locale>
<supported-locale>en_US</supported-locale>
</locale-config>
</application>
<managed-bean>
<description>Váš první backing bean</description>
<managed-bean-name>PrvniBean</managed-bean-name>
<managed-bean-class>cele.jmeno.tridy.PrvniBean</managed-bean-class>
<managed-bean-scope>session</managed-bean-scope>
</managed-bean>
</faces-config>
Beany běží na serveru, nikoliv u uživatele. Uživatel tedy nemusí mít vůbec nainstalované Java Runtime Environment. Jediné, co musí mít, je HTML prohlížeč.
Další základní a důležitou funkčností JSF je systém navigace – přechodu z jednoho pohledu na druhý. Tu lze, kromě obvyklých pevných odkazů na další pohled, definovat navigačními pravidly (Navigation Rules). V definici GUI jsou uvedeny, místo odkazů na JSF soubory, akce. Výstup těchto akcí (textový klíč) je potom použit k rozpoznání, na jaký pohled přejít. Opět lze specifikovat specifikovat pevný, statický klíč nebo metodu na backing beanu, která vrací java.lang.String, tedy dynamický klíč v závislosti na provedené akci.
Definice pravidel ve faces-config.xml
<navigation-rule>
<navigation-case>
<from-outcome>vystupAkceA</from-outcome>
<to-view-id>/web/viewA.jsp</to-view-id>
</navigation-case>
<navigation-case>
<from-outcome>vystupAkceB</from-outcome>
<to-view-id>/web/viewB.jsp</to-view-id>
</navigation-case>
</navigation-rule>
Statický příklad
<h:commandLink action="vystupAkceA">
<h:outputText value="Vím kam jdu" />
</h:commandLink>
V tomto příkladě dojde k přesunu vždy na /web/viewA.jsp.
Dynamické rozhodování
<h:commandLink action="#{MujBean.sportkaAction}">
<h:outputText value="Uvidím kam půjdu" />
</h:commandLink>
public class MujBean {
public String sportkaAction() {
if(mamStesti)
return "vystupAkceB";
else
return "vystupAkceA";
}
}
V tomto případě JSF nejdříve zavolá metodu MujBean.sportkaAction a podle toho, jaký klíč tato metoda vrátí se rozhodne, jaká stránka bude zobrazena jako další.
JSF komponenty
Každý JSF tag má interně v rámci dané knihovny přiřazeno několik Java tříd. Soubor těchto tříd se nazývá komponenta. Tato skupina obsahuje Tag – která zpracuje nový napsaný tag a atributy předá Java reprezentaci tagu. Tato reprezentace obstarává aplikační logiku tagu (jako konverzi hodnot na text, volání action metod, validaci a přípravu pro „vykreslení“ informace). O vykreslování se postará třetí třída Renderer. Ta zapíše do výstupu vlastní HTML kód a data z reprezentace tagu.
Cyklus JSF
Celý proces od dotazu uživatelova prohlížeče k přijetí odpovědi (GUI) od serveru, resp. naší aplikace, probíhá v několika fázích:
- HTTP Request je předán Faces Servletu, který spustí vlastní JSF Lifecycle
- RESTORE VIEW fáze obnoví předchozí stav aplikace pro danou session, tj. znovu vytvoří strukturu reprezentující zobrazený pohled. Pokud požadovaný pohled není v session nalezen (např. při prvním zobrazení pohledu), přechází se rovnou na fázi render response, protože nemá smysl projít následujícími čtyřmi kroky.
- APPLY REQUEST VALUES fáze. Vzhledem k tomu, že Webová aplikace je interaktivní, zasílá se na server formulář, který uživatel (třeba i nevědomky) vyplnil. I action metody jsou volány na základě skrytých vstupů, které se nastavují pomocí JavaScriptu v uživatelově prohlížeči při kliknutí. V této fázi Renderer dekóduje relevantní položky z HTTP Request a nastaví komponentu podle uživatelova zásahu.
- PROCESS VALIDATIONS fáze spustí registrované validátory na vstupní data. Při selhání validace se zaregistrují chybová hlášení pro jednotlivé komponenty a současný pohled se vyrenderuje znovu, tedy i s chybovými zprávami. (Tudíž následující dva kroky se přeskočí.)
- UPDATE MODEL VALUES se spustí po úspěšné validaci vstupů. Tato fáze nastaví hodnoty na Java beanech – až teď se dostávají vstupní data do aplikace. Nastavení se děje zase standardním Java Bean mechanizmem, voláním příslušných setterů.
- INVOKE APPLICATION spustí požadované action metody a na základě výstupních klíčů se rozhodne o další navigaci na jiný pohled, nebo se přistoupí k přerenderování současného pohledu s novými daty.
- RENDER RESPONSE zapíše do výstupního proudu HTTP Response vlastní HTML s daty z reprezentace tagu.
- HTTP Response se zobrazí v prohlížeči uživatele.
Externí odkazy