JSF – automatyczna zamiana null na 0 lub pusty string

Myślalem, że JSF nie ma już przede mną większych tajemnic, gdy w projekcie objawił się nam następujący błąd:

JSF domyślnie z automatu zamienia formularzowe puste inputy na odpowiadające im 0 lub puste stringi. Inaczej mówiąc jeśli użytkownik do takiego inputTextu nic nie wpisze to referencja age zamiast być pusta (null) wskazywać będzie na 0.

<h:inputText id="age"
value="#{exampleManager.age}" converter="IntegerConverter" />

Gdyby age było Stringiem, wówczas JSF przypisałby pod niego “”.

Rozwiązanie tego ‘problemu’ okazało się trywialne choć dziwne (stąd ta notka). Należało zmienić domyślną wartość flagi Tomcata COERCE_TO_ZERO poprzez ustawienie odpowiedniego parametru uruchomieniowego:

-Dorg.apache.el.parser.COERCE_TO_ZERO=false

Domyślna wartość COERCE_TO_ZERO ustawiona jest na true. Oczywiście można tego dokonać również z poziomu kodu aplikacji – jak dla mnie rozwiązanie takie jest dużo bardziej elastyczne i eleganckie:

System.getProperties().
put("org.apache.el.parser.COERCE_TO_ZERO", "false");

Projekt w którym objawił się ten problem pracuje na JBossie (posiadającym w sobie Tomcata), jak aplikacja ta zachowała by się na innych serwerach aplikacyjnych i jak wówczas poradzić sobie z opisywanym ‘wymuszaniem’ – kiedyś może się dowiem…

JavaBlackBelt

Od 27 lipca zacząłem bawić się w zdobywanie kolejnych pasów na JavaBlackBelt. W skrócie chodzi o zdawanie egzaminów dotyczących technologii około javowych, za które uzyskujemy punkty przeliczane następnie na pasy al’a karate. Strasznie wkręca :)

Naj(gorsze)lepsze jest to, iż by podejść do wybranego egzaminu trzeba mieć na jego zdanie odpowiednią ilość punków (odpowiednik pieniędzy), którą zdobywa się poprzez aktywność w tej społeczności – dodawanie, poprawianie, komentowanie egzaminów i pytań. Im więcej dajesz siebie społeczności, tym bardziej możesz z jej dobrodziejstwa korzystać – majstersztyk jeśli chodzi o serwisy społecznościowe. Od paru dni zatem, w różnych okolicznościach, rodzą mi się więc w głowie kolejne pytania, które mógłbym dodać do serwisu.

Jeśli chodzi o merytoryczną zawartość egzaminów to pytania przechodzą przez dość krytyczne sito użytkowników – nie ma więc głupich pytań w stylu WTF. W trakcie zdawania egzaminu – a pytania nierzadko są obiektywnie trudne – można korzystać z Google, IDE, książek itp, jedynym ograniczeniem jest czas. Egzaminy sprawdzają więc praktyczną umiejętność programowania, czyli to o co powinno w egzaminach na certyfikaty chodzić.

Podsumowując moją podnietę w temacie JavaBlackBelt, jest to idealne połączenie przyjemnego z pożytecznym. Poniżej mój aktualny pasiasty dorobek:

WSDL2JAVA w Ant

Poniżej przykład uruchomienia generatora kodu Java dla zadanego WSDL (Axis2 WSDL2JAVA):

Z kosoli:

$PROJEKT/scr> WSDL2Java -uri http://localhost:8080/axis2/services/WebServiceExample?wsdl -d adb -s -S .

Ant:


<project name="WsExampleClient" default="dist" basedir=".">
<property name="location.dir.src" value="."/>
<path id="axis2.classpath">
<fileset dir="D:\libs\axis2-1.4.1\lib">
<include name="**/*.jar" />
</fileset>
</path>
<target name="codegen">
<taskdef name="axis2-wsdl2java" classname="org.apache.axis2.tool.ant.AntCodegenTask"
classpathref="axis2.classpath" />
<axis2-wsdl2java
wsdlfilename="http://localhost:8080/axis2/services/WebServiceExample?wsdl"
output="${location.dir.src}" />
</target>
</project>

Parametry axis2.classpath i wsdlfilename ustawiamy swoje. Sorkiewicz za brak wcięć ;)

Java – wyrażenia regularne – vademecum

Ile razy piszę jakiegoś bardziej skomplikowanego regexpa w Javie, tyle razy muszę posiłkować się Google, bo nie mogę zapamiętać wszystkich składniowych fanaberii twórców wyrażeń regularnych.

Wygląda na to że ta stronka zawiera wszystko w jednym miejscu, nic tylko wydrukować i położyć na biurku albo powiesić na wewnętrznej stronie drzwi firmowej toalety :)

http://mindprod.com/jgloss/regex.html

PS. Jeśli trafiłeś tutaj z wyszukiwarki z chęcią nauczenia się wyrażeń regularnych, zacznij od tego artykułu.

Jak pobrać ilość wierszy z Result Set

Wydawało by się, że będzie to banalne i ograniczy się do wywołania na rzecz naszego ResultSeta metody getRowsCount() lub podobnej.

Niestety nie jest to takie oczywiste. ResultSetMetaData, czyli obiekt zawierające przeróżne informacje na temat samego ResultSeta, również nie posiada odpowiedniej metody.

Wymyśliłem więc takie cuś. Wygląda pokracznie, żeby nie powiedzieć paskudnie… ale działa i dobrze się ma :)

try {
    // scrollowalny ResultSet
    Statement stmt =
        connection.createStatement(
        ResultSet.TYPE_SCROLL_INSENSITIVE,
        ResultSet.CONCUR_READ_ONLY);
    ResultSet resultSet =
        stmt.executeQuery("SELECT * FROM t_t1");

    resultSet.last();
    int rowCount = resultSet.getRow();
    resultSet.beforeFirst();

    // teraz mozna dalej uzywac
    // do woli ResultSeta
    ...
} catch(SQLException e) {
    e.printStackTrace();
    // lub jakies bardziej eleganckie:
    log.error(e.getMessage());
}

Sun Certified Java Programmer (SCJP) – jak zdać

Szczęśliwie jestem już Sun Certified Java Programmer (SCJP), więc postanowiłem podzielić się z innym jak go zdać, a wbrew pozorom nie jest to takie hopaj siup, nawet dla osób które kodują w Javie od jej początków.

Egzamin bowiem polega na zamienieniu się osoby egzaminowanej w kompilator i udzielaniu odpowiedzi na pytania typu: czy dany kod się skompiluje (jeżeli nie to dlaczego) a jeśli tak to co będzie wynikiem jego działania. Jednym słowem podchwytliwy test wielokrotnego wyboru.

Po pierwsze sugestia: dobrze zastanów się i oceń swoje możliwości dotyczące czasu jaki przeznaczysz na naukę oraz swoich dotychczasowych umiejętności z zakresu Javy. Jeśli Twój voucher traci już termin ważności a Ty z nauką jesteś w lesie, zastanów się z jakiej edycji Javy chcesz być egzaminowany. Moja sytuacja była właśnie taka, że od poinformowania mnie o tym że mam zostać SCJP do terminu upłynięcia ważności vouchera miałem około miesiąca na przygotowanie się. Zdecydowałem się więc pójść na łatwiznę i zdawać Javę 1.4. Egzaminy różnią się tematyką, zakresem materiału, ilością pytań oraz wymaganą do zdania ilością udzielenia pozytywnych odpowiedzi. Java 1.4 jest obiektywnie patrząc prostsza do nauczenia się i zdania.

Poniżej linki do wymagań egzaminacyjnych:

- Sun Certified Programmer for the Java Platform, Standard Edition 6 (CX-310-065) – NEW!

- Upgrade Exam: Sun Certified Programmer for the Java Platform, Standard Edition 6 (CX-310-066) – NEW!

- Sun Certified Programmer for the Java Platform, Standard Edition 5.0 (CX-310-055)

- Upgrade Exam: Sun Certified Programmer for the Java Platform, Standard Edition 5.0 (CX-310-056)

Materiały do nauki:

  • tuż przed egzaminem: Egzaminy Whizlabs – bez przerobienia tego do egzaminu nie podchodź!

Swój egzamin zdawałem w Krakowie, w ośrodku ABC Data przy Długiej 48 i bardzo go polecam. Co najważniejsze są stosunkowo krótkie kolejki, radzę jednak umówić się telefonicznie na ponad miesiąc przed, by nie stresować się, że voucher przepadnie albo będziemy zmuszeni podróżować po Polsce w poszukiwaniu inszego ośrodka z wolnymi miejscami (przeegzaminuje cię każdy ośrodek który chwali się Prometric, cokolwiek by to było :) ).

Przebieg egzaminu jest nagrywany, mamy do dyspozycji tabliczkę formatu A4 i marker, co zwłaszcza przy egzaminie w edycji 1.4 może być kłopotliwe (rozpisywanie kolejności operatorów itp). Wynik egzaminu znany jest zaraz po jego zakończeniu, na okoliczność czego otrzymujemy papierowy raport z przebiegu egzaminu, z wyszczególnionymi ocenami z poszczególnych jego części – rozdziałów. Właściwy certyfikat, z gadżetami które prezentuję poniżej i zgodą na używanie logo SCJP otrzymamy na wskazany adres.

ludera_dariusz_scjp.jpg

Aha, bardzo ważna sprawa: Przed rozpoczęciem egzaminu jesteśmy przepytywani jak oceniamy swoje przygotowanie z poszczególnych zagadnień do egzaminu. Ma to chyba wpływ na rodzaj losowanych pytań, ja zachowawczo przy wszystkich zagadnieniach postawiłem ocenę Good i tematykę pytań miałem raczej równo zbalansowaną. Kolega z którym zdawalem egzamin, kiepsko ocenił się z wątków i mial właśnie więcej z nich pytań – szczęśliwie i tak dobrze zdał. Także nie wiem jaki dokładny wpływ na pytania ma ta ankieta, sugeruję uważać:)

Jeśli nie dostaliście od swojego pracodawcy vouchera na zdawanie egzaminu, bądź jesteście studentami poszukajcie kontaktu do Uczelnianych Ambasadorów Firmy Sun – studenci mają olbrzymie zniżki na egzaminy (byćmoże to będzie dla kogoś motywacja na zapisanie się na kolejne studia w swoim życiu;)). Z tego miejsca pozwalam sobie zacytować Ambasadora Sun z jednej z krakowskich uczelni:

Są zniżki dla studentów i pracowników uczelni. Cena egzaminu ze zniżką wynosi około 200zł (40€ z marginesem) zamiast mniej więcej 800zł.

Dostępne są następujące egzaminy:

212-019 Sun Certified Associate for Java Platform, Standard Edition, Exam Version 1.0

212-035 Sun Certified Programmer for the Java 2 Platform 1.4

212-055 Sun Certified Programmer for the Java 2 Platform, Standard Edition 5.0

212-056 Sun Certified Programmer for J2SE 5.0 – UPGRADE EXAM

212-065 Sun Certified Programmer for the Java 2 Platform, Standard Edition 6.0

212-066 Sun Certified Upgrade Exam for the Sun Certified Java Programmer, SE 6.0

212-083 Sun Certified Web Component Developer for the Java Platform, Enterprise Edition 5

212-105 Sun Certified Solaris Associate

212-200 Sun Certified System Administrator for Solaris 10 OS, Part 1 Exam

212-202 Sun Certified System Administrator for Solaris 10 OS, Part 2 Exam

212-302 Sun Certified Network Administrator for Solaris 10 OS Exam

Data stworzenia tego posta zobowiązuje, zatem obiecuję sobie w 2009 roku podejść do SCWCD i zrobić upgrade swojego SCJP do wersji 1.6. Czy się uda? Jak mawiają starzy górale “We will see”… :)