Sep 15

JBoss SeamJBoss Seam jest stosunkowo nowym framework’iem, wspomagającym tworzenie aplikacji Web 2.0, który integruje ze sobą takie technologie jak: AJAX, JSF, EJB3, Portlety, BPM i wiele innych. Po przeczytaniu paru artykułów na temat Seam doszedłem do wniosku, że rzecz jest na tyle dla mnie ciekawa, że zastosuje ją w mojej pracy magisterskiej. Abym mógł to zrobić musiałem albo zagłębić się w dokumentację, albo pochłonąć odpowiednią książkę. Kilka miesięcy temu ilość publikacji na temat JBoss Seam w księgarni Amazon.com nie była zachwycająca (o polskich wydawnictwach nawet nie warto wspominać) – wyszukiwanie znalazło dwie książki: Beginning JBoss® Seam: From Novice to Professional oraz JBoss® Seam: Simplicity and Power Beyond Java EE. Po przejrzeniu spisów treści, wybór padł na tę drugą i właśnie JBoss® Seam: Simplicity and Power Beyond Java EE postaram się w tym miejscu pokrótce zrecenzować.

Continue reading »

Feb 01

Dynamiczne ID w komponentach JSF

JS, JSF | autor: Michał Porzożyński 3 Comments »

Twórcy specyfikacji JSF nie przewidzieli (chyba), że zdarzają się aplikacje webowe w których należy wykorzystać formularze dynamiczne, czyli takie w których liczba pól zmienia się w zależności od wcześniejszych poczynań użytkownika. W formularzach takich od czasu do czasu ktoś będzie chciał wykorzystać JavaScript. Znacznik html:inputText w swoim atrybucie id przyjmuje tylko i wyłącznie statyczne stringi.. a więc możemy napisać coś takiego: html:inputText id=”bleble” ale nie możemy już użyć takiej: html:inputText id=”#{bleble}” lub takiej: html:inputText id=”${bleble}” formy zapisu. Jak w takim razie z poziomu funkcji JS dostać się do wartości takiego pola ???

Po kilku ładnych godzinach poszukiwań natrafiłem na projekt javascript4jsf… i problem został rozwiązany :)

  1. Ściągamy bibliotekę i umieszczamy w odpowiednim folderze w naszej aplikacji (lib)
  2. Do pliku faces-config.xml dodajemy:
    <component>
      <component-type>org.j4j.idProxy</component-type>
      <component-class>org.j4j.components.UIIDProxy</component-class>
    </component>
  3. Do strony JSP w której chcemy użyć dodajemy definicje taglib:
    <%@ taglib uri="http://javascript4jsf.dev.java.net/" prefix="j4j" %>
  4. Następnie do ciała znacznika wstawiamy nasz znacznik proxy
    <h:inputText id="firstName" value="#{GetNameBean.firstName}">
      <j4j:idProxy id="firstName_" />
    </h:inputText>
  5. Z poziomu JavaScript odwołujemy się do interesującego nas pola w nastepujący sposób (tutaj przykład uaktywnienia pola)
    <script language="javascript">
      var iid=document.getElementById("firstName_").title;
      document.getElementById(iid).focus();
    </script>

Jak to działa ? Biblioteka J4J wstawia znacznik span, który posiada odpowiednie ID, przed komponent JSF. Wspomnę jeszcze tylko na koniec, że atrybut ID znacznika przyjmuje dynamiczne wartości !

Jan 13

Od pewnego czasu wykonujemy w dwuosobowym zespole projekt w oparciu o Spring, Hibernate i JSF. Po drodze napotykamy dość często na różnego rodzaju problemy. Jednym z nich był dostęp z poziomu klasy implementującej jsf’owy interfejs Validator do zdefiniowanych w kontekście springowym beanów. Początkowo chciałem zadeklarować klasę walidatora w faces-config oraz w applicationContext ale tym sposobem tworzone są dwie niemające nic ze sobą wspólnego instancje interesującej mnie klasy. Drugie rozwiązanie okazało się już lepsze: standardowo korzystamy z org.springframework.web.jsf.DelegatingVariableResolver (którego deklarujemy w faces-config). W metodzie validate(..) natomiast korzystamy z takiej oto mniej więcej linijki w celu dostępu do beana:

ServiceLocator serviceLocator =
  (ServiceLocator) facesContext.getApplication().
    createValueBinding("#{serviceLocator}").getValue(facesContext);

Gdzie ServiceLocator to nazwa klasy a serviceLocator to nazwa springowego bean’a.

Bardzo możliwe, że da się to zrobić w bardziej elegancki sposób za pomocą biblioteki jsf-spring. Niestety projekt ten w tym momencie właściwie nie posiada dokumentacji, a ja nie posiadam czasu na wnioskowanie co i jak z api. Jeśli ktoś używał tego dzieła, proszę o jakieś info.