Frage

Ich überlege Erstellung von JSP-tags, die immer die gleiche Ausgabe.Zum Beispiel:

<foo:bar>baz</foo:bar>

Wird immer ausgegeben:

<div class="bar">baz</div>

Gibt es eine Möglichkeit, um eine JSP-tag Verhalten sich genauso wie die statischen Ausgang in der generierten servlet?

Zum Beispiel:

out.write("<div class=\"bar\">");
...
out.write("</div>");

an Stelle von

x.y.z.foo.BarTag _jspx_th_foo_bar_0 = new x.y.z.foo.BarTag();
_jspx_th_foo_bar_0.setPageContext(pageContext);
_jspx_th_foo_bar_0.setParent(null);
_jspxTagObjects.push(_jspx_th_foo_bar_0);
int _jspx_eval_foo_bar_0 = _jspx_th_foo_bar_0.doStartTag();
etc...
etc...
etc...

Hintergrund

Ich bin besorgt über die Leistung.Ich noch nicht getestet, aber es sieht aus wie das generierte servlet tut viel für etwas sehr einfaches, und die Leistung ist sehr wichtig.

Aber wenn das servlet verhält sich so, als wenn die Ausgabe geschrieben wurde, direkt in die JSP, die Kosten in der Produktion gleich null sein wird.

Ich sehe ein paar Vorteile, dies zu tun.Ich kann ändern Sie den statischen HTML-Code oder sogar ändern, um etwas mehr Dynamik, ohne Bearbeitung jedes portlet.In unserem setup es ist einfach zu ändern, ein tag, aber sehr zeitaufwendig zu ändern, jede JSP verwendet, ein bestimmtes element.

Dies bedeutet auch, dass ich Sie zwingen kann Entwickler nicht sowas schreiben wie

<div class="bar" style="whatever">...</div>

Es gibt sogar noch weitere Vorteile, aber wenn es auf Kosten der performance auf dem Produktions-Server, es ist wahrscheinlich nicht Wert.

War es hilfreich?

Lösung 2

Ich machte einen performance-test.Es gibt sehr wenig Unterschied in der Leistung, das ist also kein problem.

Wie ich machte den test

Ich erstellte 500 individuelle tags (programmgesteuert) in einem unserer "tag-Bibliotheken".(So ist es eingewickelt in einem Glas etc.) Sie alle sehen so aus, mit der Zahl, wie der einzige Unterschied:

package XX.XX.XX.XX

import java.io.IOException;

import javax.servlet.jsp.JspException;
import javax.servlet.jsp.tagext.TagSupport;

public class Test0001Tag extends TagSupport {

    public Test0001Tag() {
    }

    public int doStartTag() throws JspException {

        try {
            pageContext.getOut().print("<div class=\"Test0001\">");
        } catch (IOException e) {
            throw new JspException(e);
        }
        return EVAL_BODY_INCLUDE;
    }

    public int doEndTag() throws JspException {
        try {
            pageContext.getOut().print("</div>");
        } catch (IOException e) {
            throw new JspException(e);
        }
        return EVAL_PAGE;
    }

    public void release() {
        super.release();
    }
}

Und dann 500 Einträge in der TLD wie diese:

<tag>
   <name>test0001</name>
   <tagclass>XX.XX.XX.XX.Test0001Tag</tagclass>
   <bodycontent>JSP</bodycontent> 
</tag>

Dann schnappte ich mir eine JSP-mit ein wenig code, und machte zwei Kopien:Eine statische HTML-und einem mit tags.

Die eine mit statischen HTML:

<!-- 
<%long start = System.currentTimeMillis();%>
<% for (int i = 0; i < 1000; i++) { %>
<div class="Test0001">X</div>
<div class="Test0002">X</div>
<div class="Test0003">X</div>
...
<div class="Test0498">X</div>
<div class="Test0499">X</div>
<div class="Test0500">X</div>
<% } %>
<%System.out.println(System.currentTimeMillis()-start);%>
 -->

Der mit-tags:

<!-- 
<%long start = System.currentTimeMillis();%>
<% for (int i = 0; i < 1000; i++) { %>
<bddesign:test0001>X</bddesign:test0001>
<bddesign:test0002>X</bddesign:test0002>
<bddesign:test0003>X</bddesign:test0003>
...
<bddesign:test0498>X</bddesign:test0498>
<bddesign:test0499>X</bddesign:test0499>
<bddesign:test0500>X</bddesign:test0500>
<% } %>
<%System.out.println(System.currentTimeMillis()-start);%>
 -->

Die Schleife wurde eingeführt, weil die beiden kamen mit null Millisekunden.(Leider habe ich run-Fenster bei der Arbeit, so dass ich nicht bekommen, viel Präzision hier.) Die Tatsache, dass 500-tags nicht die eine Maßnahme, die in der Lage Verzögerung sein könnte Antwort genug, aber ich wollte mehr, selbst wenn die Wiederholung kann einige Optimierung.

Das Ergebnis für 500 000 Stichworte:

  • JSP-tags:15-19 Sekunden
  • HTML-tags:12-16 Sekunden

So ist es ein Unterschied, aber ich denke, es ist unbedeutend im Vergleich zu allem anderen Los, mit der der Benutzer die Antwort wird auf dem Bildschirm gerendert.

Andere Gedanken

Soweit ich weiß, die Granularität in Windows ist das etwa 15-16 Millisekunden.So "0 Millisekunden" bedeutet eigentlich "<16 Millisekunden".Eine Verzögerung von weniger als 16/500 Millisekunden pr.tag ist durchaus akzeptabel.

Ich habe versucht, mit 1000-tags, aber die JSP-compiler war sehr unglücklich damit.Ich auf 500 reduziert tags, weil die alternative war, um die setup, die ungültig werden meine Ergebnisse.

Ich machte den erzeugten HTML ein HTML-Kommentar, da der browser ist auf der gleichen physischen Maschine wie der test-server, und ich hatte Angst, dass der browser würde zu viel CPU-time rendering, sogar mit einer dual-core-CPU.Die einfache Lösung war, zu kommentieren HTML.

Andere Tipps

Ich bin ziemlich sicher, dass die Performance-Einbußen negligeble sein wird, den Code Erwägen Sie gerade zeigte.

Ich frage mich ... warum nicht nur eine einfache alte sind

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top