JavaServer Faces

Z Multimediaexpo.cz

Broom icon.png Tento článek potřebuje úpravy. Můžete Multimediaexpo.cz pomoci tím, že ho vylepšíte.
Jak by měly články vypadat, popisují stránky Vzhled a styl a Encyklopedický styl.
Broom icon.png

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 čiště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).

Obsah

Ú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 specíálních XML značek, kterým se specifikují odkazy na Java beans uložené v aplikačním serveru.

Uživatelské rozhraní - GUI

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 (i když ne nejlepší) 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í (viz 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 nakofigurujete 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>

Uvědomte si, že beany běží na serveru, ne u uživatele. Uživatel 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 uvádíte, místo odkazů na nějaké JSF soubory, akce. Výstup této akce (textový klíč) je potom použit k rozpoznání na jaký pohled přejít. Opět můžete 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ě se 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í (tj. podle toho jestli jsem vyhrál) se rozhodne, kam se přesunu.

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 třídu Tag - která zpracuje Vámi 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.

JSF cyklus - JSF Lifecycle

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 4 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.
  • 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 naší 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