GWT Project: Unterschied zwischen den Versionen

Aus Wiki - Jochen Hammann
Zur Navigation springen Zur Suche springen
(Die Seite wurde neu angelegt: „__TOC__ == Stoppen der Event Propagation == Zum unterdrücken der Weiterleitung von Events an Parent Controls bzw. Panel kann die Methode <code>stopPropagat…“)
 
 
(2 dazwischenliegende Versionen desselben Benutzers werden nicht angezeigt)
Zeile 74: Zeile 74:
== Flash abfragen ==
== Flash abfragen ==


Das folgende Code Snippet zeigt eine Möglichkeit mit Hilfe der JavaScript Bibliothek <swfobject> (http://code.google.com/p/swfobject/) abzufragen, ob Flash aktiviert ist. Die JavaScript <swfobject> wird u.a. von ExtGWT (GXT) 2.2.3 für deren Charting mitgebracht.
Das folgende Code Snippet zeigt eine Möglichkeit mit Hilfe der JavaScript Bibliothek [http://code.google.com/p/swfobject/ swfobject] abzufragen, ob Flash aktiviert ist. Die JavaScript Bibliothek '''swfobject'''  wird u.a. von ExtGWT (GXT) 2.2.3 für deren Charting mitgebracht.
    public static native boolean isFlashEnabled()
 
    /*-{
<syntaxhighlight lang="java">
        if ($wnd.swfobject.hasFlashPlayerVersion("9.0.0"))
public static native boolean isFlashEnabled()
            return true;
/*-{
        else
    if ($wnd.swfobject.hasFlashPlayerVersion("9.0.0"))
            return false;
        return true;
    }-*/;
    else
Probleme mit Image.getUrl() in Internet Explorer 7
        return false;
}-*/;
</syntaxhighlight>
 
 
== Probleme mit Image.getUrl() in Internet Explorer 7 ==
 
Der IE7 unterstützt keine “data”-URLs. In Verbindung mit Image Bundles und der Methode Image.getUrl() kommt es unter IE7 zu dem Problem, dass der koplette Image Sprite dargestellt wird und nicht nur das jeweilige Teilbild - d.h. die jeweilige ImageResource.
Der IE7 unterstützt keine “data”-URLs. In Verbindung mit Image Bundles und der Methode Image.getUrl() kommt es unter IE7 zu dem Problem, dass der koplette Image Sprite dargestellt wird und nicht nur das jeweilige Teilbild - d.h. die jeweilige ImageResource.
Soll ein Bild in ein HTML Widget eingefügt werden, so gibt es zwei Möglichkeiten. Zum einen kann lediglich die URL des Bildes via Image.getUrl() in den HTML String eingefügt werden. Zum anderen kann das komplette <img> Tag via Image.toString() in den HTML String eingefügt werden.
 
Soll ein Bild in ein HTML Widget eingefügt werden, so gibt es zwei Möglichkeiten. Zum einen kann lediglich die URL des Bildes via <code>Image.getUrl()</code> in den HTML String eingefügt werden. Zum anderen kann das komplette <code><img></code> Tag via <code>Image.toString()</code> in den HTML String eingefügt werden.
 
Ersteres führt beim IE7 zu den oben erwähnten Problemen. D.h. der zweite Ansatz muss verwendet werden, wenn der IE7 durch die Web Applikation unterstützt werden soll.
Ersteres führt beim IE7 zu den oben erwähnten Problemen. D.h. der zweite Ansatz muss verwendet werden, wenn der IE7 durch die Web Applikation unterstützt werden soll.
XML Verarbeitung und Firefox’ 4096 Zeichen Limit
 
== XML Verarbeitung und Firefox’ 4096 Zeichen Limit ==
 
Bei der Verarbeitung von XML in GWT muss dringend auf ein Limit des Firefox geachtet werden. Dieser hat für den in einem XML Tag enthaltenen Text ein Limit von 4096 Zeichen. Ist der Text länger, so legt Firefox mehrere Textblöcke (XML Geschwister) mit jeweils maximal 4096 Zeichen an. Das folgende Code-Snippet zeigt einen möglichen Workaround.
Bei der Verarbeitung von XML in GWT muss dringend auf ein Limit des Firefox geachtet werden. Dieser hat für den in einem XML Tag enthaltenen Text ein Limit von 4096 Zeichen. Ist der Text länger, so legt Firefox mehrere Textblöcke (XML Geschwister) mit jeweils maximal 4096 Zeichen an. Das folgende Code-Snippet zeigt einen möglichen Workaround.
    /**
 
    * This utility method is used to work around a limitation in Firefox during the processing of
<syntaxhighlight lang="java">
    * XML. Firefox limits the length of a XML text node to 4096 characters. Thus if a XML node
/**
    * contains more than 4096 characters, Firefox splits the respective node in several nodes with
* This utility method is used to work around a limitation in Firefox during the processing of
    * a maximum of 4096 characters each.
* XML. Firefox limits the length of a XML text node to 4096 characters. Thus if a XML node
    *  
* contains more than 4096 characters, Firefox splits the respective node in several nodes with
    * Hint: This Firefox limitation is discussed at the following web sites:
* a maximum of 4096 characters each.
    *  
*  
    * "Issue 719: node.getNodeValue() limited in FireFox to 4096 characters. If length is longer it gets truncated."
* Hint: This Firefox limitation is discussed at the following web sites:
    * (http://code.google.com/p/google-web-toolkit/issues/detail?id=719)
*  
    *  
* "Issue 719: node.getNodeValue() limited in FireFox to 4096 characters. If length is longer it gets truncated."
    * "Firefox 4k XML node limit" (http://www.coderholic.com/firefox-4k-xml-node-limit/)
* (http://code.google.com/p/google-web-toolkit/issues/detail?id=719)
    *  
*  
    * @param xmlNode
* "Firefox 4k XML node limit" (http://www.coderholic.com/firefox-4k-xml-node-limit/)
    *            The XML node.
*  
    * @return The merged text of the specified XML node.
* @param xmlNode
    */
*            The XML node.
    private static String getNodeText(Node xmlNode)
* @return The merged text of the specified XML node.
    {
*/
        // Verify the given XML node.
private static String getNodeText(Node xmlNode)
        if (xmlNode == null)
{
            return "";
    // Verify the given XML node.
        // Get all portions of the text data.
    if (xmlNode == null)
        StringBuilder result = new StringBuilder(4096);
        return "";
        NodeList nodes = xmlNode.getChildNodes();
    // Get all portions of the text data.
        for (int i = 0; i < nodes.getLength(); ++i)
    StringBuilder result = new StringBuilder(4096);
            result.append(nodes.item(i).getNodeValue());
    NodeList nodes = xmlNode.getChildNodes();
        return result.toString();
    for (int i = 0; i < nodes.getLength(); ++i)
    }
        result.append(nodes.item(i).getNodeValue());
Mit Fiddler eine GWT Web Applikation debuggen
    return result.toString();
Zur Verwendung von Fiddler als Proxy muss in der Eclipse Run/Debug-Konfiguration der jeweiligen Web Applikation folgende Parameter für die Java Virtual Machine (Tab “Arguments”, Option “VM arguments”) konfiguriert werden:
}
-DproxySet=true -Dhttp.proxyHost=127.0.0.1 -Dhttp.proxyPort=8888
</syntaxhighlight>
 
 
== Mit Fiddler eine GWT Web Applikation debuggen ==
 
Zur Verwendung von Fiddler als Proxy müssen der Java Virtual Machine folgende Parameter übergeben werden:
 
<syntaxhighlight lang="text">
-Dhttp.proxyHost=localhost
-Dhttp.proxyPort=9999
-Dhttp.nonProxyHosts=              // Leer lassen, wenn die Proxy auf localhost läuft!
 
-Dhttps.proxyHost=localhost
-Dhttps.proxyPort=9999
-Dhttps.nonProxyHosts=              // Leer lassen, wenn die Proxy auf localhost läuft!
</syntaxhighlight>

Aktuelle Version vom 29. September 2016, 08:00 Uhr


Stoppen der Event Propagation

Zum unterdrücken der Weiterleitung von Events an Parent Controls bzw. Panel kann die Methode stopPropagation() der Klasse com.google.gwt.dom.client.NativeEvent verwendet werden: API Reference


EventBus

Beim Hinzufügen von Event Handler und dem Feuern von Events ist folgendes unbedingt zu beachten:

Der SimpleEventBus implementiert einen fireDepth Zähler, welcher verwendet wird, die Verschachtelung der Event-Verarbeitung zu verfolgen. Wird ein Event vom Event Bus bearbeitet (Methode fire() bzw. intern doFire()), so wird dieser Zähler um eins inkrementiert. Am Ende der Verarbeitung wird dieser Zähler wieder um eins dekrementiert. D.h. wird innerhalb der Verarbeitung eines Event ein neues Event gefeuert, so wird dieser Zähler abermals inkrementiert, usw.

Ist dieser Zähler beim Aufruf einer Methode des SimpleEventBus größer als eins, so wurde diese Methode innerhalb der Verarbeitung eines anderen Event aufgerufen. Diese Tatsache hat insbesondere beim Hinzufügen eines neuen Event Handlers eine Bedeutung. Bemerkt die Methode addHandler() (intern doAdd()), dass diese innerhalb der Verarbeitung eines anderen Event aufgerufen wird (d.h. fireDepth größer als Null ist), so wird das Hinzufügen des Event Handler - mit Hilfe des Command Pattern - zurückgestellt, bis die Verarbeitung des ersten Events in der Verarbeitungshierarchie beendet wurde (d.h. bis fireDepth wieder auf null ist). Das Ende der Verarbeitung des zuerst gefeuerten Events fügt die zurückgestellten Handler letztendlich in den Event Bus ein. Dies erfolgt am Ende der internen Methode doFire().

Dies kann zu einem Problem werden, wenn innerhalb der Verarbeitung eines Events ein neuer Event Handler registriert und zusätzlich der dazugehörende Event gefeuert wird. Da die Registrierung des neuen Event Handler zurückgestellt wird, “fliegt” das dazugehörende Event ohne Bearbeitung durch den Event Bus. Der Event Handler wird erst dann registriert, wenn die umschließende Event-Verarbeitung abgeschlossen ist.


Messages

[GWT 2.2.0] Aus unbekannten Gründen bringt die Verwendung der Messages.Select Annotation Probleme mit sich. Die Verwendung lediglich eines @Selection Parameters in der jeweiligen Message-Methode liefert stets die Default Message - unabhängig vom Wert des @Selection Parameters. Tests zeigten, dass die Verwendung eines weiteren @PluralCount @Optional Parameters einen Workaround darstellt. Der folgende Code-ausschnitt zeigt diesen Workaround.

/**
 * ScheduleViewModel - Session Modes
 * 
 * Caution:
 * Because of unknown reasons, the following method returns always the default message, if the
 * dummy parameter is omitted. Tests showed, that this extra dummy parameter fixes this problem.
 */
@DefaultMessage("Error: Message not specified")
@AlternateMessage({"DESKTOP_AS_LOGGED_IN_USER|0|one", "as logged in user within the existing Desktop session",
                   "DESKTOP_AS_SYSTEM|0|one", "as system user within the existing Desktop session",
                   "DESKTOP_AS_USER|0|one", "as user within the existing Desktop session",
                   "SESSION_AS_DEFAULT|0|one", "in a hidden session",
                   "SESSION_AS_USER|0|one", "as user in a hidden session",
                   "DESKTOP_AS_LOGGED_IN_USER|1|one", "as logged in user within the existing Desktop session",
                   "DESKTOP_AS_SYSTEM|1|one", "as system user within the existing Desktop session",
                   "DESKTOP_AS_USER|1|one", "as user within the existing Desktop session",
                   "SESSION_AS_DEFAULT|1|one", "in a hidden session and requires the Shell",
                   "SESSION_AS_USER|1|one", "as user in a hidden session and requires the Shell"})

String sessionMode(@Select SessionMode sessionMode, @Select int requiresShell, @PluralCount @Optional int dummy);


Click-Listener auf HTML-Link

Möchte man einen Click-Listener auf einen Link (<a> Tag) innerhalb eines HTML Textes hinzufügen, so kann das HTMLPanel in Verbindung mit der Klasse Anchor (beide im GWT enthalten) verwendet werden. Das HTMLPanel bietet die Möglichkeit, während des Hinzufügen eines Widget ein bestehendes HTML Elemente auszutauschen.

Der folgende Quellcode-Ausschnitt zeigt dieses Vorgehen.

public void onModuleLoad()
{
    HTMLPanel htmlPanel = new HTMLPanel("This is a <span id=\"toBeReplaced\">_link_</span>");
    Anchor anchor = new Anchor("link");
    anchor.addClickHandler(new ClickHandler()
    {
        @Override
        public void onClick(ClickEvent event)
        {
        }
    });
    
    htmlPanel.addAndReplaceElement(anchor, "toBeReplaced");
    
    RootPanel.get().add(htmlPanel);
}


Flash abfragen

Das folgende Code Snippet zeigt eine Möglichkeit mit Hilfe der JavaScript Bibliothek swfobject abzufragen, ob Flash aktiviert ist. Die JavaScript Bibliothek swfobject wird u.a. von ExtGWT (GXT) 2.2.3 für deren Charting mitgebracht.

public static native boolean isFlashEnabled()
/*-{
    if ($wnd.swfobject.hasFlashPlayerVersion("9.0.0"))
        return true;
    else
        return false;
}-*/;


Probleme mit Image.getUrl() in Internet Explorer 7

Der IE7 unterstützt keine “data”-URLs. In Verbindung mit Image Bundles und der Methode Image.getUrl() kommt es unter IE7 zu dem Problem, dass der koplette Image Sprite dargestellt wird und nicht nur das jeweilige Teilbild - d.h. die jeweilige ImageResource.

Soll ein Bild in ein HTML Widget eingefügt werden, so gibt es zwei Möglichkeiten. Zum einen kann lediglich die URL des Bildes via Image.getUrl() in den HTML String eingefügt werden. Zum anderen kann das komplette <img> Tag via Image.toString() in den HTML String eingefügt werden.

Ersteres führt beim IE7 zu den oben erwähnten Problemen. D.h. der zweite Ansatz muss verwendet werden, wenn der IE7 durch die Web Applikation unterstützt werden soll.

XML Verarbeitung und Firefox’ 4096 Zeichen Limit

Bei der Verarbeitung von XML in GWT muss dringend auf ein Limit des Firefox geachtet werden. Dieser hat für den in einem XML Tag enthaltenen Text ein Limit von 4096 Zeichen. Ist der Text länger, so legt Firefox mehrere Textblöcke (XML Geschwister) mit jeweils maximal 4096 Zeichen an. Das folgende Code-Snippet zeigt einen möglichen Workaround.

/**
 * This utility method is used to work around a limitation in Firefox during the processing of
 * XML. Firefox limits the length of a XML text node to 4096 characters. Thus if a XML node
 * contains more than 4096 characters, Firefox splits the respective node in several nodes with
 * a maximum of 4096 characters each.
 * 
 * Hint: This Firefox limitation is discussed at the following web sites:
 * 
 * "Issue 719: node.getNodeValue() limited in FireFox to 4096 characters. If length is longer it gets truncated."
 * (http://code.google.com/p/google-web-toolkit/issues/detail?id=719)
 * 
 * "Firefox 4k XML node limit" (http://www.coderholic.com/firefox-4k-xml-node-limit/)
 * 
 * @param xmlNode
 *            The XML node.
 * @return The merged text of the specified XML node.
 */
private static String getNodeText(Node xmlNode)
{
    // Verify the given XML node.
    if (xmlNode == null)
        return "";
    // Get all portions of the text data.
    StringBuilder result = new StringBuilder(4096);
    NodeList nodes = xmlNode.getChildNodes();
    for (int i = 0; i < nodes.getLength(); ++i)
        result.append(nodes.item(i).getNodeValue());
    return result.toString();
}


Mit Fiddler eine GWT Web Applikation debuggen

Zur Verwendung von Fiddler als Proxy müssen der Java Virtual Machine folgende Parameter übergeben werden:

-Dhttp.proxyHost=localhost
-Dhttp.proxyPort=9999
-Dhttp.nonProxyHosts=               // Leer lassen, wenn die Proxy auf localhost läuft!

-Dhttps.proxyHost=localhost
-Dhttps.proxyPort=9999
-Dhttps.nonProxyHosts=               // Leer lassen, wenn die Proxy auf localhost läuft!