# Mit GWT ein Widget/Komponente/HTML-Element im Backend erzeugen?



## stefanw (12. Dez 2011)

So da kommt er nun... mein erster Eintrag in diesem Forum. Ich hoffe ich befinde mich im richtigen Bereich.

Mit GWT ein HTML-Objekt im Backend erstellen...

Ich möchte ein Widget oder Komponente im Backend erzeugen. Dieses Element ins Frontend übertragen und dann an meine ScriptCode binden.

Warum?
Ich habe Geschwindigkeitsprobleme beim Randern und/oder bei der Deserialisierung.

Beispiel (Deserialisierung):
Erzeugen einer ListBox mit 8000 Einträgen. Dabei werden 8000 DTOs in die Listbox eingetragen und per "@Override toString" dargestellt.
Chrome: 20ms
Firefox: 20ms
IE7/8/9: 20000ms -> hier möchte ich den Server die Komponente erzeugen lassen.
IE + ChromeFrame: 20ms


----------



## jmarc (13. Dez 2011)

Wenn es am Rendern liegt, hast du das Problem auch weiterhin, wenn du es serverseitig erstellst, das redern passiert ja im Browser.
Ich würde versuchen eine andere Komponente zu verwenden oder du zeigst in deiner Listbox immer nur 20 Einträge an und wenn der User durchscrollst entfernst du den ersten und fügst hinten einen an.


----------



## stefanw (13. Dez 2011)

Ach... ist eigentlich ganz einfach. :lol:

```
greetingService.getFKomponent(new AsyncCallback<String>() {

	@Override
	public void onFailure(Throwable caught) {
		// Schade
	}
	
       @Override
	public void onSuccess(String result) {
		HTML widget = new HTML(); 
		// z.B. <input class=\"gwt-TextBox\" type=\"text\" id=\""+id+"\">
		widget.setHTML(result);
                panel.add(widget);
	}
});
```
Warum so kompliziert?
Ich habe viele Rechte und je nach RechteSet baut sich das Frontend unterschiedlich auf. Je mehr arbeit ich dem IE abnehmen kann desto schneller wird die Anwendung auf dem Client.
PS: Für mein ListBox Problem habe ich auch eine Lösung gefunden.


----------



## stefanw (13. Dez 2011)

jmarc hat gesagt.:


> Wenn es am Rendern liegt, hast du das Problem auch weiterhin, wenn du es serverseitig erstellst, das redern passiert ja im Browser.
> Ich würde versuchen eine andere Komponente zu verwenden oder du zeigst in deiner Listbox immer nur 20 Einträge an und wenn der User durchscrollst entfernst du den ersten und fügst hinten einen an.




...20 Einträge an und wenn der User durchscrollst...
So hab ich meine Tabelle in GWT gebaut. Ist auch super schnell im FireFox, Chrome und IE9 aber nicht im IE8. Für eine ListBox hab ich aber eine andere Lösung gefunden. 

Performance bei 10000 Items IE8
ListBox ca. 33000ms
FastListBox ca. 500ms 


```
import java.util.List;

import com.google.gwt.dom.client.Element;
import com.google.gwt.user.client.DOM;
import com.google.gwt.user.client.ui.ListBox;

public class FastListBox extends ListBox
{
    public FastListBox()
    {
    }

    public FastListBox(boolean isMultipleSelect)
    {
        super(isMultipleSelect);
    }

    public FastListBox(List<String> items)
    {
        super(createElement(items));
    }

    private static Element createElement(List<String> items)
    {
        StringBuilder b = new StringBuilder();
        b.append("<select>");

        for (String item : items)
        {
            b.append("<option>");
            b.append(item);
            b.append("</option>");
        }

        b.append("</select>");

        Element div = DOM.createDiv();
        div.setInnerHTML(b.toString());
        Element select = div.getFirstChildElement();
        select.removeFromParent();

        return select;
    }
}
```


----------



## JohannisderKaeufer (14. Dez 2011)

Einen Eintrag, der dieses Verhalten erklären könnte wäre dieser 

Javascript String Concatenation - Software Secret Weapons

Auf der Seite geht es um das Zusammenbauen einer Tabelle, die im IE 7 recht lange braucht.

Als Ergebnis wird vermutet, dass es an der Art liegt wie Strings zusammengesetzt werden.

Schlußendlich kommt man auf die Idee eines StringBuffers in JS, ähnlich dem, den du serverseitig verwendest.

Die Problematik beim zusammensetzen von Strings in Java und JavaScript scheint ähnlich gelagert zu sein.

Moderne Browser gehen hier aber effizienter vor und verarbeiten += und + nun genauso effizient wie StringBuffer-Implementierungen oder sogar noch schneller.


----------

