Das Model-View-Presenter-Pattern (MVP) wurde von Google für GWT empfohlen. Es schreibt eine strenge Trennung von View und Presenter vor, die vor allem der Testbarkeit dient. Dieser Vorteil kann auch mit GWT genützt werden, um Logik im Presenter in schnellen Unit-Tests zu überprüfen. Activities und Places helfen in GWT-Applikationen die Browser-History zu verwenden, hängen aber nicht zwingend mit MVP zusammen, wie im Vortrag gezeigt wird.
Zur Internationalisierung von Anwendungen bietet GWT schnelle, typsichere Konzepte. Es wird ein praxisorientierter Einblick gegeben und auf Stolpersteine hingewiesen.
Außerdem wird im Vortrag gezeigt, wie Performance-Probleme des generierten JavaScript-Codes umgangen werden können.
39. Static String Internationalization
• Auflösung vom Compiler
– statische Werte in den generierten Dateien
• Überprüfungen vom Compiler
• Typisierung durch Interfaces
39
54. Pluralformen Beispiel
products[one] = {0} Produkt
products = {0} Produkte
public interface I18nUIMessages extends Messages {
String products(@PluralCount int numProducts);
}
I18nUIMessages messages = GWT.create(I18nUIMessages.class);
lblProducts0.setText(messages.products(0));
lblProducts1.setText(messages.products(1));
lblProducts2.setText(messages.products(2));
54
55. Pluralformen Beispiel
products[one] = {0} Produkt
products = {0} Produkte
0 Produkte
1 Produkt
2 Produkte
products[one] = {0} produit
products = {0} produits
0 produit
1 produit
2 produits
55
56. Select Forms
title[MALE] = Sehr geehrter Herr {0}!
title[FEMALE] = Sehr geehrte Frau {0}!
title = Sehr geehrte Damen und Herren!
public enum Gender {
MALE, FEMALE, UNKNOWN
}
public interface I18nUIMessages extends Messages {
String title(String name, @Select Gender gender);
}
msgs.title("Max Mustermann", Gender.MALE);
Sehr geehrter Herr Max Mustermann!
56
57. HTML in Texten
greeting = Hallo <b>{0}</b>!
public interface I18nUIMessages extends Messages {
String greeting(String name);
}
String name = "<i>XSS-Attacke</i>";
htmlGreeting.setHTML(messages.greeting(name));
Hallo XSS-Attacke!
57
58. SafeHtml
• Vermeiden von XSS
• Wrapper für Strings
– vertrauenswürdiges HTML-Markup
public interface SafeHtml extends Serializable {
String asString();
}
• Zusätzliche Typsicherheit
58
59. HTML in Texten
greeting = Hallo <b>{0}</b>!
public interface I18nUIMessages extends Messages {
SafeHtml greeting(String name);
}
String name = "<i>XSS-Attacke</i>";
htmlGreeting.setHTML(messages.greeting(name));
Hallo <i>XSS-Attacke</i>!
59
60. Grenzen clientseitiger I18N
• Daten die vom Server kommen
– Werte aus einer Datenbank
– Serverseitige Validierungsfehler
60