GWT speed up

GWT, Java Komentarze (1) »

Ostatnimi czasy dość często muszę kompilować projekt który piszę w GWT - sprawa jest dość uciążliwa bo zajmuje około 6 min, a zdarza mi się robić to kilka a nawet kilkanaście razy dziennie.
Jako że na ogół w trakcie pisania testuje siebie ficzery lub ich kawałki pod jedną przeglądarką (FF) nie potrzebuje ani obsługi wielu języków ani wielu przeglądarek.
Dodatkowo aplikacja może chodzić nieco wolniej niż na produkcji. Godzę się na te kompromisy by zyskać sporo na czasie kompilacji. Jak wiemy każda przerwa wytrąca z rytmu pracy jeśli jest za długa (u mnie już minuta wystarcza :) ). Poniżej kilka sposobów aby nie tracić niepotrzebnie focus’u podczas kompilacji.

Przyspieszanie kompilacji GWT:

  • komentujemy wszystkie języki - czas spadł do 2min 30sec
    
    
  • ustawiamy tylko jedna przeglądarkę (u mnie Firefox)- czas spadł do 40sec
    
    
  • pomijamy optymalizację GWT - czas spadł do 23sec
    
    
    

Całkiem spory zysk: dla przypomnienia startowaliśmy z około 6 minut a skończyliśmy na 23 sekundach - mnie to zadowala :)
A wy jakie macie sposoby by przyspieszyć kompilację ?

GWT 2.1

GWT Komentarze (0) »

Dostępne jest juz finalne wydanie najnowszego GWT oznaczone numerkiem 2.1

Co nowego ?

- Cell Widgets - czyli kilka ciekawych widgetów których zawsze brakowało w GWT

- Wsparcie dla MVP

- Request Factory - to ma być alternatywa dla GWT-RPC - muszę się temu bliżej przyjrzeć

- integracja z SpringRoo

i kilka innych zmian :)

GWT - upload plików

GWT, Java Komentarze (1) »

Pisałem niedawno małą aplikację webową na zlecenie. Aplikacja była oczywiście napisana w GWT :) Z rzeczy, których wcześniej nie pisałem aplikacja musiała korzystać z Hibernate i uploadwać pliki na serwer. No i z czym miałem najwięcej problemów ? Właśnie z uploadem :( Hibernate okazał się bardzo fajnym narzędziem (ale o tym pewnie osobny wpis kiedyś będzie). Ok więc najpierw jak zrealizować fileupload w GWT, a potem co ja spartoliłem :)

Ok wiec najpierw przyjrzyjmy się części po stronie klienta. GWT dostarcza nam komponent FileUpload, który zajmie się czarą robotą przy uploadzie. Co jest istotne ? Żeby dało się coś przesłać na serwer musimy umieścić to w formularzu, (klasa FormPanel). Musimy nadać formularzowi odpowiednią akcję tj. podać url-pattern do servletu, który zajmie się odebraniem pliku i zapisaniem go na serwerze. Oczywiście do przesyłania pliku użyjemy metody POST :)

[java]

final FileUpload plik = new FileUpload();

final FormPanel form = new FormPanel();
form.setAction("fileupload");
form.setEncoding(FormPanel.ENCODING_MULTIPART);
form.setMethod(FormPanel.METHOD_POST);

form.setWidget(plik);

//Gdy chcemy wysłać formularz z plikiem(np po kliknięciu na przycisk) wywołujemy:

form.submit();

[/java]
Jaki był mój błąd skoro cały ten upload jest taki prosty ? Najpierw zrobiłem sobie GUI, nie było FormPanelu tylko w głównym panelu miałem dodany FileUpload. Podczas zmian zapomniałem usunąć this.add(plik), i w ten sposób FileUpload zamiast znajdować się w formularzu znajdował się w głównym panelu. Wyglądało tak jak trzeba - ale nie działało :) Kilka godzin myślałem co jest nie tak.

Ok. Jak wygląda servlet odbierający nasz plik? Skoro przesyłamy plik o trzeba w nim zaimplementować swoją metodę doPost(). A servlet wygląda tak:

[java]

public class FileUploadServlet extends HttpServlet {
private static final long serialVersionUID = 3404817164861510193L;

@SuppressWarnings("unchecked")
protected void doPost(HttpServletRequest req, HttpServletResponse resp)
throws ServletException, IOException {

if (ServletFileUpload.isMultipartContent(req)) {

FileItemFactory factory = new DiskFileItemFactory();

ServletFileUpload upload = new ServletFileUpload(factory);

try {
List<FileItem> items = upload.parseRequest(req);
for (FileItem item : items) {
if (item.isFormField()) continue;
String fileName = item.getName();
if (fileName != null) {
fileName = FilenameUtils. getName(fileName);
}

File uploadedFile = new File(getServletContext().getRealPath(getServletContext().getContextPath()), fileName);
if (uploadedFile.createNewFile()) {
item.write(uploadedFile);
resp.setStatus(HttpServletResponse.SC_CREATED);
resp.getWriter().print("The file was created successfully.");
resp.flushBuffer();
} else
throw new IOException("The file already exists in repository.");
}
} catch (Exception e) {
resp.sendError(HttpServletResponse.SC_INTERNAL_SERVER_ERROR,
"An error occurred while creating the file : " + e.getMessage());
e.printStackTrace();
}

} else {
resp.sendError(HttpServletResponse.SC_UNSUPPORTED_MEDIA_TYPE,
"Request contents type is not supported by the servlet.");
}
}

@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp)
throws ServletException, IOException {
super.doGet(req, resp);
}

}

[/java]

Nowe GWT, nowe problemy ;/

GWT, Java Komentarze (2) »

W końcu zabrałem się za projekt na MASI (Modelowanie i Analiza Systemów Informatycznych). Teoretycznie jest to kontynuacja projektu Desty z Programowania Zespołowego, teoretycznie dlatego, że kontynuowana jest w zasadzie tylko idea praktycznie cały kod mamy zamiar pisać od nowa.  No i jako, że od nowa to przecież nie będę pisał w przestarzałej wersji GWT tylko w najnowszej.  Desty 1.0 był pisany w GWT 1.4 albo 1.5, teraz dostępna jest juz wersja 2.0, i muszę przyznać, że sporo się pozmieniało.

A o to pierwszy problem na jaki się natknąłem:

Stworzyłem klasę która w zasadzie ma działać tylko jako DTO . No i jednym z “fieldów” miałbyć ArrayList<String>. Żeby obiekty takiej klasy puścić przez GWT RPC w starym GWT nie trzeba było robić nic więcej poza konstruktorem bez argumentowym, W nowym GWT dostaniemy ładny exeption, coś w stylu:

'fullpacketclassname.NaszaKlasa' was not included in the set of types which can be serialized by this
SerializationPolicy. For security purposes, this type will not be serialized.

Więc co trzeba zrobić, żeby dało się używać wszelkiego rodzaju Array’i ?

Musimy przed polem z arrayem dodać JavaDoc’owa adnotację

@gwt.Args<typ_z_pakietem_>

i po co takie utrudnienie ? Mam nadzieje, że dzięki temu wpisowi ktoś zaoszczędzi trochę czasu na szukaniu przyczyny błędu.

EDITED:

Zacząłem się zastanawiać czy owa adnotacja jest nowością w GWT 2.0 i wychodzi na to, że nie.  Widocznie w poprzedniej wersji projektu nie przesyłaliśmy naszych klas które zawierają array’ie, a jedynie Array’ie złożone z naszych klas.

GWT 1.7

GWT, Google, Info, Wtyczki do eclipse Komentarze (0) »

Wyszła “nowa” wersja Google Web Toolkit oznaczona numerkiem 1.7. Dlaczego użyłem cudzysłowu ? Ano dlatego, że tak w zasadzie jest to GWT 1.6 z poprawioną obsługą dla najnowszych wersji przeglądarek: Internet Explorer 8,
Firefox 3.5, i Safari 4

Zamiana biblioteki z 1.6 na 1.7 nie powinna wymagać zmian w kodzie !! Jedyne co trzeba zrobić to ponowna kompilacja do JavaScript’u.

GWT + Google AppEngine

Eclipse, GWT, Google, Java Komentarze (0) »

Mam chwile to opisze jak wystartować z Google Web Toolkit. Jakoś po prezentacjach z Programowania Zespołowego ktoś mnie poprosił żebym przybliżył troche GWT w wolnym czasie. Wtedy pisałem jeszcze w GWT 1.5 i porzadnego “Hello World” z uwzględnieniem komunikacji przez RPC nie dało się zrobić tak jak teraz w kilka sekund. No dobra to co bedzie nam potrzebne ? Nie wiele ; ] Odpalamy eclipse’a i doinstalowujemy plugin podając eclipsowi ten url: http://dl.google.com/eclipse/plugin/3.4 . OK gdy już mamy zainstalowany plugin i zresetujemy eclipse’a pojawią nam się m.in 3 nowe ikonki:

  • New Web Aplication Project
  • GWT Compile Project
  • Deploy App Engine Project

Aby stworzyć przykładowy projekt klikamy na New Web Aplication Project lub tradycyjnie tworzymy projekt poprzez New -> Other… -> Google -> Web Application Project. Wpisujemy nazwę i pakiet- zwróćmy uwage by pozostawić zaznaczone checkboxy przy Use Google Web Toolkit i Use Google App Engine gdyż bez nich nie stworzy nam się przykład korzystający z GWT a jedynie przykładowy servlet. No dobra po kliknięciu na Finish mamy już gotową aplikacje w GWT która korzysta z RPC do komunikacji z serwerem. Szkoda że nie było tak fajnie gdy zaczynałem zabawe z GWT - żeby takie coś uzyskać to dosyć długo się naszukałem : ) No ale ok przyjrzyjmy się temu co nam sie wygenerowało. Po pierwsze wygenerowały nam się 3 pakiety w moim przypadku są to:

  • pl.kedziorski.examples.GWT (w tym pakiecie znajduje się plik xml opisujący moduł GWT)
  • pl.kedziorski.examples.GWT.client (klasy klienckie - kompilowane do JavaScript’u)
  • pl.kedziorski.examples.GWT.server (klasy serwerowe - serwlety i to co obliczane po stronie serwera)

[xml]

<module rename-to=’gwt_hello’>
<inherits name=’com.google.gwt.user.User’/>
<inherits name=’com.google.gwt.user.theme.standard.Standard’/>
<entry-point class=’pl.kedziorski.examples.GWT.client.GWT_Hello’/>
</module>

[/xml]

Tag inherits definiuje z z jakich modułów ma dziedziczyć nasz moduł, tag entry-point natomiast definiuje strone startową / punkt wejścia. To ta klasa będzie wywoływana po odwołaniu do modułu.W pakiecie serwera wygenerowała nam się klasa GreetingServiceImpl.java :

[java]

public class GreetingServiceImpl extends RemoteServiceServlet implements
GreetingService {

public String greetServer(String input) {
String serverInfo = getServletContext().getServerInfo();
String userAgent = getThreadLocalRequest().getHeader("User-Agent");
return "Hello, " + input + "!<br><br>I am running " + serverInfo
+ ".<br><br>It looks like you are using:<br>" + userAgent;
}
}

[/java]

Servlet dziedziczący po RemoteServiceServlet z jedna metodą. Od normalnych (nie w GWT) servletów odróznia go jeszcze to, że implementuje interface GreetingService znajdujący się w pakiecie klienckim. W tej klasie bedą wszystkie metody do komunikacji z serwerem. W pakiecie klienckim znajdują się 3 pliki.

Wspomniany wcześniej interface GreetingServic.java

[java]

public interface GreetingService extends RemoteService {
String greetServer(String name);
}

[/java]

Jego asynchroniczna wersja GreetingServiceAsyn.java

[java]

public interface GreetingServiceAsync {
void greetServer(String input, AsyncCallback<String> callback);
}

[/java]

Oba interfejsy musze deklarować te same metody z tym że w wersji asynchronicznej zamiast typu zwracanego dorzucamy jeden argument typu AsyncCallback<typ_tego_co_zwraca_metoda>.

Jest tu jeszcze nasza klasa wejścia GWT_Hello.java z której powybieram tylko ważniejsze części.

[java]

public class GWT_Hello implements EntryPoint {

////////////////////////////////////////////////////

private final GreetingServiceAsync greetingService = GWT
.create(GreetingService.class);

////////////////////////////////////////////////////

public void onModuleLoad() {/*wyciety kod*/}

////////////////////////////////////////////////////

greetingService.greetServer(textToServer,
new AsyncCallback<String>() {
public void onFailure(Throwable caught) {

}

public void onSuccess(String result) {

}
});

}

[/java]

Klasa jest punktem wejścia więc implementuje EntryPoint stąd też metoda onModuleLoad() - która jest jakby odpowiednikiem main’a. AsyncCallback wymaga zaimplementowania 2 funkcji onFailure() i onSuccess() które zostaną wywołane w zależności od tego czy uda nam się przesłać dane z serwera czy też nie (bo akurat nam się router zrestartował np).  To by było chyba tyle jeśli chodzi o sturtup w GWT. Teraz możemy odpalić nasz projekt klikając na zwykły eclipsowy Run ; ] Projekt włączy nam się w tzw. Hosted mode, czyli mówiąc w duuuużym skrócie uruchamiamy go z klas Javy bez kompilacji do JavaScript co m.in umożliwia bardzo wygodne debugowanie np z eclipse’a. Aby umieścić aplikacje na serwerze trzeba by ją skompilować (np klikając wspomniany na początku nowy przycisk) albo bezpośrednio wrzucić na serwer Google App Engine (3. z nowych przycisków).

Google App Engine

GWT, Google, Java Komentarze (0) »

Nie pamietam już kiedy złożyłem request do Googla o konto na App Engine - w każdym bądź razie dostałem je po paru dniach. Potem reqest żeby obsługa Javy działała i …. nic. A tu dziś patrze DZIAŁA. W sumie możliwe że juz ze 2-3 miesiace - nie sprawdzałem długo : ( Ale skoro działa to mam hosting na którym moge stawiać coś Javowego : )

Tak więc zaraz po zaliczeniu sesji (jeszcze D mi zostało: ) ) zabieram się za jakąś aplikacje w GWT, w międzyczasie czytając Head Firs Servlets & JSP.

Film z prezentacji z Programowania Zespołowego

GWT, Java Komentarze (0) »

Nie dalej jak 3 dni temu UMK TV udostępniło po ponad miesiącu nagrania z prezentacji projektów z Programowania Zespołowego na mojej uczelni (UMK). Na stronie UMK TV możecie zobaczyć prezentacje wszystkich zespołów. Poniżej tak jak obiecałem wstawiam filmik z prezentacji mojego zespołu - tak więc zapraszam do obejrzenia i komentowania. Tak od 4 minuty zaczynam chwile mówić ja : ) I trzeba przyznać że stresujące są takie prezentacje - szczególnie pytania. Zresztą sami zobaczcie.

PS. Widzę że rozmiar filmu jest ciut za duży i menu się przez to wykrzacza, tak więc dam linka do podstrony gdzie znajduje się filmik : (
- u mnie na blogu: tu
- na UMK TV : tu (można oceniać)

3. miejsce w Programowaniu Zespołowym

GWT, Inne, Java Komentarze (0) »

W dniach 7-8 maja 2009 roku na moim wydziale odbywały się prezentacje projektów powstałych podczas trwania przedmiotu Programowanie Zespołowe. W prezentacjach udział wzięło 12 zespołów. Mam zaszczyt oznajmić iż mój zespół zajął 3. miejsce.

Skład mojego zespołu:

  • dr Krzysztof Benedyczak - opiekun zespołu
  • Robert Mroczka - programista silnika aplikacji, algorytmu wyznaczania tras
  • Łukasz Kama - baza danych, programista Hibernate
  • Tomasz Stasiak - programista aplikacji mobilnej
  • Mateusz Lewandowski - webmaster, programista GWT, parser rozkładu HTML
  • oraz ja Krzysztof Kędziorski - kierownik zespołu, programista GWT i Google Maps API

Nasz projekt nosi nazwę “Desty” - jest to aplikacja wspomagająca przemieszczanie się przy użyciu środków komunikacji miejskiej w Toruniu. Aplikacja składa się z kilku części.

Desty

View more presentations from kedziorski.

Klient webowy został w całości zrealizowany używając Google Web Toolkit oraz Google Maps API. Do komunikacji z serwerem wykorzystaliśmy GWT-RPC.

Będąc szczerym nie spodziewałem się, że zajmiemy tak wysoką pozycję - było kilka naprawdę ciekawych projektów. Nasza aplikacja z założenia miała być prosta i intuicyjna i to nam się udało. Nie wszystkie funkcje udało się nam jednak zaimplementować - niestety czas grał na naszą niekorzyść - o lenistwie zespołu nie wspominając :) Postaram się umieścić tu filmik z naszej prezentacji jak tylko zostanie nam udostępniony.

Silnik: Wordpress - Theme autorstwa N.Design Studio. Spolszczenie: Adam Klimowski.
RSS wpisów RSS komentarzy Zaloguj








2zł Nordic Gold