Dynamiczne ID w komponentach JSF
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 :)
- Ściągamy bibliotekę i umieszczamy w odpowiednim folderze w naszej aplikacji (lib)
- Do pliku faces-config.xml dodajemy:
<component> <component-type>org.j4j.idProxy</component-type> <component-class>org.j4j.components.UIIDProxy</component-class> </component>
- Do strony JSP w której chcemy użyć dodajemy definicje taglib:
<%@ taglib uri="http://javascript4jsf.dev.java.net/" prefix="j4j" %>
- Następnie do ciała znacznika wstawiamy nasz znacznik proxy
<h:inputText id="firstName" value="#{GetNameBean.firstName}"> <j4j:idProxy id="firstName_" /> </h:inputText> - 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 !



Recent Comments