GeeCON - czy Twój szef wystarczająco dba o Ciebie?
Tytuł może zbyt kontrowersyjny ale w innym przypadku pewnie nie zwrócilibyście na niego uwagi
Jak zapewne większość z Was wie, wczoraj wystartowaliśmy z rejestracją na GeeCON - pierwszą w pełni międzynarodową konferencją poświęconą Javie w Polsce. Jest to dobry moment aby przybliżyć pokrótce powody dla których ją organizujemy oraz dlaczego poważnie powinieneś zastanowić się nad udziałem w GeeCON.
Po pierwsze, głównym powodem dla którego zabraliśmy się za organizację GeeCON była chęć umożliwienia Wam i sobie udziału w konferencji podczas której prelegentami będą ludzie z naprawdę topową wiedzą. Część z nich to znane osoby pracujące nad rozwojem technologii których używacie codziennie w pracy, część to ludzie pracujący nad ciekawymi projektami, którzy są chętni podzielić się swoim doświadczeniem. Staramy się ich zebrać w jednym miejscu i czasie, tak aby stworzyć możliwie najbardziej interesujące wydarzenie “javowe” w tym roku w Polsce.
Oczywiście, nie wszystkie tematy muszą wszystkim odpowiadać, możliwe też, że część z prezentacji, które znajdują się w agendzie byłaby Waszym zdaniem gorsza od tych, które musieliśmy odrzucić z braku wolnych slotów (aktualne wolne sloty w agendzie są przeznaczone dla prelegentów, którzy nie śpieszą się z podsyłaniem tematów i abstraktów).
Organizując GeeCON staramy się unikać tego czego sami nie lubimy, dlatego też ograniczyliśmy do absolutnego minimum wszystkie marketingowe aspekty prezentacji, a prelegenci sponsorów będą opowiadać o rozwiązaniach open source i technologiach ogólnie dostępnych, to jest jeden z naszych głównych celów.
Pomimo faktu, że wszyscy organizujemy konferencję za free (ot taki rodzaj wolontariatu), nie uda nam się doprowadzić do tego aby wejściówki były za darmo. Niestety są pewne koszty stałe, których pokrycie konieczne jest do realizacji pełni naszej wizji. Gdybyśmy z nich zrezygnowali to GeeCON nie byłby już GeeCONem w tej postaci jaką możecie obserwować (byłby krótszy i z udziałem mniejszej ilości zagranicznych prelegentów oraz z dużym udziałem prezentacji marketingowych).
Na całe szczęście udało nam się zminimalizować stawkę do poziomu, który część osób naprawdę zadowala (pozostałe zawsze będą narzekać, że jest zbyt drogo :P). 389 PLN to chyba stawka do przełknięcia dla wszystkich firm informatycznych w kraju i dla większości developerów (już nie narzekajcie jak to mało zarabiacie), w ten sposób prawdopodobnie odrzucamy główny argument Waszego PM’a, który pewnie zawsze mówi Wam, że wyjazd na zagraniczne konferencje to zbyt duży koszt
Faktycznie porównując z takimi konferencjami jak QCon, Jazoon czy też ApacheCon to GeeCON jest śmiesznie tani. Oczywiście wiadomo, że te konferencje są sporo większe od GeeCON ale z drugiej strony i tak możecie uczestniczyć w jednej ścieżce w jednej chwili co sprawia, że w przeliczeniu na godzinę prezentacji GeeCON to zdecydowanie mniejszy koszt. I o to właśnie wszystkim organizatorom chodziło, nie organizować imprezy dla zysku a tylko dlatego aby dostarczyć Wam godne uwagi wydarzenie “javowe”.
Jeśli już dotarliście do tego miejsca to mam nadzieję, że podzielicie się swoimi uwagami i spostrzeżeniami, zarówno jeśli chodzi o GeeCON, jak i inne rzeczy które mogą się Wam wydać istotne w kontekście tego wpisu. Na koniec jeszcze chciałem wszystkich zaprosić do udziału w GeeCON i nie tylko, bo już wielkimi krokami zbliża się kolejna Javarsovia i Java4People
Struts 2, NetBeans 6 i GlassFish - część II
Jako, że w ostatni weekend dorwała mnie choroba i siedziałem cały czas w domu (czego bardzo żałuję, gdyż miałem okazję spotkać się z Wiktorem Gworkiem i pogadać przy piwku o sprawach “javowych” - sorry Wiktor
).
Na szczęście nie ma tego złego, co by na dobre nie wyszło
W ten sposób znalazłem czas aby wreszcie napisać kolejną część podręcznika dotyczącego tworzenia aplikacji Struts 2 z wykorzystaniem NetBeans 6 i GlassFish ![]()
Tym razem opisałem proste użycie Struts 2, EJB3 i Hibernate JPA. Ta część jest do pobrania tutaj.
Już wiem co będzie w następnej części
Przedstawię w niej dodanie walidacji danych zarówno client-side jak i server-side, poruszę też temat tworzenia własnych walidatorów
Aaa i zapomniałbym, cały czas jest to DRAFT, proszę o wszelkie uwagi/pytania. Na koniec (jak będą gotowe wszystkie części) uwzględnię wszelkie uwagi i zrobię z tego jeden dokument ![]()
Struts 2, NetBeans 6 i Glassfish
No i stało się, dziś zamieszczam pierwszą część tutoriala który będę publikował jako pliki PDF. Stwierdziłem, iż jest to najlepszy sposób na publikowanie tutoriali, pozwoli mi on zebrać wszystko do kupy a Wam ułatwi przeglądanie.
Ponieważ jest to pierwsza część więc liczę się z faktem, że pojawi się sporo uwag, zarówno merytorycznych jak i dotyczących wyglądu PDF`ów.
W tej części konfiguruję środowisko NetBeans 6 i tworzę przykładową, bardzo trywialną aplikację przy użyciu Struts2. Aplikację tą następnie uruchamiam na serwerze Glassfish, pewnie zapytacie dlaczego serwer aplikacyjny do uruchomienia prostej aplikacji ? Wybrałem Glassfish z dwóch powodów, pierwszy to dlatego, że aktualnie powiązany jestem z Sun Microsystems a drugi dlatego, że jako alternatywę miałem Apache Geronimo a mimo wszystko nie chciałem uruchamiać tego na zwykłym Tomcacie. Ostatnio rozmawiałem też z kolegą na temat porównania Glassfisha z Geronimo i w jego mniemaniu Geronimo wypada słabiej od Glassfisha, stąd przekonał mnie on dodatkowo do tego, iż mój wybór jest słuszny
Tutorial możecie pobrać tutaj, część ta jest przeznaczona dla osób początkujących więc jeśli znacie się cokolwiek na tworzeniu aplikacji webowych to nie znajdziecie w niej nic interesującego dla siebie ![]()
WebWork (Struts 2) in Action
Ponieważ pisałem ostatnio o Struts2 stąd postanowiłem zamieścić na blogu link do prezentacji Patricka Lightbody na temat tego frameworku.
Patrick przedstawia najważniejsze elementy WebWork/Struts2 jak choćby akcje, walidatory, interceptory, czy też integrację z AJAXem. Video wydaje mi się ciekawe i moim skromnym zdaniem jest warte poświęcenia 49 minut (ja oglądałem ją o czwartej nad ranem ;)) zwłaszcza, że stanowi idealne wprowadzenie (szczególnie dla osób którym nie chce się nic czytać :P) do Strutsów w wydaniu drugim (właściwie to przedstawia filozofie WebWork na której bazuje Struts2 ).
Struts 2 - walidacja za pomocą adnotacji
Tym razem będzie krótko (muszę jeszcze powalczyć z WebLogiciem :P).
Pisząc aplikacje na pewno spotykacie się z koniecznością sprawdzenia poprawności danych, poprawność ta możemy sprawdzić po stronie klienta (przeglądarki) jaki i po stronie servera. Dziś przedstawię jak szybko można sobie sprawić walidację po stronie servera ![]()
Bazując na poprzednim wpisie postaramy się go uzupełnić o wymagalność imienia i określenie maksymalnej długości wprowadzonego ciągu znaków.
Dobra zaczynamy !
Walidację po stronie servera w Struts2 możemy zapewnić na dwa sposoby :
- konfigurując ją w xml`u
- używając annotations
Ja przedstawię ten drugi (szybszy sposób) :
- dodamy annotations do naszej akcji :
package org.holewa.struts2.action;
import com.opensymphony.xwork2.ActionSupport;
import com.opensymphony.xwork2.validator.annotations.RequiredStringValidator;
import com.opensymphony.xwork2.validator.annotations.StringLengthFieldValidator;
import com.opensymphony.xwork2.validator.annotations.Validation;
/**
* Struts2 - validation
* @author Radoslaw Holewa
*/
@Validation
public class SampleAction extends ActionSupport {
private String name;
public String execute() throws Exception {
return SUCCESS;
}
@RequiredStringValidator(message="You must enter your name.", key="sample.validator.required")
@StringLengthFieldValidator(maxLength="20", message="Wrong length", key="sample.validator.length")
public void setName(String name) {
this.name = name;
}
public String getName() {
return name;
}
}
Aby włączyć walidację dla danej akcji musimy oznaczyć ją adnotacją
następnie używamy dwóch adnotacji (do sprawdzenia czy wpisana jest jakakolwiek wartość i czy jej długość nie przekracza 20 znaków), w adnotacjach użyłem tylko najważniejszych parametrów, takich jak
message - domyślny komunikat, key - klucz komunikatu w messages.properties i dla walidacji długości wprowadzonej wartości maxLength który oznacza jaka jest maksymalna dopuszczalna długość wprowadzonego ciągu
- dodamy do pliku struts.xml dodatkowy result dla akcji SampleAction :
/index.jsp
NameAction
/name.jsp
Fragment
oznacza że gdy podczas wykonania walidacji zostanie zwrócona wartość input z akcji to przekierujemy użytkownika do strony index.jsp (w efekcie dostaje możliwość poprawienia danych).
- dodamy też na naszej stronce wyświetlanie komunikatów o źle wpisanej wartości
<%@ taglib prefix="s" uri="/struts-tags"%>
Tag
Teraz jak mamy już gotowy przykład możemy go odpalić… dopalamy i… leci WARNING długi jak droga z Krakowa do Gdańska ![]()
Po chwili googlowania okazało się, że najnowszy Struts2 ma błędy w walidatorach
Dobra teraz czas na walkę z WebLogiciem ![]()
Struts 2 - małe wprowadzenie
Jak już wcześniej napisałem, postaram się przedstawić najważniejsze elementy frameworku Struts2 w kolejnych wpisach. Na sam początek pokaże jak można napisać prostą aplikacje która po podaniu imienia wyświetli napis “Witaj podane_imię“.
A więc startujemy !
Pierwszą rzeczą jaką musimy zrobić to utworzyć plik web.xml :
Struts2Tut
index.jsp
struts2
org.apache.struts2.dispatcher.FilterDispatcher
struts2
/*
Jak widać w powyższym kodzie naszą stroną startową będzie index.jsp.
Teraz przystąpimy do napisania naszej akcji, tworzymy klasę SampleAction która dziedziczy po klasie ActionSupport wchodzącej w skład Struts2 (nie jest to jednak konieczne ponieważ jak pisałem w jednym z wcześniejszych postów akcjami w Struts2 mogą być zwykłe klasy POJO (Plain Old Java Object)):
package org.holewa.struts2.action;
import com.opensymphony.xwork2.ActionSupport;
/**
* Struts2 Introduction
*
* @author Radoslaw Holewa
*/
public class SampleAction extends ActionSupport {
private String name;
public String execute() throws Exception {
return SUCCESS;
}
public void setName(String name) {
this.name = name;
}
public String getName() {
return name;
}
}
Nasza klasa zawiera jedno pole typu String o nazwie name wraz z jego akcesorami, dodatkowo znajduje się w niej przeciążona metoda execute która jest domyślnie wywoływana w akcjach (dla akcji można zdefiniować inną metodę która zostanie wywołana - opiszę to w następnych postach).
Do wprowadzenia danych potrzebujemy stronki, utwórzmy więc index.jsp :
<%@ taglib prefix="s" uri="/struts-tags"%>
Za pomocą powyższego kodu utworzyliśmy formularz do wpisywania imienia, łatwo można zauważyć że wciśnięcie przycisku spowoduje wywołanie akcji SampleAction, dodatkowo wartość z pola textfield zostanie zapisana do zmiennej name w naszej SampleAction.
Tworzymy teraz stronę name.jsp na której zostanie wyświetlony napis “Witaj podane_imię“:
<%@ taglib prefix="s" uri="/struts-tags"%>
Strona ta jedynie wyświetla wartość pola name z akcji, tag text sprawia, że zostaje wyświetlony tekst znajdujący się pod kluczem sample.hello w pliku zawierającym teksty I18N.
Teraz kolej na konfigurację Struts, zrobimy to w dwóch miejscach :
- Tworzymy plik struts.xml który docelowo ma się znaleźć w /WEB-INF/classes/ :
NameAction
/name.jsp
Powyżej zadeklarowaliśmy dwie akcje SampleAction i NameAction bazują one obydwie na klasie SampleAction i wywołują domyślnie metodę execute w tej akcji (tak jak napisałem wcześniej - możemy ustawić wywołanie innej metody).
Trzeba zwrócić uwagę na parametr type=”chain” dla akcji SampleAction, informuje on o tym że wystąpi tzw Action Chaining który pozwala w prosty sposób przesyłać wartości między akcjami (wartości z poprzedniej akcji zaznaczonej parametrem type=”chain” zostaną przesłane do odpowiadających im pól w następującej po nich akcji - w tym przypadku akcji NameAction). Ponieważ obie akcje zwrócą wartość “success” stąd wywołanie akcji SampleAction spowoduje pobranie wartości z formatki i przesłanie ich do akcji NameAction która następnie wykona przekierowanie do strony name.jsp wyświetlającej nasz tekst “Witaj podane_imię“.
- Czas na konfigurację w pliku struts.properties (on również ma się znaleźć docelowo w /WEB-INF/classes/) :
struts.custom.i18n.resources=messages
struts.ui.theme=simple
Wartość dla klucza struts.custom.i18n.resources oznacza nazwę pliku properties z tekstami I18N (w naszym przypadku będzie messages.properties), wartość dla klucza struts.ui.theme oznacza, że przy generowaniu komponentów będziemy stosować zwykły najprostszy theme.
To tyle na dziś, w jednym z następnych postów postaram się przedstawić konfigurację przez annotations i strutsowe walidatory ![]()
Struts 2
Wreszcie znalazłem czas na kolejny krótki wpis w blogu
Ponieważ mam obecnie do czynienia z pochodzącym z fundacji Apache frameworkiem Struts2 postanowiłem opisać jego najważniejsze elementy. Framework Struts2 to jak łatwo się domyśleć następca starych, dobrych i wciąż popularnych Strutsów. Ale czy tylko następca ?
No właśnie Struts2 powstał w wyniku połączenia sił twórców frameworków WebWork i Struts i ma zawierać w sobie to co najlepsze w obu rozwiązaniach, pierwotnie miał to być kolejny WebWork jednak postanowiono że przyjmie on nazwę Struts2.
Z nowości jakie występiują w Struts2 warto choćby wymienić :
- możliwość użycia klas POJO jako akcji (właściwie to zrezygnowano wogólę z ActionForms i teraz akcje zawierają pola – coś na wzór znanych z JSF managed beanów), więc nie musimy już dziedziczyć naszej akcji po żadnej klasie.
-
„themes” które standardowo pozwalają na używanie tych samych tagów w różny sposób (dla danego theme występuje template taga według którego jest on generowany), pozwala to łatwo używać AJAX`owych komponentów (wystarczy tylko ustawić theme na „ajax”).
-
można teraz bardzo łatwo pisać rozszerzenia – wystarczy tylko dorzucić swoje archiwum JAR zawierające plugin i o ile nasz plugin został dobrze napisany to wszystko powinno działać
-
Struts2 posiada mechanizm zwany interceptorami które mogą być wykonywane przed i po wykonaniu akcji, pozwalają one np. przygotować dane które maja być wyświetlone na formatce bądź też przeprowadzić walidację wprowadzonych danych.
-
Struts2 bardzo łatwo integruje się z Springiem, dodatkowo warto nadmienić że konfiguracja jest trywialna, występuje też takie pojęcie jak „Zero Configuration” które pozwala cała konfiguracje rozwiązać przy pomocy wartości domyślnych i zawartych w klasach annotacji.
-
nowy Struts posiada bardzo dobry mechanizm raportowania błędów (dostępny w zależności od konfiguracji) który bardzo dokładnie przedstawia miejsce wystąpienia błędu.
To w zasadzie najważniejsze jak dla mnie elementy nowego Strutsa, co do mankamentów tego frameworku to mogę wymienić na chwilę obecną słabą dokumentację (mi nie przypadła do gustu), która zorganizowana jest w formie wiki.
W kolejnych wpisach postaram się przedstawić praktyczne przykłady Struts2 (różnice między themes, konfigurację, validatory i interceptory).





