Pregunta

En los formularios HTML, los botones pueden desactivarse definiendo " disabled " atribuirles, con cualquier valor:

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

Si se va a habilitar un botón, el atributo no debería existir ya que no hay un valor definido en el que se pueda establecer el atributo deshabilitado que dejaría el botón habilitado.

Esto me está causando problemas cuando quiero habilitar / deshabilitar botones cuando uso Documentos JSP (jspx). Como los documentos JSP tienen que ser documentos XML bien formados, no veo ninguna forma de incluir condicionalmente este atributo, ya que algo como lo siguiente no es legal:

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

Si bien podría replicar la etiqueta dos veces usando una etiqueta JSTL if para obtener el efecto deseado, en mi caso específico tengo más de 15 atributos declarados en el botón (muchos atributos de controlador de eventos javascript para AJAX), por lo que duplicar la etiqueta va para hacer que el JSP sea muy desordenado.

¿Cómo puedo resolver este problema sin sacrificar la legibilidad del JSP? ¿Hay alguna etiqueta personalizada que pueda agregar atributos al padre al manipular el DOM de salida?

¿Fue útil?

Solución

Uso una etiqueta JSP personalizada con atributos dinámicos. Lo usas así:

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

Básicamente, lo que hace esta etiqueta es generar un elemento XML con elementName y coloca todos los atributos presentes en la etiqueta, pero omite los vacíos.

La etiqueta en sí es bastante fácil de implementar, mi implementación tiene solo 44 líneas de largo.

Otros consejos

Puede usar la etiqueta <jsp:text> para resolver este problema usando XML válido:

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

Obviamente, esto es más detallado que otras soluciones. Pero es completamente autónomo : no se requieren etiquetas personalizadas. Además, se escala fácilmente a tantos atributos como sea necesario.

@alex Gran solución para utilizar el operador ternario. Agrego algunos de mis ejemplos, que gracias a ti, acabo de cambiar el resultado de la condición, si es cierto, escribe el atributo, de lo contrario no escribiría nada

para llenar la lista y seleccionar el valor utilizado, evitando c: 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>

para comprobar al iniciar un botón de opción para evitar c: if:

<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' : ''} />

supongo que ha pasado algún tiempo desde la última publicación sobre esto, pero me encontré con el mismo problema con las etiquetas <select><option selected="selected">, es decir, declarar dinámicamente qué opción está seleccionada. Para resolver eso hice un tagx personalizado; Publiqué los detalles en otra responda aquí

Llegué a la conclusión de que no hay un atajo agradable; Las expresiones EL y JSP solo pueden existir dentro de los atributos del elemento XML (y en el contenido del cuerpo). Entonces tienes que hacer lo siguiente;

<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>

Usar la notación scriptlet no funcionará para documentos JSP (.jspx)

Leer acerca de un jsp to jspx converter encontré el artículo < jsp: elemento > y < jsp: attribute > . Si entiendo eso correctamente, deberías poder hacer algo como

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

y tener la salida del motor jsp

<button someAttribute="value"/>

o algo así. El único problema, señalado en la página anterior, es que esto no parece funcionar bien con las construcciones condicionales. El autor del convertidor trabajó alrededor de la creación de algunas etiquetas de ayuda, que puede echar un vistazo a la descarga del código fuente, supongo. Espero que ayude.

Haga una biblioteca de etiquetas (.tagx) y luego use la etiqueta scriptlet.

Consulte 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>

Sí, esto es trampa ... pero hace el trabajo. Además, ¿puede hacer una recursión realmente complicada y desagradable para las estructuras de árbol de esta manera?

También publiqué otra solución en mi blog y gist.github que usa un montón de bibliotecas tagx: http://adamgent.com/post/8083703288/conditionally-set-an-attribute-on-an-element-with-jspx

La etiqueta <% = blah% > la sintaxis no es un XML legal necesario para los documentos JSP. Tienes 2 opciones:

  1. ¿Reemplazar <% = (está deshabilitado)? " deshabilitado " : " " % > con < jsp.expression > (isDisabled)? " deshabilitado " : " " < /jsp.expression>
  2. Use el taglib Core y EL (asegúrese de que isDisabled esté en el alcance de la página) así:
<c:choose>
  <c:when test="${isDisabled}">"disabled"</c:when>
  <c:otherwise>""</c:otherwise>
</c:choose>

Espero que ayude :)

He estado luchando con el mismo problema. Intenté usar < jsp: nombre de atributo = " deshabilitado " / > dentro de < c: if > , pero el compilador intenta adjuntar el atributo deshabilitado a la Elemento c: if que falla. Pero encontré que esto funciona ( stripes: submit es un elemento para crear un botón de tipo submit en stripes):

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

Parece que jsp: attribute no creará un atributo en absoluto si el cuerpo solo contiene espacios en blanco, por lo que puede obtener disabled = " disabled " o nada en todos.

Esto solo funcionará si está utilizando algún tipo de taglib para generar el botón, y el elemento tag debe admitir el atributo deshabilitado (pasándolo al elemento HTML subyacente). No puede usar jsp: attribute para agregar un atributo a un elemento HTML en bruto.

Realmente no uso JSP (y respondí una vez, luego lo borré cuando entendí el " must por XML válido 'cosa'). Lo más limpio que puedo encontrar es esto:

<% if (isDisabled) { %>
  <button name="btn1" disabled="disabled">Hello</button>
<% } else { %>
  <button name="btn1">Hello</button>
<% } %>
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top