formulario - Establecer condicionalmente un atributo en un elemento con documentos JSP(JSPX)
jstl java (9)
En los formularios HTML, los botones se pueden desactivar definiendo el atributo "disabled" en ellos, 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 para que el atributo deshabilitado se pueda configurar para dejar el botón habilitado.
Esto me causa 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 este atributo condicionalmente, ya que algo como lo siguiente no es legal:
<button name="btn1" <%= (isDisabled) ? "disabled" : "" %/> >Hello</button>
Si bien pude 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 de javascript para AJAX) por lo que duplicar la etiqueta va a hacer que el JSP muy desordenado.
¿Cómo puedo resolver este problema sin sacrificar la legibilidad de JSP? ¿Hay alguna etiqueta personalizada que pueda agregar atributos al padre manipulando el DOM de salida?
Leyendo acerca de un convertidor jsp a jspx automático encontré las etiquetas <jsp:element>
y <jsp:attribute>
. Si entiendo eso correctamente, deberías ser capaz de hacer algo como
<jsp:element name="button">
<jsp:attribute name="someAttribute">value</jsp:attribute>
</jsp:element>
y tiene 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 constructos condicionales. El autor del convertidor funcionó alrededor de eso creando algunas etiquetas de ayuda, que puedes echarle un vistazo a la descarga del código fuente, supongo. Espero que ayude.
Realmente no uso JSP (y respondí una vez, luego lo borré cuando entendí la cosa "debe ser válido por XML"). Lo más limpio que se me ocurre es esto:
<% if (isDisabled) { %>
<button name="btn1" disabled="disabled">Hello</button>
<% } else { %>
<button name="btn1">Hello</button>
<% } %>
La sintaxis <% = blah%> no es XML legal necesario para los documentos JSP. Tienes 2 opciones:
- Reemplazar <% = (isDisabled)? "deshabilitado": ""%> con <jsp.expression> (isDisabled)? "deshabilitado": "" </jsp.expression>
- Utilice el taglib Core y EL (asegúrese de que isDisabled se ponga 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 :)
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 pone 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 es de solo 44 líneas.
He estado luchando con el mismo problema. Intenté usar <jsp:attribute name="disabled"/>
dentro de <c:if>
, pero el compilador intenta adjuntar el atributo disabled al elemento c:if
que falla. Pero descubrí que esto funciona ( stripes:submit
es un elemento para crear un botón de tipo submit in 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 contiene solo espacios en blanco, por lo que se disabled="disabled"
o nada en absoluto.
Esto solo funcionará si está utilizando algún tipo de taglib para generar el botón, y el elemento de etiqueta debe admitir el atributo deshabilitado (pasarlo al elemento HTML subyacente). No puede usar el jsp:attribute
para agregar un atributo a un elemento HTML sin formato.
Haga una biblioteca de etiquetas (.tagx) y luego use la etiqueta scriptlet.
Ver 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 hacer trampa ... pero hace el trabajo bien. Además, puedes hacer recursiones realmente desagradables y complicadas para las estructuras de los árboles de esta manera.
También publiqué otra solución en mi blog y gist.github que usa varias bibliotecas de tagx: http://adamgent.com/post/8083703288/conditionally-set-an-attribute-on-an-element-with-jspx
@alex gran solución para usar el operador ternario. Agrego algunos de mis ejemplos, que gracias a ti, acabo de cambiar el resultado de la condición, si es verdadero, escribe el atributo, de lo contrario no escribo nada
para completar la lista y seleccionar el valor utilizado, evitando c: si
<select id="selectLang" name="selectLang" >
<c:forEach var="language" items="${alLanguages}" >
<option value="${language.id}" ${language.code == usedLanguage ? ''selected'' : ''''} >${language.description}</option>
</c:forEach>
comprobar al inicio un botón de opción para evitar c: si:
<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'' : ''''} />
Puede usar la etiqueta <jsp:text>
para resolver este problema utilizando 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>
Esto es obviamente más detallado que algunas otras soluciones. Pero es completamente autónomo : no se requieren etiquetas personalizadas. Además, se adapta fácilmente a tantos atributos como necesite.
Supongo que ha pasado un tiempo desde la última publicación sobre esto, pero me encontré con exactamente el mismo problema con las etiquetas <select><option selected="selected">
, es decir, declarando dinámicamente qué opción está seleccionada. Para resolverlo, hice un tagx personalizado; Publiqué los detalles en otra respuesta aquí
Llegué a la conclusión de que no hay un buen atajo; Las expresiones EL y JSP solo pueden existir dentro de los atributos de los elementos 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>
El uso de la notación scriptlet no funcionará para documentos JSP (.jspx)