20 maja 2007

HTML na stronach JSP dla technologii JSF czyli biblioteka HtmlLib

JSF zakłada z goła inny model tworzenia interfejsu użytkownika niż ten znany z technologii takich jak Servlety czy JSP. Co prawda tworząc strony JSF typowo posługujemy się technologią JSP, ale jest to już inne podejście. Tworzenie strony DHTML, bo ostatecznie wszystko się do tego sprowadza, nie ma już być mozolnym rzeźbieniem. JSF to komponenty a JSP jest tylko pewnym sposobem zdefiniowania ich wzajemnego zawierania i atrybutów. Jak to jednak bywa z nowymi pomysłami i technologiami ciężko jest się do nich przyzwyczaić, przestawić swój tok myślenia i zarzucić wszystko to co choć stare i słabe to jednak dobrze znane. Nade wszystko, te nowe technologie miewają także wady, w pewnych zastosowaniach są po prostu gorsze. Ale do rzeczy. Stanąłem dziś przed problemem stworzenia strony JSP dla JSF takiej, która wyświetlałaby obiekt currentItem z zastosowaniem następującego formatowania:

currentItem.name

currentItem.picture

currentItem.description


Stosując stary dobry HTML na starej dobrej stronie JSP użyłbym tabeli. Mogłoby to wyglądać jakoś tak:

<table>
<tr>
<td>
${currentItem.name}
</td>
<td rowspan=”2”>
${currentItem.picture}
</td>
</tr>
<tr>
<td>
${currentItem.description}
</td>
</tr>
</table>

No dobrze, ale my z wielu powodów nie możemy użyć wprost elementów HTML. Przynajmniej nie zawsze. Z chęcią poznam zgrabne rozwiązanie powyższego problemu przy użyciu standardowych komponentów JSF, a póki co zaproponuje co innego. Rozwiązania standardowego nie poszukiwałem długo i wytrwale, bo bardzo szybko znalazłem rozwiązanie polegające na użyciu biblioteki HtmlLib. Mała rzecz a cieszy. Jest to po prostu implementacja HTML dla JSF. Biblioteka ta zawiera znaczniki HTML zaimplementowane jako komponenty JSF. Wystarczy pobrać plik htmlLib.jar ze strony http://jsftutorials.net/htmLib/, dodać go do bibliotek projektu i gotowe. Deklaracja biblioteki znaczników na stronie JSP wygląda następująco:

<%@ taglib uri="http://jsftutorials.net/htmLib" prefix="htm" %>

Możemy teraz używać wszystkich elementów standardowego HTML’a, wystarczy poprzedzić je zakresem przestrzeni nazw htm. Rozwiązanie powyższego problemu, w pełni zgodne z JSF będzie więc wyglądać następująco:

<htm:table>
<htm:tr>
<htm:td>
<h:outputText value="#{currentItem.name}" />
</htm:td>
<htm:td rowspan="2">
<h:outputText value="#{currentItem.picture}" />
</htm:td>
</htm:tr>
<htm:tr>
<htm:td>
<h:outputText value="#{product.productDescr}" />
</htm:td>
</htm:tr>
</htm:table>

13 maja 2007

Repozytorium plików SVN z klientem TortoiseSVN na Windows

Kiedyś gdzieś na jakiejś prezentacji widziałem bardzo ciekawą i nadzwyczaj trafną definicję słowa Informatyka. Dokładnej jej treści nie udało mi się odszukać, ale brzmiało to jakoś tak: Informatyka to ogół dyscyplin naukowych zajmujących się informacją, a w szczególności jej komputerowym przetwarzaniem. I w rzeczy samej, najistotniejsze są dane a cała reszta to tylko ich pewne przetwarzanie, w szczególności gromadzenie i prezentacja w wygodnej formie. Jako że temat dzisiejszego artykułu jest dość „niedzielny” pozwolę sobie na zwiększoną porcję dywagacji. No więc jak można przetłumaczyć słowo Informatyka na język angielski? W powszechnym obiegu równie często spotyka się dwie możliwości: „Computer Science” i „Information Technology”. Które moim zdaniem jest właściwsze? To zależy. Ci, którzy w Informatyce widzą więcej komputera powinni wybrać „Computer Science”. Ci, dla których podobnie jak dla mnie jest to raczej nauka o przetwarzaniu informacji, w typowej sytuacji przy pomocy komputera, powinni skłonić się ku drugiej z możliwości.

Moje informacje, dane, bywa czasem, że są dla mnie nadzwyczaj cenne. Nadzwyczaj cenne są dla mnie dane związane z moją pracą magisterską, w szczególności jej tekst i kod źródłowy aplikacji. Nie wiem czy jest to przypadłość cechująca większość ludzi czy tylko tą pedantyczną część, w każdym razie zaobserwowałem, nie tylko na samym sobie, istnienie syndromu przedwczesnego kasowania. Wydaje się nam chwilowo, że pewien fragment kodu czy tekstu jest zły, więc zastępujemy go nowym, a stary oczywiście z miejsca kasujemy i często niedługo po tym tego żałujemy. Kto nigdy w życiu nie użył Windows’owego kosza, czy DOS’owej lub Linux’owej komendy undelete niechaj pierwszy rzuci kamień. Pomijam tych, którzy nie używali analogicznego mechanizmu, bo go po prostu nie mieli. To, co proponuję i to, co sam robię, to używanie do składowania naszych ważnych danych repozytorium plików Subversion, w skrócie i pewnie dla analogii do starszego i gorszego, ale dobrze znanego CVS nazywanego także SVN. Ideałem byłoby używanie repozytorium rezydującego na jakimś zdalnym serwerze, ale przy braku takiej możliwości dobrze będzie mieć to nawet lokalnie. No więc zaczynamy instalację.

Zaczynamy od serwera Subversion. Ze strony projektu, http://subversion.tigris.org/, pobieramy program instalacyjny. W chwili pisania tego artykułu najnowsza wersja to 1.4.3. Instaluje się typowo dla Windows, klikając kilkukrotnie guzik Next. Przystępujemy do instalacji klienta TortoiseSVN. Instalator pobieramy ze strony projektu http://tortoisesvn.tigris.org/. Do Subversion 1.4.3 pasuje TortoiseSVN w wersji 1.4.3 oraz 1.4.2, ale chyba nie ma powodu by używać starszej wersji. Instalacja znowu przebiega typowo dla Windows. Zanim przejdziemy do konfiguracji trzeba będzie zrestartować komputer.

Zaczynamy od utworzenia katalogu, który będzie zawierał wszystkie nasze repozytoria. Standardowym katalogiem instalacji SVN jest C:\Program Files\Subversion. Proponuję utworzyć podkatalog repos w tym właśnie katalogu, ale nie ma żadnych ograniczeń co do nazwy czy też lokalizacji. W katalogu repos tworzymy teraz podkatalog, który będzie zawierał nasze repozytorium. Nazwijmy go testowe. Aby zrobić z tego zwykłego katalogu repozytorium klikamy na nim prawym guzikiem myszy i z menu kontekstowego wybieramy opcję TortoiseSVN > Create repository here, tak jak pokazano na poniższej ilustracji. Wybieramy jeden z dwu typów repozytorium. Oba będą równie dobre.


Musimy teraz skonfigurować zasady kontroli dostępu. W tym celu edytujemy plik testowe\conf\svnserve.conf. W najprostszym przypadku możemy po prostu wyłączyć uwierzytelnianie poprzez odkomentowanie linii:
anon-access = read
auth-access = write
i zmianę wartości read na write dla parametru anon-access. Plik svnserve.conf jest dobrze samoudokumentowany i powstrzymam się od tłumaczenia.

Środowisko mamy gotowe. Trzeba jeszcze tylko uruchomić serwer ze wskazaniem na katalog zawierający repozytoria. Serwer konfigurujemy jako usługę uruchamianą automatycznie przy starcie systemu operacyjnego. W tym celu z linii komend odpalamy polecenie:
sc create svn
binpath= "C:\Program Files\Subversion\bin\svnserve.exe
--service -r \"C:\Program Files\Subversion\repos\""
start= auto
oczywiście zmieniając odpowiednio, w razie potrzeby, ścieżki dostępów. Musimy także uważać na odstępy dookoła znaku =, przed = nie może być żadnej spacji, po musi być dokładnie jedna. Gotowe! Aby utworzyć kopię roboczą (ang. working copy) repozytorium tworzymy pusty katalog o dowolnej nazwie, klikamy na nim prawym guzikiem myszy i z menu kontekstowego wybieramy SVN Checkout. Jako URL repozytorium podajemy svn://localhost/testowe, gdzie testowe to nazwa naszego repozytorium. Musimy tylko pamiętać, że od tej pory nie jest to już zwykły katalog i że do wykonywania operacji na zawartych w nim plikach musimy używać opcji z menu TortoiseSVN (albo innego klienta SVN). Do repozytorium możemy podłączyć się także z poziomu Eclipse z użyciem jednej z dwu wtyczek (ang. plugin): Subversive lub Subclipse. Ta pierwsza jest bardziej rozbudowana funkcjonalnie, ale za to zdarza się, że coś nie działa jak trzeba. W najprostszym przypadku lepsza będzie ta druga. Wtyczkę do NetBeans’a można pobrać ze strony http://subversion.netbeans.org/.

Ostatnim ogniwem w łańcuchu bezpieczeństwa naszych danych są kopie zapasowe repozytorium. Od biedy, można by zwyczajnie kopiować katalog repozytorium, ale nie jest to z wielu względów dobre rozwiązanie. Szczęśliwie SVN dostarcza bardzo prostego mechanizmu. Aby utworzyć zrzut danych repozytorium wystarczy uruchomić z linii poleceń komendę:
svnadmin dump
"C:\Program Files\Subversion\repos\testowe"
> "C:\Program Files\Subversion\backup\testowe.dump"
i nie trzeba nawet w tym celu wyłączać serwera. Jak można się domyślić spowoduje to utworzenie pliku testowe.dump zawierającego kompletne dane repozytorium. Możliwe jest także tworzenie kopii przyrostowych. Plik kopii zapasowej będzie zawierał wówczas tylko wybrany zakres rewizji. Aby odtworzyć dane z tak utworzonego pliku kopii uruchamiamy polecenie:
svnadmin load
"C:\Program Files\Subversion\repos\testowe"
< "C:\Program Files\Subversion\backup\testowe.dump"
Bardzo dobrym źródłem wiedzy o Subversion jak i o repozytoriach plików w ogólności jest książka dostępna nie odpłatnie pod adresem http://svnbook.red-bean.com/.