NetBeans RoadShow
W dniach 11-13 kwietnia odbędzie się w Polsce NetBeans RoadShow, które wchodzi w skład NetBeans WorldTour 2007 - 2008. W ramach tego cyklu, w miastach takich jak Kraków, Warszawa i Wrocław odbędą się NetBeans Days, czyli wykłady na temat środowiska developerskiego NetBeans.
Uczestnicząc w spotkaniach będzie można się dowiedzieć wielu ciekawych rzeczy na temat możliwości tego mocno rozwijanego IDE.
Prelegentami podczas NetBeans Days będą zarówno inżynierowie Sun Microsystems z centrum w Pradze jak również nasi rodzimi prelegenci, znani z blogosfery. Również i ja będę miał okazję wystąpić - 13 kwietnia we Wrocławiu podczas mojej prezentacji “Visual Web Development w NetBeans” będziecie mieli okazję dowiedzieć się jak można w prosty i szybki sposób stworzyć aplikacje webowe za pomocą NetBeans. Więcej informacji na temat NetBeans RoadShow uzyskacie na stronie www.netbeansday.pl.
Wszystkich serdecznie zapraszam.
NetBeans, Maven 2 i TestNG
Dziś w południe dostałem takiego oto maila:
“Witam,
Znalazlem mail do Pana na JDN. Od wczoraj walcze z proba polaczenia
TestNG oraz Mavena2 pod Netbeans. Mimo iż w lokalnym repozytorium mam
pakiet TestNG i w przeglądarce projektow w TestLibraries widnieje wpis
testing-4.7-jdk15 to jednak gdy probuje napisac jakikolwiek test to
nie mam dostepu do zadnego klas/adnotacji z biblioteki TestNG - jakby
jej nie bylo na classpath.
Dodam jeszcze ze w przegladarce projektow ikona biblioteki TestNG w
gorjen czesci jest brazowa, podczas gdy ikony innych - szare.
Ponizej zamieszczam fragmenty mojego pliku pom.xml”
Poniżej fragment pliku pom.xml i imię autora maila.
W przerwie między dewelopmentem który przydarzył mi się w te święta, postanowiłem odpowiedzieć na tego maila… na blogu
A więc opiszę po krótko jak skonfigurować prosty projekt w NetBeans 6.1 Beta , do projektu wygeneruję plik pom.xml oraz dodam prościutki test TestNG.
Krok 1 - utworzenie projektu
Utwórzmy najpierw projekt z użyciem NetBeans 6.1 Beta oraz skonfigurujmy go jako projekt Maven 2. W tym celu wybieramy z menu opcję File -> New Project , następnie pojawi nam się takie oto okienko:
Wybieramy w nim opcję Maven -> Maven Project i klikamy Next.
Następny ekran to wybranie archetypu, wybieramy Maven Quickstart Archetype i klikamy Next:
Teraz czas na nadanie groupId i artifactId naszemu projektowi, ja zrobiłem to tak jak widzicie na poniższym obrazku:
Teraz kliamy Finish i proszę, oto nasz projekt:
Składa się on z przykładowego pliku aplikacji (App.java) oraz przykładowego testu (AppTest.java).
Krok 2 - modyfikacja projektu
Ponieważ w tym wpisie interesuje nas TestNG a przykładowy test jest napisany dla JUnit to możemy go usunąć - napiszemy swój od podstaw ![]()
Zmodyfikujmy nasz plik pom.xml na następujący (ten plik dotyczy mojego projektu, jeśli nadaliście inne groupId i artifactId to musicie go zmienić analogicznie):
<project xmlns=“http://maven.apache.org/POM/4.0.0″
xmlns:xsi=“http://www.w3.org/2001/XMLSchema-instance”
xsi:schemaLocation=“http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd”>
<modelVersion>4.0.0</modelVersion>
<groupId>org.holewa</groupId>
<artifactId>test</artifactId>
<packaging>jar</packaging>
<version>1.0-SNAPSHOT</version>
<name>test</name>
<url>http://www.holewa.org</url>
<dependencies>
<dependency>
<groupId>org.testng</groupId>
<artifactId>testng</artifactId>
<version>5.6</version>
<scope>test</scope>
<classifier>jdk15</classifier>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-surefire-plugin</artifactId>
<configuration>
<suiteXmlFiles>
<suiteXmlFile>testng.xml</suiteXmlFile>
</suiteXmlFiles>
</configuration>
</plugin>
</plugins>
</build>
</project>
Teraz zmieńmy ustawienia naszego projektu tak aby ustawić dla niego wersję Java zgodną z wersja 1.5, w tym celu wybierzmy z menu kontekstowego naszego projektu opcję Properties, następnie z listy w okienku po lewej stronie opcję Sources i na dole ekranu który nam się ukaże Source/Binary Format ustawmy na 1.5. Możecie to zobaczyć na poniższym obrazku:
NetBeans zmodyfikuje nasz plik pom.xml, dodając do niego taki fragment kodu:
<artifactId>maven-compiler-plugin</artifactId>
<version>RELEASE</version>
<configuration>
<source>1.5</source>
<target>1.5</target>
</configuration>
</plugin>
Dobra, teraz wybierzmy z menu kontekstowego projektu opcję Clean and Build, projekt nam się przebuduje a TestNG dodane jako zależność do naszego pom`a pobierze się z repozytorium Maven 2.
Krok 3 - pisanie testu
Nadszedł czas na nasz test
W tym celu tworzymy nowy plik xml o nazwie testng.xml, musi się on znajdować w tym katalogu w którym znajduje się nasz pom.xml, jego zawartość będzie następująca:
<suite name=“Simple test siute”>
<test name=“Simple test”>
<classes>
<class name=“org.holewa.test.SimpleTest”/>
</classes>
</test>
</suite>
Podaliśmy w nim, że nasz projekt zawiera jeden test org.holewa.test.SimpleTest w takim razie czas na jego napisanie ![]()
Dodajmy nową klasę do projektu, klikamy prawym przyciskiem myszy na gałąź Test Packages w strukturze projektu, następnie wybieramy opcję New -> Java Class… i dodajemy klasę org.holewa.test.SimpleTest.
Kod znajdujący się w niej powinien mieć następującą postać:
import org.testng.annotations.*;
public class SimpleTest {
@Test
public void simpleTest() {
System.out.println(“My simple test.”);
}
}
Zapiszmy plik. Wybierzmy z menu kontekstowego projektu opcję Clean and Build, w logach które pojawią się na dole w okienku zobaczymy podobną treść:
T E S T S
——————————————————-
Running TestSuite
[Parser] Running:
C:\Documents and Settings\raho\My Documents\NetBeansProjects\test\testng.xml
My simple test.
To znak, że nasz test się wykonał, gdy zmienimy kod metody testowej na:
Dostaniemy podobny komunikat do tego:
T E S T S
——————————————————-
Running TestSuite
[Parser] Running:
C:\Documents and Settings\raho\My Documents\NetBeansProjects\test\testng.xml
My simple test.
Tests run: 1, Failures: 1, Errors: 0, Skipped: 0, Time elapsed: 0.297 sec <<< FAILURE!
Results :
Failed tests:
simpleTest(org.holewa.test.SimpleTest)
------------------------------------------------------------------------
[ERROR]BUILD FAILURE
------------------------------------------------------------------------
There are test failures.
Gdy wybierzemy teraz z menu kontekstowego projektu opcję Test ukarze nam się wynik w okienku testów JUnit:
Niestety NetBeans nie posiada wtyczki do obsługi testów TestNG, stąd też pojawiające się okienko JUnit ;(
Ponieważ w mailu który był na samym początku padło stwierdzenie “Dodam jeszcze ze w przegladarce projektow ikona biblioteki TestNG w gorjen czesci jest brazowa, podczas gdy ikony innych - szare”, chciałem wytłumaczyć opisaną w nim sytuację.
Zobaczmy na widoku projektu:
A dokładnie bibliotek które się znajdują w zależnościach. Biblioteki zaznaczone kolorowo to bezpośrednie zależności w naszym pom.xml, biblioteki zaznaczone na szaro to biblioteki które są zależnościami do naszych zależności, stąd też inne ich oznaczenie, gdyż nie wprowadzaliśmy ich do projektu bezpośrednio - wprowadził je twórca dodanej przez nas biblioteki ustawiając je jako zależność bez której jego biblioteka nie może funkcjonować. Gdy chcemy ustawić tą bibliotekę tak aby nie była dodana do naszego projektu możemy to zrobić w bardzo łatwy sposób, wystarczy wybrać w menu kontekstowym biblioteki opcję Exclude Dependency a nasz pom.xml zostanie automatycznie zmodyfikowany. Prawda, że łatwe?
DWR czyli “Easy Ajax for Java”
Jeśli ktoś jeszcze jakimś cudem nie wie co to DWR (Direct Web Remoting) to ten wpis jest dla niego, ponieważ postaram się w nim szybko przedstawić co to jest i jak tego można używać
DWR to biblioteka która pozwala z poziomu JavaScript wywołać metody Java oraz vice versa.
W jaki sposób rozpocząć przygodę z DWR? Najprościej pobrać go ze strony i wykonać kilka kolejnych kroków opisanych w tym wpisie.
Krok 1 - dodanie konfiguracji DWR do web.xml.
Chcąc użyć DWR w naszej webowej aplikacji musimy ją najpierw skonfigurować. Na samym początku wprowadzimy ustawienia do naszego pliku web.xml. Dodajmy do niego ten fragment kodu:
<servlet-name>dwr</servlet-name>
<servlet-class>org.directwebremoting.spring.DwrSpringServlet</servlet-class>
<init-param>
<param-name>debug</param-name>
<param-value>true</param-value>
</init-param>
</servlet>
<servlet-mapping>
<servlet-name>dwr</servlet-name>
<url-pattern>/dwr/*</url-pattern>
</servlet-mapping>
W ten sposób dodaliśmy serwlet DWR do naszej aplikacji. Serwlet ten odpowiada za generowanie plików JavaScript które będą wykorzystane w stronach JSP tworzonych w projekcie.
Krok 2 - Integracja DWR i Spring Framework.
Ponieważ Spring Framework jest szeroko stosowany w projektach opartych o platformę JEE stąd też DWR w łatwy sposób się z nim integruje. Wystarczy dodać do naszego projektu plik zawierający definicję beanów:
<beans xmlns=“http://www.springframework.org/schema/beans”
xmlns:xsi=“http://www.w3.org/2001/XMLSchema-instance”
xmlns:dwr=“http://www.directwebremoting.org/schema/spring-dwr”
xmlns:lang=“http://www.springframework.org/schema/lang”
xsi:schemaLocation=“http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-2.0.xsd
http://www.directwebremoting.org/schema/spring-dwr
http://www.directwebremoting.org/schema/spring-dwr-2.0.xsd”>
<dwr:configuration>
<dwr:convert class=“org.holewa.Sample” type=“bean”/>
</dwr:configuration>
<bean id=“dwrFacade” class=“org.holewa.DwrFacade”>
<dwr:remote javascript=“dwrFacade”>
<dwr:include method=“getData”/>
</dwr:remote>
</bean>
</beans>
W powyższym przykładzie zdefiniowaliśmy jeden bean o nazwie dwrFacade oraz udostępniliśmy dla DWR jedną jego metodę o nazwie getData, domyślnie z uwagi na względy bezpieczeństwa wszystkie metody nie są udostępnione.
Podobnie zresztą ma się sprawa z transfer object`ami - musimy dla nich ustawić konwersję czyli sprawić aby DWR mapował odpowiednie struktury danych z poziomu JavaScript na obiekty Java. W naszym przypadku transfer object Sample zawiera tylko jedną zmienną o nazwie parameter.
Krok 3 - dodanie plików JavaScript do naszych stron JSP.
Aby umożliwić wywołanie metod po stronie serwera należy dodać w stronach JSP taki oto fragment kodu:
<script type=‘text/javascript’ src=‘/dwr/engine.js’></script>
<script type=‘text/javascript’ src=‘/dwr/util.js’></script>
Pliki util.js i engine.js to pliki wchodzące w skład DWR, plik dwrFacade.js to plik który został wygenerowany przez serwlet i to właśnie dzięki funkcją które znajdują się w nim możemy wywołać metodę po stronie serwera.
Krok 4 - wywołanie metody po stronie serwera.
W celu wywołania metody po stronie serwera należy wywołać w przeglądarce następującą funkcję:
var to = {
parameter: param
};
dwrFacade.getData(to, function ( str ) {
dwr.util.byId(elementId).innerHTML = str;
});
}
Powyższy kod definiuje funkcję która jako parametry przyjmuje id elementu którego atrybutowi o nazwie innerHTML chcemy przypisać wartość zwróconą przez wywoływaną przez nas metodę getData. Metoda ta przyjmuje jeden parametr który jest obiektem zawierającym pole (atrybut) o nazwie parameter, podczas przesyłania będzie on przekształcony w obiekt Java dla którego wartości atrybutu parameter będzie równa wartości atrybutu parameter którą ustawiliśmy w JavaScript. Funkcja która zostanie wywołana gdy otrzymamy odpowiedź od serwera (pamiętajmy, że występują tu wywołania asynchroniczne dlatego też mamy do czynienia z callback`ami) jest przekazywana do funkcji dwrFacade.getGetData jako drugi parametr.
Jak widzicie zastosowanie DWR jest niezwykle proste - od jego konfiguracji do wywołania zrobiliśmy właściwie tylko cztery główne kroki
Pisząc ten wpis nie zauważyłem, że na j2ee.pl jest już pewnien opis DWR - dużo dłuższy więc go Wam gorąco polecam a siebie biję w pierś za duplikowanie tematu. ![]()




