Programowanie warstwy klienta w aplikacji JavaEE Katedra Mikroelektroniki i Technik Informatycznych Politechniki Łódzkiej ul. Wólczanska 221/223 budynek B18, 90-924 Łódź mgr inż. Robert Ritter
7. Szablony i testowanie Apache Tiles, Freemarker, Velocity JUnit Selenium
Apache Tiles 3 mgr inż. Robert Ritter, ritter@dmcs.pl Jest to szkielet aplikacyjny do tworzenia i zarządzania szablonami stron Służy do ułatwienia generowania interfejsów użytkownika w aplikacjach webowych Pozwala zdefiniować fragmenty stron, które zostaną połączone w całość podczas wykonywania kodu Można używać do dołączania fragmentów stron by zminimalizować duplikowanie kodu Można utworzyć z wykorzystaniem dziedziczenia skomplikowane szablony do wielokrotnego użytku
Apache Tiles (2) 4 mgr inż. Robert Ritter, ritter@dmcs.pl Konfiguracja w Spring <bean id="tilesconfigurer" class="org.springframework.web.servlet.view.tiles2.tilesconfigurer"> <property name="definitions"> <list> <value>/web-inf/defs/general.xml</value> <value>/web-inf/defs/widgets.xml</value> <value>/web-inf/defs/administrator.xml</value> <value>/web-inf/defs/customer.xml</value> <value>/web-inf/defs/templates.xml</value> </list> </property> </bean> <bean id="viewresolver" class="org.springframework.web.servlet.view.urlbasedviewresolver"> <property name="viewclass" value="org.springframework.web.servlet.view.tiles2.tilesview"/> </bean>
Apache Tiles (3) 5 mgr inż. Robert Ritter, ritter@dmcs.pl Konfiguracja szablonu <tiles-definitions> <definition name="default" template="/web-inf/layouts/default.jspx"> <put-attribute name="header" value="/web-inf/views/header.jspx" /> <put-attribute name="menu" value="/web-inf/views/menu.jspx" /> <put-attribute name="footer" value="/web-inf/views/footer.jspx" /> </definition> <definition extends="default" name="newdefault"> <put-attribute name="body" value="/web-inf/views/axiometr/login.jspx"/> </definition> </tiles-definitions>
Apache Velocity 6 mgr inż. Robert Ritter, ritter@dmcs.pl Silnik szablonowania oparty o język Java Mierzy w czyste rozdzielenie warstwy prezentacji i biznesowej w aplikacjach webowych Typowe obszary zastosowań to: o aplikacje webowe strony HTML z miejscami na dynamiczne dane o generowanie kodu źródłowego można generować kod źródłowy Java, SQL, PostScript o wysyłanie wiadomości email do szablonu wiadomości dodawane są dane wygenerowane przez klasy biznesowe o transformacje plików XML zadanie Ant (Anakia), które pozwala odczytać plik XML i udostępnia go w szablonie Velocity
Apache Velocity (2) 7 mgr inż. Robert Ritter, ritter@dmcs.pl Konfiguracja w Spring <bean id="velocityconfig" class="org.springframework.web.servlet.view.velocity.velocityconfigurer"> <property name="resourceloaderpath" value="/web-inf/velocity/"/> </bean> <bean id="viewresolver" class="org.springframework.web.servlet.view.velocity.velocityviewresolver"> <property name="cache" value="true"/> <property name="prefix" value=""/> <property name="suffix" value=".vm"/> </bean>
Apache Velocity (3) 8 mgr inż. Robert Ritter, ritter@dmcs.pl ustawienie zmiennej #set( $a = "Velocity" ) komentarze ## oraz #* *# pobieranie danych z modelu $foo $foo.property $foo.getproperty() $page.settitle( "My Home Page" ) obsługa tablic $myarray.isempty() $myarray.size() $myarray.get(2) $myarray.set(1, 'test') indeksowanie $foo[0] $foo[$i] $foo["bar"] formalna notacja Jack is a ${vicemaniac. cicha referencja $!email dyrektywy #set #if pętle wyrażenia warunkowe
Apache Freemarker 9 mgr inż. Robert Ritter, ritter@dmcs.pl Podobne do Velocity o jest bardziej skomplikowanym narzędziem o bardziej złożonym języku szablonów o posiada szereg gotowych rozwiązań, które w Velocity osiągnąć można poprzez różne obejścia o jeśli używany do tych samych celów, które Velocity obsługuje bez zmian, jest tak samo łatwy w obsłudze Dodatkowo umożliwia: o obsługę pętli, internacjonalizację, obliczenia na liczbach i datach o obsługę makr, sprawdzanie błędów składni o manipulację stringami, mapami oraz listami niezależnie od Javy
Apache Freemarker (2) 10 mgr inż. Robert Ritter, ritter@dmcs.pl Konfiguracja w Spring <bean id="freemarkerconfig" class="org.springframework.web.servlet.view.freemarker.freemarkerconfigurer"> <property name="templateloaderpath" value="/web-inf/freemarker/"/> </bean> <bean id="viewresolver" class="org.springframework.web.servlet.view.freemarker.freemarkerviewresolver"> <property name="cache" value="true"/> <property name="prefix" value=""/> <property name="suffix" value=".ftl"/> </bean>
Bindowanie formularzy 11 mgr inż. Robert Ritter, ritter@dmcs.pl macro VTL definition FTL definition message #springmessage($code) <@spring.message code/> messagetext #springmessagetext($code $text) <@spring.messagetext code, text/> url #springurl($relativeurl) <@spring.url relativeurl/> forminput #springforminput($path $attributes) <@spring.forminput path, attributes, fieldtype/> formhiddeninput * #springformhiddeninput($path $attributes) <@spring.formhiddeninput path, attributes/> formpasswordinput * #springformpasswordinput($path $attributes) <@spring.formpasswordinput path, attributes/> formtextarea #springformtextarea($path $attributes) <@spring.formtextarea path, attributes/> formsingleselect formmultiselect formradiobuttons #springformsingleselect( $path $options $attributes) #springformmultiselect($path $options $attributes) #springformradiobuttons($path $options $separator $attributes) <@spring.formsingleselect path, options, attributes/> <@spring.formmultiselect path, options, attributes/> <@spring.formradiobuttons path, options separator, attributes/> formcheckboxes #springformcheckboxes($path $options $separator $attributes) <@spring.formcheckboxes path, options, separator, attributes/> formcheckbox #springformcheckbox($path $attributes) <@spring.formcheckbox path, attributes/> showerrors #springshowerrors($separator $classorstyle) <@spring.showerrors separator, classorstyle/>
JUnit 12 mgr inż. Robert Ritter, ritter@dmcs.pl Szkielet aplikacyjny do testowania oprogramowania za pomocą unit test testów jednostkowych Umożliwia oddzielenie testu od kodu i przetestowanie wybranego fragmentu aplikacji Umożliwia wygenerowanie raportów z przebiegu testu Jest wspierany przez wiele środowisk programistycznych Funkcjonalność zawarta jest w pliku JAR dołączanym do projektu Aby przetestować funkcjonalność bez wpływu zależności danej funkcjonalności należy stosować mock-objects o jednym ze szkieletów aplikacyjnych służącym do tworzenia obiektów zastępczych jest Mockito o w aplikacjach webowych można korzystać z JSMock
JUnit (2) 13 mgr inż. Robert Ritter, ritter@dmcs.pl Przykładowy test import org.junit.*; public class TestFoobar{ @BeforeClass public static void setupclass() throws Exception { // Code executed before the first test method @Before public void setup() throws Exception { // Code executed before each test @Test public void testonething() { // Code that tests one thing @Test public void testanotherthing() { // Code that tests another thing @Test public void testsomethingelse() { // Code that tests something else @After public void teardown() throws Exception { // Code executed after each test @AfterClass public static void teardownclass() throws Exception { // Code executed after the last test method
Selenium 14 mgr inż. Robert Ritter, ritter@dmcs.pl Szkielet aplikacyjny do testowania aplikacji webowych Testy można napisać w języku Selenium, w wielu popularnych językach (C#, Java, Perl) lub nagrać kolejność działań i później odtworzyć Posiada swoje środowisko programistyczne zaimplementowane jako plugin do Firefoxa Selenium WebDriver służy do wysyłania poleceń do przeglądarki. Korzysta w tym celu z lokalnie zainstalowanej przeglądarki Można ustawić serwer z instancjami przeglądarek za pomocą Selenium Grid
Selenium (2) 15 mgr inż. Robert Ritter, ritter@dmcs.pl Przykład testu public class Example { public static void main(string[] args) { // Create a new instance of the html unit driver // Notice that the remainder of the code relies on the interface, // not the implementation. WebDriver driver = new HtmlUnitDriver(); // And now use this to visit Google driver.get("http://www.google.com"); // Find the text input element by its name WebElement element = driver.findelement(by.name("q")); // Enter something to search for element.sendkeys("cheese!"); // Now submit the form. WebDriver will find the form for us from the element element.submit(); // Check the title of the page System.out.println("Page title is: " + driver.gettitle());
Selenium (3) 16 mgr inż. Robert Ritter, ritter@dmcs.pl Przykład testu z użyciem JavaScript public class GoogleSuggest { public static void main(string[] args) throws Exception { // The Firefox driver supports javascript WebDriver driver = new FirefoxDriver(); // Go to the Google Suggest home page driver.get("http://www.google.com/webhp?complete=1&hl=en"); // Enter the query string "Cheese" WebElement query = driver.findelement(by.name("q")); query.sendkeys("cheese"); // Sleep until the div we want is visible or 5 seconds is over long end = System.currentTimeMillis() + 5000; while (System.currentTimeMillis() < end) { WebElement resultsdiv = driver.findelement(by.classname("gssb_e")); // If results have been returned, the results are displayed in a drop down. if (resultsdiv.isdisplayed()) { break; // And now list the suggestions List<WebElement> allsuggestions = driver.findelements(by.xpath("//td[@class='gssb_a gbqfsf']")); for (WebElement suggestion : allsuggestions) { System.out.println(suggestion.getText());
QUnit 17 mgr inż. Robert Ritter, ritter@dmcs.pl Szkielet aplikacyjny do testowania kodu JavaScript zdolny do testowania dowolnych skryptów test( "hello test", function() { ok( 1 == "1", "Passed!" ); );