Vaadin jako klient webservice I: Przygotowanie projektu

Witam w pierwszej części przewodnika „Vaadin jako klient webservice”. W tej części zajmiemy się przygotowaniem projektu. Jest to ważny etap ponieważ pozwoli on nam na zrozumienie jak działa aplikacja oraz przy okazji poznamy pewne sztuczki związane z optymalizacją aplikacji Vaadin za pomocą Springa.
Cały proces przygotowania można podzielić na kilka etapów.

  • Przygotowanie pom.xml
  • Dodatkowa konfiguracja Vaadin
  • Podstawowa konfiguracja Springa i JPA
  • Wygenerowanie klienta WS za pomocą Axis
  • Posprzątanie wygenerowanych klas i ich konfiguracja jako beanów Springa

Kroki są podane w najwygodniejszej, moim skromnym zdaniem, kolejności. Najlepiej wykonywać je na raz (w ramach jednej sesji kodowania), ponieważ brak któregokolwiek, w przypadku naszej aplikacji, będzie powodował dość nieprzyjemny fail.
Zaczynamy…

Przygotowanie pom.xml

Z linii poleceń generujemy projekt Vaadin. Następnie dodajemy niezbędne zależności do Sprina, JPA2, Hibernate, bazy danych (postgres) oraz dodatkowo wykorzystywany w tym konkretnym miejscu ICEPush. Komponent Vaadin pozwalający na wykonywanie żądań typu push z serwera do przeglądarki (tzw. Comet). To ostatnie rozwiązanie wymaga pobrania komponentu z ICEPush-gwt ze strony icepush.org. Całość na licencji MPL no i trzeba się rejestrować. Jeżeli chcemy korzystać z tego komponentu należy dodatkowo skonfigurować Vaadin.

Dodatkowa konfiguracja Vaadin

Komponent ICEPush wymaga dwóch rzeczy. Po pierwsze należy wymienić klasę servletu obsługującego naszą aplikację. Nowa postać pliku web.xml:

Listing 1. web.xml skonfigurowany dla ICEPush


		Vaadin Application Servlet
		org.vaadin.artur.icepush.ICEPushServlet
		
			Vaadin application class to start
			application
			pl.koziolekweb.vaadin.codecompiler.MyVaadinApplication
		
		
			widgetset
			pl.koziolekweb.vaadin.codecompiler.widgetset.MyAppWidgetSet
		
		1
	

Piękne to nie jest, ale działa. Kolejnym krokiem jest stworzenie pliku MyAppWidgetSet.gwt.xml w wybranym pakiecie. Którym dokładnie? Wszystko jedno, bo to tylko sprawa organizacyjna. Plik ten powinien wyglądać w następujący sposób:

Listing 2. MyAppWidgetSet.gwt.xml skonfigurowany dla ICEPush


	
	
	
	

Ostatni wpis należy usunąć gdy chcemy budować aplikację produkcyjnie. Przy testowaniu lokalnym znacznie przyspiesza pracę.

Czyli podsumowując te dwa etapy. Mamy projekt Vaadin z dodatkowymi modułami, które go pom.xml wygląda tak:

Listing 3. pom.xml skonfigurowany dla projektu


	4.0.0
	pl.koziolekweb.vaadin.codecompiler
	code-compiler
	war
	0.1
	Vaadin Web Application

	
		UTF-8
		3.0.3.RELEASE
	

	
		
			
				org.apache.maven.plugins
				maven-compiler-plugin
				
					1.6
					1.6
				
			
			
				org.apache.maven.plugins
				maven-surefire-plugin
				2.6
				
					
						src/test/testng.xml
					
				
			
			
				org.apache.maven.plugins
				maven-eclipse-plugin
				2.8
				
					true
					true
				
				
					
						eclipse
						clean
						
							clean
							eclipse
						
					
				
			
			
				org.mortbay.jetty
				maven-jetty-plugin
				6.1.24
				
					9966
					code-compiler
					0
					
						/code-compiler
						
							src/main/webapp,${project.build.directory}/${project.build.finalName}
						
					
				
			
			
				org.codehaus.mojo
				gwt-maven-plugin
				1.3-SNAPSHOT
				
					${project.build.directory}/${project.build.finalName}/VAADIN/widgetsets
					-Xmx512M -Xss1024k
					clean
					${project.build.directory}/${project.build.finalName}
					true
					8080
					false
				
				
					
						
							resources
							compile
						
					
				
			
			
				com.vaadin
				vaadin-maven-plugin
				1.0.1
				
					
						
							update-widgetset
						
					
				
			
		
	

	
		
			vaadin-snapshots
			http://oss.sonatype.org/content/repositories/vaadin-snapshots/
			
				false
			
			
				true
			
		
		
			vaadin-addons
			http://maven.vaadin.com/vaadin-addons
		
		
			jboss
			http://repository.jboss.org/maven2
		
	

	
		
		
			com.vaadin
			vaadin
			6.4.7
		
		
			org.vaadin.addons
			icepush
			0.2.0
		
		
			org.icepush
			icepush
			2.0
		
		
			org.icepush
			icepush-gwt
			2.0
		
		
			com.google.gwt
			gwt-user
			2.0.4
			provided
		

		
		
			axis
			axis
			1.4
		

		
		
			org.hibernate.java-persistence
			jpa-api
			2.0-cr-1
		
		
			org.hibernate
			hibernate-entitymanager
			3.5.0-Beta-2
		
		
			postgresql
			postgresql
			8.4-702.jdbc4
		

		
		
			org.springframework
			spring-core
			${spring.version}
		
		
			org.springframework
			spring-web
			${spring.version}
		
		
			org.springframework
			spring-beans
			${spring.version}
		
		
			org.springframework
			spring-context
			${spring.version}
		
		
			org.springframework
			spring-aop
			${spring.version}
		
		
			org.springframework
			spring-context-support
			${spring.version}
		
		
			org.springframework
			spring-tx
			${spring.version}
		
		
			org.springframework
			spring-orm
			${spring.version}
		
		
			org.springframework
			spring-jdbc
			${spring.version}
		
		
			org.springframework
			spring-test
			${spring.version}
		

		
			javax.servlet
			servlet-api
			2.5
		

		
			org.slf4j
			slf4j-api
			1.4.2
		
		
			org.slf4j
			slf4j-log4j12
			1.4.2
		

		
		
			org.testng
			testng
			LATEST
			test
		
		
			org.mockito
			mockito-all
			1.8.1
			test
		
	

Podstawowa konfiguracja Springa i JPA

Przejdźmy teraz do konfiguracji Springa i JPA. Na konfigurację składa się kilka plików. Jednak zanim je pokażę to muszę omówić to jak wygląda classpath w obecnym stanie aplikacji. Otóż jeżeli chcemy prawidłowo skonfigurować aplikację do współpracy z JPA to będziemy musieli stworzyć plik META-INF/persistance.xml. Problem tkwi w tym, gdzie jest prawidłowe położenie katalogu META-INF. Okazuje się, że w musi się on znajdować w ${project.base}/src/main/webapp/WEB-INF/classes/META-INF/. Można to obejść odpowiednio konfigurując resource-plugin. Ja jednak nie miałem na to siły.
Oto lista plików konfiguracyjnych:

  • persistance.xml – konfiguracja JPA.
  • service.properties – konfiguracje różne, których nie chcemy w pliku springa.
  • spring.xml – konfiguracja springa.
  • log4j.xml – konfiguracja log4j.

Jadąc po kolei.

persistance.xml

W wersji dla Postgresa. Pamiętajcie by mieć już założoną bazę danyc.

Listing 4. persistance.xml wersja postgresowa



	
		
			
			
			
			
			
		
	

Później do tego pliku będziemy dopisywać mapowane klasy. To już jednak twój problem by o tym pamiętać 😀

service.properties

Czyli różne ustawienia, które warto mieć gdzieś pod ręką, ale nie koniecznie w pliku springowym.

Listing 5. service.properties

ideone.user=******
ideone.pass=******

Mam tu na razie tylko informacje o danych dostępowych do serwisu.

spring.xml

Konfiguracja springa. Najważniejszy element układanki. Też będzie rósł, ale będę wam mówił co dodałem

Listing 6. spring.xml




	
	
	
	
	
	

	

	

	

	
		
			
		
		
	
	

Na razie tyle wystarczy.

log4j.xml

Wbrew pozorom istotny plik. Jak coś nie bangla i nie sypie błędami to właśnie tu można poszukać przyczyny.

Listing 7. log4j.xml wersja postgresowa





	
		
		
			
		
	

	
		
		
	

	
		
		
	

Wygenerowanie klienta WS za pomocą Axis

Zrób to w Eclipse. W zasadzie tyle. Adres pliku wsdl znajdziesz w dokumentacji lub jak sam go tworzysz to wiesz gdzie jest.

Posprzątanie wygenerowanych klas i ich konfiguracja jako beanów Springa

Wygenerowane klasy mają zapewne brzytkie nazwy i jeszcze gorsze pakiety. Generalnie usuwamy podkreślenia z nazw, a całosć przenosimy do jakiegoś rozsądnego pakietu. Kolejnym etapem jest dopisanie konfiguracji do pliku spring.xml:

Listing 8. Konfiguracja API Ideone w springu

	
	
		
		
	

	
	

	
	

Oczywiście pytanie jak wygląda ServiceUser:

Listing 8. ServiceUser dane do logowania

package pl.koziolekweb.vaadin.codecompiler.data;


public class ServiceUser {

	public final String user;
	public final String pass;

	public ServiceUser(String user, String pass) {
		super();
		this.user = user;
		this.pass = pass;
	}

	public String getUser() {
		return user;
	}

	public String getPass() {
		return pass;
	}

}

No i mamy konfigurację…

Optymalizacja za pomocą Springa

Drugą rzeczą jaką się dziś zajmiemy jest „optymalizacja” aplikacji Vaadin za pomocą Springa. Przez optymalizację rozumiem tu ograniczenie ilości pamięci zużywanej przez Vaadin.
Na początek musimy przypomnieć sobie informacje o tym jak Spring tworzy instancje poszczególnych ziaren. Jedyne co nas interesuje to informacja, że domyślnie każde ziarno jest singletonem. Ta informacja jest ważna z kilku powodów. Po pierwsze musimy pamiętać, że spring nie wie, że pracuje w trybie web oraz, że warto by było gdyby niektóre komponenty dostarczał świeże. Samodzielnie musimy zagwarantować takie zachowanie poprzez odpowiednią konfigurację. Po drugie skoro wiemy, że komponenty GUI powinny być dostarczane na świeżo musimy zobaczyć, które z nich mogą być współdzielone pomiędzy użytkownikami. Zazwyczaj są to komponenty statyczne, których treść nie jest edytowana i nie zależy od stanu sesji użytkownika. Na przykład stopka. Po trzecie należy wiedzieć i pamiętać, że Vaadin przechowuje stan ekranu po stronie serwera! Zatem jeżeli 100 użytkowników otworzy 100 okien (sesji http) to otrzyma np. 100 obiektów stopki. Niby nic, ale dużo. Po stronie serwera będą leżeć identyczne, niemodyfikowalne obiekty w dużych ilościach. Zatem można spokojnie zamienić je na jeden współedzielony obiekt. Spring zadba by nie stała mu się krzywda np. usunięcie z pamięci.

Przykład będzie w kolejnej części w której połączymy się z WS, wywołamy testową metodę oraz zaczniemy budować UI.

Jedna myśl na temat “Vaadin jako klient webservice I: Przygotowanie projektu

Napisz odpowiedź

Twój adres email nie zostanie opublikowany. Pola, których wypełnienie jest wymagane, są oznaczone symbolem *

To create code blocks or other preformatted text, indent by four spaces:

    This will be displayed in a monospaced font. The first four 
    spaces will be stripped off, but all other whitespace
    will be preserved.
    
    Markdown is turned off in code blocks:
     [This is not a link](http://example.com)

To create not a block, but an inline code span, use backticks:

Here is some inline `code`.

For more help see http://daringfireball.net/projects/markdown/syntax