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 ).
Java TechConf 2007
I stało się, ruszamy z rejestracją na Java TechConf 2007, podczas konferencji zostaną przedstawione przeróżne zagadnienia : Flex 2 (Roman Swoszowski), Apache Geronimo (Jacek Laskowski), OSGi (Piotr Maj), EJB3 (Janusz Marchewa), wyszukiwanie informacji (Tomasz Korzeniowski) oraz NetBeans przedstawione przez specjalnego gościa Romana Strobla, pełniącego funkcję Technology Evangelist w Sun Microsystems.
Serdecznie wszystkich zapraszam (konferencja jest bezpłatna).

BeanShell
Pewnie nieraz mieliście potrzebę napisania kodu w aplikacji który mogłaby być łatwo podmieniany i modyfikowany, najlepszym sposobem na implementację takiego fragmentu aplikacji jest wykorzystanie języka skryptowego. Dla wirtualnej maszyny java jest dostępne kilka języków skryptowych (np. Jython, JRuby, Groovy, BeanShell). Ponieważ aktualnie dość dużo używam BeanShell`a więc postanowiłem przedstawić prosty przykład jego użycia.
BeanShell to język skryptowy którego specyfikacja powstaje w ramach JCP (Java Community Process), umożliwia on wywoływanie zarówno zewnętrznych skryptów (napisanych w oddzielnych plikach) jak i wywoływanie skryptów bezpośrednio w kodzie, ponadto posiada własną konsolę w której możemy programować bez konieczności kompilacji kodu.
W wpisie tym przedstawię dwa sposoby użycia języka BeanShell :
- uruchomienie skryptu zaimplementowanego bezpośrednio w naszym programie
- uruchomienie skryptu z zewnętrznego pliku (w naszym przypadku będzie to example.bsh)
Na początek utworzymy klasę która przyda się w przykładzie, będzie to klasa POJO (Plain Old Java Object) :
package org.holewa.beanshell;
/**
* Bean example
*
* @author Radoslaw Holewa
*/
public class Bean {
private int value;
public int getValue() {
return value;
}
public void setValue(int value) {
this.value = value;
}
}
Kolejnym krokiem będzie utworzenie naszego głównego programu który wykona napisany przez nas skrypt (aby nie przedłużać kodu pomijam obsługę wyjątków, don’t try this at home! ) :
package org.holewa.beanshell;
import bsh.EvalError;
import bsh.Interpreter;
/**
* BeanShell example
*
* @author Radoslaw Holewa
*/
public class BeanShellExample {
public static void main(String[] args) throws EvalError {
Interpreter interpreter = new Interpreter();
Bean bean = new Bean();
bean.setValue(2);
interpreter.set("exampleBean", bean);
Integer value = (Integer) interpreter.eval("10/exampleBean.getValue()");
System.out.print(value);
}
}
Jeśli wszystko dobrze zrobiliście to wynik programu powinien wyglądać tak :
5
W zasadzie powyższy kod jest tak prosty, że nie trzeba go opisywać. Może warto dodać jedynie iż
to klasa która w BeanShell odpowiada za wykonanie skryptów a jej metoda
odpowiada ze dodanie do interpretera obiektu który ma być widoczny z poziomu skryptu BeanShell`a.
Teraz opiszę drugi przypadek (wczytanie skryptu z pliku) :
Najpierw musimy utworzyć skrypt w pliku (w naszym przypadku będzie to example.bsh) :
10/exampleBean.getValue();
Zwróćmy uwagę, że teraz musieliśmy zakończyć kod średnikiem.
Następnie zmodyfikować tak nasz program aby wczytywał skrypt z pliku :
package org.holewa.beanshell;
import bsh.EvalError;
import bsh.Interpreter;
import java.io.FileNotFoundException;
import java.io.IOException;
/**
* BeanShell example
*
* @author Radoslaw Holewa
*/
public class BeanShellExample {
public static void main(String[] args) throws EvalError, FileNotFoundException, IOException {
Interpreter interpreter = new Interpreter();
Bean bean = new Bean();
bean.setValue(2);
interpreter.set("exampleBean", bean);
Integer value = (Integer) interpreter.source("example.bsh");
System.out.print(value);
}
}
Jeśli wszystko zrobiliście tak jak opisałem to nie będzie “megaśnego” wyjątku na wyjściu
Prawda że proste i przyjemne ? Po więcej informacji odsyłam na stronę BeanShell.
Adobe Apollo - co to właściwie jest ?
Już ponad miesiąc temu pisałem na blogu o nowym, jeszcze oficjalnie nieopublikowanym projekcie firmy Adobe. Był to projekt Apollo który w dużym skrócie jest środowiskiem uruchomieniowym (Runtime Environment) dla aplikacji napisanych w językach HTML, JavaScript i ActionScript.
Dziś, gdy już jestem po wstępnych zmaganiach z tą platformą, mogę opisać jej najważniejsze elementy (zwracam uwagę na fakt iż jest to dopiero wersja alpha).
Adobe Apollo to swego rodzaju przełom zarówno w aplikacjach webowych jak i desktopowych. Pozwala on na przeniesienie aplikacji webowych wprost na nasz pulpit, sprawiając że możemy mieć do czynienia z lepszym, dokładniej przystosowanym interfejsem użytkownika - już nie jesteśmy skazani na używanie ![]()
Jak już wcześniej pisałem, Apollo umożliwia tworzenie aplikacji zarówno w HTML jak i JavaScript czy też ActionScript, mamy również możliwość wywoływania kodu napisanego w ActionScript z poziomu JavaScriptu i vice versa, oczywiście CSSy są również obsługiwane. Ciekawostką jest też fakt, że Apollo oparte jest na WebKit, silniku open source który jest też używany w Safari (przeglądarce pod Mac OS X).
Spośród najważniejszych funkcjonalności jakie umożliwia Apollo warto wymienić obsługę pracy online/offline która pozwala w łatwy sposób tworzyć aplikacje dla użytkowników nie posiadających stałego dostępu do internetu - szczególnie interesująca jest możliwość pracy offline a następnie po przejściu w tryb online - synchronizowania danych, dodanie takiej funkcjonalności jest proste, łatwe i przyjemne
.
Apollo oczywiście umożliwia dostęp do plików na komputerze, ponadto posiada mechanizm serializacji/desarializacji obiektów dzięki czemu np. zapis stanu aplikacji jest bardzo łatwy - wystarczy tylko dokonać serializacji wybranych obiektów i zapisać je na dysk po czym kiedy tylko będziemy chcieli przywrócimy stan aplikacji poprzez ich deserializację ![]()
Tworzone przez nas aplikacje możemy w sposób bezproblemowy integrować z naszym pulpitem, możemy zarówno zmieniać wygląd okienek (kolorki, przeźroczystość itd. itp.), używać mechanizmu drag’n'drop (zarówno na poziomie aplikacji jak i między innymi aplikacjami nieużywającymi Apollo), schowka systemowego lub też odpalić aplikację “w tle”.
To tylko część spośród dostępnych w tej chwili możliwości, do czasu ukończenia i wypuszczenia oficjalnej wersji zmieni się jeszcze wiele i na pewno pojawią się nowe, interesujące funkcjonalności. Na chwilę obecną mogę polecić krótki wstęp do Apollo - bardzo przyjemnie się go czyta, jednak nie znajdziemy w nim zbyt wiele kodu
Na koniec kilka przykładów :
ScreenPlay - porysujmy sobie po ekranie ![]()
Maptacular - aplikacja wykorzystująca Google Maps
Fresh - czytnik RSS`ów
i ostatnia, moja ulubiona (używam jej codziennie) :

Nasze realia …
Dziś tak bardziej ogólnie, postaram się przedstawić swoje refleksje związane z wpisem “Polska Dolina Krzemowa - JEE 5, Ruby on Rails, AJAX, Spring” zamieszczonym na wortalu Java Developers Network przez Gabriela Krupe.
Poruszono w nim temat naszej rodzimej sytuacji, zarówno projektów open source (których u nas jest jak na lekarstwo) jak i jakości kształcenia studentów informatyki. Nie mogłem ominąć tego postu z uwagi na fakt, iż już dawno zauważyłem pewną dziwną tendencję panującą na naszych uczelniach. Z własnego doświadczenia a także doświadczenia moich kolegów z innych krakowskich uczelni wiem, że na uczelniach kładzie się zbyt mały nacisk na poznawanie aktualnych rozwiązań. Nierzadkie są sytuacje gdy studenci zmuszeni są uczyć się materiału sprzed 10-15 lat który, jak wiemy w świecie nowych technologii bardzo szybko się dezaktualizuje.
Zastanawia mnie fakt dlaczego tak się dzieje, co jest tego powodem ? Najprawdopodobniej składa się na to szereg czynników z których najważniejszymi są (w moim skromnym mniemaniu :P) : niskie pensje pracowników naukowych, niskie nakłady na edukację, brak zaangażowania pracowników w proces kształcenia. Niejednokrotnie jest to też wina samych studentów, swoim zachowaniem powodują niechęć do kooperacji wśród wykładowców.
Jak to można poprawić ? W chwili obecnej postrzegam to jako błędne koło, wydaje mi się że sytuacje tą mogłaby poprawić większa dostępność firm do środowiska akademickiego, pozwalałoby to wyłaniać najlepszych studentów, dodatkowo umożliwiałoby to prowadzenie ciekawych projektów na uczelniach. A jak to się ma do realizowanych projektów open source ? Właściwie jak dla mnie to związek jest dość duży, absolwenci informatyki nie są przyzwyczajeni do działania w grupach projektowych, dodatkowo nie mają w sobie tego czegoś co posiadają studenci zagraniczni, czyli chęci robienia czegoś nie tylko dla pieniędzy ale również dla rozwoju własnych umiejętności, poszerzania wiedzy i poznawania nowych interesujących ludzi. Jak na prawie 40 milionowy kraj poziom naszych inicjatyw/projektów open source jest bardzo mizerny. Wydaje mi się że jeśli nie zmieni się sposób kształcenia i zmiana nastawienia studentów/absolwentów to nie możemy liczyć na pojawienie się większych projektów open source z naszą flagą
Na zakończenie chciałbym podkreślić, iż są to moje własne poglądy i chętnie usłyszę słowa krytyki
Chciałbym też polecić bloga Jacka Laskowskiego, nie wiem jak ten człowiek to robi ale znajduje czas na rodzinę, pracę, udział w projektach open source i jeszcze na pisanie bloga, pokazuje w ten sposób że można pogodzić to wszystko i jeszcze dobrze się bawić. Z mojej strony wielki szacunek !!!
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 ![]()




