2009-06-04 6 views
1

Nach der Django Template-Sprache, ich vermisse wirklich so Dinge zu tun in der Lage:JSP benutzerdefinierte Tags: Ist es möglich, mehr als Start/schließen Tags?

{% if condition %} 
    <!-- snip --> 
{% else %} 
    <!-- snip --> 
{% endif %} 

Wenn ich JSP verwende ich so etwas wie dies stecken tue:

<logic:equal name="something" value="example"> 
    <!-- snip --> 
</logic:equal> 
<logic:notEqual name="something" value="example"> 
    <!-- snip --> 
</logic:notEqual> 

oder:

<% if (condition) { %> 
    <!-- snip --> 
<% } else { %> 
    <!-- snip --> 
<% } %> 

Ist es möglich, einen benutzerdefinierten Tag zu schreiben, die else und else if unterstützt, anstatt einfach nur ein Paar von t ags für jeden Scheck?

Wenn es nicht möglich ist, welches ist der "bevorzugte" Stil? Scriptlets oder mehrere Tag-Paare? Bei meiner Organisation scheinen die meisten Leute die Scriptlets zu missbrauchen, aber ich habe nicht wirklich einen guten Grund gehört, warum einfache bedingte Aussagen wie die, die ich aufgelistet habe, so schlecht sind.

+0

Ich bin nicht vertraut mit Django, aber was ist der Unterschied zwischen dem Django-Beispiel und der zweiten JSP? –

Antwort

4

Die Tags in XML paarweise kommen, ein eine Schließung zu öffnen. Die drei Elemente des if then else enden nicht für ein schönes offenes und geschlossenes Format. Die einzige andere Möglichkeit ist, die wählen Tag wie folgt zu verwenden:

<c:choose> 
    <c:when test="${bean.value == 2}"> 
    <p>True</p> 
    </c:when> 
    <c:otherwise> 
    <p>False</p> 
    </c:otherwise> 
</c:choose> 

Dies ist die übliche Art und Weise, die, wenn dann sonst Strukturen in jstl zu codieren.

0

Es gibt bedingte Tags in den Standard-Tag-Bibliotheken:

<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %> 
<c:if ... > 

</c:if> 

Lookup jede refererence auf jstl.

Sie können dies auch direkt in der jsp tun, obwohl es verpönt etwas ist:

<% if (something) { %> 
... this will only display if something is true ... 
<% } > 
+0

Ich kenne die JSTL-Tags, funktionieren sie mit anderen oder anderen Tags? Oder sind sie immer noch auf Paare von Tags beschränkt? Es war mein Eindruck, dass sie dich immer noch "wenn Bedingung" checken lassen und dann "if!Bedingung "für den" else "-Block. –

4

Die JSTL-Tags werden mit einem Auswahl-Tag ausgeliefert, das wie ein Multi-Select-Element funktioniert.

<c:choose> 
    <c:when test="${first condition}"> 
     whatever 
    </c:when> 
    <c:when test="${second condition}"> 
     whatever 
    </c:when> 
    <c:when test="${third condition}"> 
     whatever 
    </c:when> 
    <c:otherwise> 
      whatever else 
    </c:otherwise> 
</c:choose> 
1

Die obigen Lösungen arbeiten (<c:choose> und <c:if>).

Wenn Sie daran interessiert sind, benutzerdefinierte Tags zu schreiben, um mehr zu tun oder mehr "domänenspezifisch" zu sein, sind sie eigentlich ziemlich einfach.

Ich habe vor einigen Jahren eine Präsentation bei JavaOne - die Folien sind bei http://javadude.com/articles/javaone/index.html (im ersten Abschnitt). Es gibt Details zum Schreiben von Schleifen und bedingten Tags. (Ich habe die Präsentation vor der Standard-Tag-Bibliotheken kam, btw)

Es gibt auch eine wirklich gute benutzerdefinierte Tag-Tutorial um http://www.orionserver.com/docs/tutorials/taglibs/index.html. Es hat ein paar Besonderheiten für Orion-Server, aber das meiste ist sehr generisch.

+0

Ich weiß, wie man ein benutzerdefiniertes Tag schreibt. Ich wollte wissen, ob es möglich war, ein benutzerdefiniertes Tag zu schreiben, das nicht nur ein Start- und End-Tag war. –

+1

Sie sind XML-Tags.Was sonst noch verfügbar wäre? –

+0

Sie können ein Container-Tag erstellen, das viele Alternativen enthält (wie die Choose erwähnt.) Werfen Sie einen Blick auf das LayoutManager Beispiel in meinem Gespräch, zum Beispiel - beliebige Verschachtelung. –

0

Ich sehe keinen Grund, warum Sie nicht ein benutzerdefiniertes JSP-Tag schreiben konnten, das wusste, nach dem Tag in seinem bodycontent zu suchen. Es wäre keine "Best Practice", aber es wäre eine ziemlich saubere und intuitive Art, Dinge zu tun.

Verwandte Themen