Frage

In HTML-Formularen, Schaltflächen können durch die Definition des "disabled" -Attribut auf sie deaktiviert werden, mit einem beliebigen Wert:

<button name="btn1" disabled="disabled">Hello</button>

Wenn eine Schaltfläche aktiviert werden soll, sollte das Attribut nicht vorhanden, da es keinen definierten Wert ist, dass das disabled-Attribut gesetzt werden kann, um, dass die Taste aktiviert lassen würde.

Das ist mir Probleme verursachen, wenn ich / deaktivieren Tasten aktiviert werden soll, wenn JSP Dokumente mit (JSPX). Als JSP-Dokumente wohlgeformte XML-Dokumente sein, kann ich sehen, jede mögliche Weise nicht von diesem Attribute bedingt einschließlich, als so etwas wie die folgenden nicht legal ist:

<button name="btn1" <%= (isDisabled) ? "disabled" : "" %/> >Hello</button>

Während ich den Tag zweimal replizieren konnte eine JSTL verwenden, wenn Tag, um den gewünschten Effekt zu erzielen, in meinem speziellen Fall Ich habe mehr als 15 Attribute auf der Schaltfläche deklarieren (viele JavaScript-Event-Handler-Attribut für AJAX), so dass die Tag-Duplizierung wird die JSP sehr chaotisch zu machen.

Wie kann ich dieses Problem lösen, ohne die Lesbarkeit der JSP zu opfern? Gibt es irgendwelche benutzerdefinierten Tags, die Attribute der übergeordneten durch Manipulation der Ausgang DOM?

hinzufügen
War es hilfreich?

Lösung

Ich verwende einen benutzerdefinierten JSP-Tag mit dynamischen Attributen. Sie verwenden es wie folgt aus:

<util:element elementName="button" name="btn1" disabled="$(isDisabled ? 'disabled' : '')"/>

Im Grunde, was dieser Tag tut, ist ein XML-Element mit elemente erzeugen und legt alle Attribute, die in dem Tag, sondern überspringt die leeren.

Der Tag selbst ist ziemlich einfach zu implementieren, meine Implementierung nur 44 Zeilen lang ist.

Andere Tipps

Sie können den <jsp:text> Tag verwenden, um dieses Problem mit gültigen XML zu lösen:

<jsp:text><![CDATA[<button name="btn1"]]></jsp:text>
    <c:if test="${isDisabled}"> disabled="disabled"</c:if>
    >
    Hello!
<jsp:text><![CDATA[</button>]]></jsp:text>

Das ist natürlich ausführlicher als andere Lösungen. Aber es ist vollständig in sich geschlossenes : keine benutzerdefinierten Tags erforderlich. Außerdem ist es leicht Skalen , um so viele Attribute wie Sie benötigen.

@ Alex große Lösung des ternären Operator zu verwenden. Ich füge einige meiner Beispiel, dass dank Ihnen, ich habe gerade das Ergebnis der Bedingung geändert wird, wenn sie wahr ist, das Attribut schreibt, sonst nichts schreiben

, um die Liste zu füllen und den Wert verwendet wählen, c vermeiden: if

<select id="selectLang" name="selectLang" >
<c:forEach var="language" items="${alLanguages}" >
    <option value="${language.id}" ${language.code == usedLanguage ? 'selected' : ''} >${language.description}</option>
</c:forEach>

zu überprüfen, um ein Optionsfeld zu vermeiden c: wenn:

<input type="radio" id="id0" value="0" name="radio" ${modelVar == 0 ? 'checked' : ''} />
<input type="radio" id="id1" value="1" name="radio" ${modelVar == 1 ? 'checked' : ''} />
<input type="radio" id="id2" value="2" name="radio" ${modelVar == 2 ? 'checked' : ''} />

Ich denke, einige Zeit seit dem letzten Beitrag dazu geführt hat, aber ich kam gegen das exakt gleiche Problem mit <select><option selected="selected"> Tags nach oben, das heißt dynamisch deklarieren, welche Option ausgewählt ist. Zu lösen, dass man mir eine benutzerdefinierte Tagx gemacht; Ich stellte die Details in einem anderen hier beantworten

Ich kam zu dem Schluss, dass es keine nette Abkürzung ist; EL und JSP Ausdrücke können nur existieren innerhalb XML-Element-Attribute (und in Körpergehalt). So haben Sie folgendes zu tun;

<c:choose>
    <c:when test="${isDisabled}"><button name="btn1" disabled="disabled">Hello</button></c:when>
    <c:otherwise><button name="btn1">Hello</button></c:otherwise>
</c:choose>

die scriptlet-Notation wird für JSP-Dokumente nicht (.jspx)

Lesen Sie weiter über eine automatische jsp zu JSPX Konverter ich über die <jsp:element> kam und <jsp:attribute> Stichworte. Wenn ich das richtig verstehe sollten Sie in der Lage sein, etwas zu tun, wie

<jsp:element name="button">
  <jsp:attribute name="someAttribute">value</jsp:attribute>
</jsp:element>

und die jsp Motorleistung haben

<button someAttribute="value"/>

oder so ähnlich. Das einzige Problem, wies oben auf der Seite heraus, dass dies nicht mit bedingten Konstrukten gut zu funktionieren scheint. Der Autor des Wandlers, um gearbeitet, dass einige Helfer-Tags erstellen, die Sie einen Blick auf das Herunterladen des Quellcodes haben kann, denke ich. Hoffe, das hilft.

Erstellen Sie eine Tag-Bibliothek (.tagx) dann den scriptlet Tag verwenden.

Siehe http://code.google.com/p/jatl/wiki/JSPExample

<?xml version="1.0" encoding="UTF-8" ?>
<jsp:root xmlns:jsp="http://java.sun.com/JSP/Page" version="2.1">
<jsp:directive.page import="com.googlecode.jatl.Html"/>
<jsp:directive.page import="com.evocatus.product.data.AttributeValue"/>
<jsp:directive.page import="com.evocatus.domain.Product"/>

<jsp:scriptlet>
//<![CDATA[
    final Product p = (Product) request.getAttribute("product");
        new Html(out) {{
           for (AttributeValue v : p.summaryAttributeValues()) {
                   p();
                        strong().text(v.getLabel()).end();
                        text(": " + v.getValue());
                   endAll();
           }
        }};
//]]>
</jsp:scriptlet>

</jsp:root>

Ja das ist Betrug ... aber es wird die Arbeit getan. Außerdem können Sie tun, wirklich böse komplizierte Rekursion für Baumstrukturen auf diese Weise.

Ich gab auch eine andere Lösung auf meinem Blog und gist.github, die eine Reihe von Tagx Bibliotheken verwendet: http://adamgent.com/post/8083703288/conditionally-set-an-attribute-on-an-element-with-jspx

Die <% = blah%> Syntax ist nicht legal XML für JSP Dokumente benötigt. Sie haben 2 Möglichkeiten:

  1. Ersetzen <% = (isDisabled)? "Gesperrt": "" %> mit (isDisabled)? "Disabled": ""
  2. Verwenden Sie den Core taglib und EL (stellen Sie sicher, isDisabled in Seite Umfang setzen) wie folgt:
<c:choose>
  <c:when test="${isDisabled}">"disabled"</c:when>
  <c:otherwise>""</c:otherwise>
</c:choose>

Ich hoffe, das hilft:)

Ich habe gerade mit dem gleichen Problem zu kämpfen. Ich habe versucht, <jsp:attribute name="disabled"/> innen <c:if> verwenden, aber der Compiler versucht, die disabled-Attribut auf das c:if Element zu befestigen, die fehlschlägt. Aber ich fand, dass dies nicht funktioniert (stripes:submit ein Element ist eine Schaltfläche vom Typ für die Erstellung von in Streifen einreichen):

<stripes:submit name="process" value="Hello">
   <jsp:attribute name="disabled">
       <c:if test="${x == 0}">disabled</disabled>
   </jsp:attribute>
</stripes:submit>

Es scheint, dass jsp:attribute wird kein Attribut schaffen an allen, wenn der Körper nur Leerzeichen enthält, also entweder Sie disabled="disabled" oder gar nichts bekommen.

Dies funktioniert nur, wenn Sie irgendeine Art von taglib werden mit der Taste zu erzeugen, und das Tag-Element muss das disabled-Attribut unterstützen (es durch auf das zugrunde liegende HTML-Element vorbei). Sie können nicht jsp:attribute verwenden, um ein Attribut zu einem rohen HTML-Elemente hinzuzufügen.

Ich benutze keine wirklich JSP (und ich antwortete einmal, dann gelöscht, wenn ich das verstanden „müssen gültige XML durch“ Sache). Die saubersten, die ich mit oben kommen kann, ist dies:

<% if (isDisabled) { %>
  <button name="btn1" disabled="disabled">Hello</button>
<% } else { %>
  <button name="btn1">Hello</button>
<% } %>
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top