Gwiazdka nieaktywnaGwiazdka nieaktywnaGwiazdka nieaktywnaGwiazdka nieaktywnaGwiazdka nieaktywna
 

JavaServer Faces można pobrać ze strony projektu http://javaserverfaces.java.net/, obecnie udostępniono również wersję JSF 2.0. Przy tworzeniu formularzy, tabel czy szkieletu strony można posłużyć się znacznikami JSF. Framework zamienia znaczniki JSF na zwykły HTML i przekazuje do przeglądarki. Znajomość języka HTML (strona specyfikacji HTML5) przydaje się między innym, przy przeglądaniu źródła strony wygenerowanego przez framework.

Jednak nie wszystkie czynności można wykonać za pomocą znaczników, wtedy znajomość technologii JSP (lista książek poświęconych technologii JSP) oraz języka HTML (lista książek poświęconych technologii HTML i XHTML) jest bardzo przydatna. Wszystkie te technologie uzupełniają się nawzajem. Jedną z wielu zalet technologii JSF 1.2 jest dołączenie do specyfikacji Java EE 5. Dzięki temu kompletne serwery aplikacji np. GlassFish (http://glassfish.java.net/), JBoss Web Server (http://www.jboss.org/jbossweb), Oracle WebLogic Serwer (http://www.oracle.com/technetwork/middleware/weblogic/overview/index.html) mają opisywaną technologię wbudowaną. Podczas pisania artykułu korzystano z serwera Tomcat (http://tomcat.apache.org/), przez co framework JSF 1.2 musi zostać dołączony do projektu. Katalog WEB-INF\lib powinien zawierać dwa pliki: jsf-api.jar, jsf-impl.jar pobrane ze strony projektu http://javaserverfaces.java.net/.

Do prawidłowego działania projektu w technologii JSF 1.2 (rys. 1.), plik web.xml musi zawierać kod przedstawiony na listingu 1. Znacznik serwlet odpowiada za aktywację serwletu odpowiedzialnego za technologię JSF w momencie żądania strony JSF. Znacznik servlet-mapping umożliwia w adresie strony ustawienie rozszerzenia „.jsf”.

 

Listing 1. Fragment pliku web.xml, konfiguracja JSF 1.2

<servlet>
<servlet-name>Faces Servlet</servlet-name>
<servlet-class>javax.faces.webapp.FacesServlet</servlet-class>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>Faces Servlet</servlet-name>
<url-pattern>*.jsf</url-pattern>
</servlet-mapping>

Rys. 1. Wdrożenie przykładowego projektu w technologii JSF

Rys. 1. Wdrożenie przykładowego projektu w technologii JSF

 

W katalogu META-INF umieszczono plik MANIFEST.MF za pomocą, którego istnieje możliwość poinformowania kontenera o dodatkowych bibliotekach wymaganych przez wdrożoną aplikację (rys. 1.). W technologii JSF dodano plik faces-config.xml, który umieszczono w katalogu WEB-INF. Nazwa pliku xml jest domyślna, jednak można zmienić nazwę na własną tylko należy powiadomić serwer o tej decyzji odpowiednią dyrektywą w pliku web.xml.

Plik faces-config.xml jest odpowiedzialny za (Listing 2):

  • nawigację (znacznik navigation-rule);
  • deklarację komponentów (znacznik manager-bean - zastępuje znacznik jsp:useBean wykorzystywany w technologii JSP);
  • ustawienie również klasy odpowiedzialnej za weryfikację poszczególnych pól tekstowych (znacznik validator);
  • deklarację pakietów przechowujących w jednym pliku wszystkie komunikaty (znacznik application).

 

Listing 2. Przykładowa zawartość pliku faces-config.xml

<managed-bean>
<managed-bean-name>user</managed-bean-name>
<managed-bean-class>pl.wiedzanaplus.LoginUserBean</managed-bean-class>
<managed-bean-scope>session</managed-bean-scope>
</managed-bean>

<navigation-rule>
<from-view-id>/admin/article.jsp</from-view-id>
<navigation-case>
<from-outcome>add_article</from-outcome>
<to-view-id>/admin/add_article.jsp</to-view-id>
<redirect/>
</navigation-case>
</navigation-rule>

<validator>
<validator-id>pl.Validator</validator-id>
<validator-class>pl.Validator</validator-class>
</validator>

<application>
<resource-bundle>
<base-name>pl.wiedzanaplus.messages</base-name>
<var>msgs</var>
</resource-bundle>

</application>

Tworzenie aplikacji w technologii JSF 1.2 wymaga korzystania z szablonu, który jest zgodny ze specyfikacją XML (Listing 3). Zawiera podłączone znaczniki podstawowe i znaczniki HTML. Najważniejszy znacznik, w którym znajduje się cała zawartość strony to f:view. Znacznik h:form, zastępuje znacznik języka HTML form, jednak nie obsługuje metody protokołu HTTP GET. Zaleca się szczegółowe poznanie znaczników w celu uniknięcia błędnego działania aplikacji. Znacznik h:commandLink działa podobnie do znacznika h:commandButton jednak, aby osiągnąć wymaganą funkcjonalność do generowania kodu wykorzystano język JavaScript.

W projekcie wykorzystano standardowe nazwy przedrostków:

  • f – dla znaczników podstawowych technologii JSF;
  • h – dla znaczników generujących kod HTML-a.

 

Listing 3. Przykładowy format plików w technologii JSF
<?xml version="1.0" encoding="utf-8" ?>
<jsp:root xmlns:jsp=http://java.sun.com/JSP/Page xmlns:f=http://java.sun.com/jsf/core xmlns:h="http://java.sun.com/jsf/html" version="2.0">
<jsp:directive.page language="java" contentType="text/html; charset=utf-8" pageEncoding="utf-8" />

<f:view>
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
<title>Szablon</title>
</head>
<body>
<h:form>

</h:form>
</body>
</html>
</f:view>
</jsp:root>

 

Podczas przygotowywania szablonu strony wykorzystuje się CSS i znacznik <div> języka HTML. Do osiągnięcia podobnego efektu za pomocą technologii JSF stworzono znacznik h:panelGroup. Domyślne ustawienie znacznika wygeneruje element span. Po dodaniu atrybutu „layout” z właściwością „block”, zostanie wygenerowany element div. Znacznik h:panelGroup bardzo dobrze sprawdza się przy projektowaniu formularzy i tabel. Przy formularzach można stosować nawigację dynamiczną. Atrybut action przycisku będzie odwoływał się do metody komponentu JavaBeans (Listing 4). Jeśli parametrowi action zostanie przypisana wartość null, program automatycznie odświeży stronę.

 

Listing 4. Uruchomienie nawigacji dynamicznej

<h:commandButton action=”#{user.login}”/>

 

Kiedy kod posiada separator #{..} to znaczy, że odwołuje się do skryptów JSF. Separator ${..} odwołuje się np. do metody komponentu JavaBeans za pomocą konstrukcji JSP. Obiekt user (Listing 5) ustawiono w pliku face-config.xml, w części odpowiedzialnej za deklarację komponentów. Dla każdego komponentu jest ustawiana nazwa, klasa i zasięg. Większość projektów informatycznych do prawidłowego działania potrzebuje z góry ustalonych danych np.: imię, nazwisko, rok urodzenia. Jeśli pole nazwisko jest obowiązkowe a ilość znaków z góry jest ustalona można zastosować znaczniki JSF (Listing 5). Atrybut required z właściwością „true” wymusza na aplikacji sprawdzenie, czy użytkownik wprowadził do pola wymaganą wartość. Jeśli pole nie jest wypełnione, po zatwierdzeniu formularza zostanie wyświetlony komunikat wprowadzony do atrybutu requiredMessage. Miejsce, w którym komunikat będzie wyświetlany jest oznaczone znacznikiem h:message. Znacznik h:inputText i h:message muszą być ze sobą powiązane unikatową nazwą.

 

Listing 5. Weryfikacja danych w polu tekstowym

<h:inputText value="#{user.username}" id="username" required="true" requiredMessage="Tekst komunikatu">
<f:validateLength minimum="1" maximum="100"/>
<f:validator validatorId="pl.Validator" />
</h:inputText>
<h:message for="username" styleClass="errorMessage" />

 

W ciele znacznika h:inputText programista może stosować znaczniki odpowiedzialne za weryfikację wprowadzanych danych np.:

  • f:validateLongRange – znacznik odpowiada za sprawdzenie, czy podano w formularzu liczbę z ustalonego przedziału;
  • f:validateLength – znacznik odpowiada za sprawdzenie czy podano wymaganą ilość znaków;
  • f:validateDoubleRange – znacznik odpowiada za sprawdzenie, czy podano wartość zmiennoprzecinkową z ustalonego przedziału.

Kiedy aplikacja wymaga, aby do pola tekstowego podpiąć klasę odpowiedzialną za weryfikację, programista powinien skorzystać ze specjalnego znacznika f:validator. Klasa przypisana do znacznika jest deklarowana w pliku face-config.xml.

 

Wybrane książki:

Książki Helion