2008-10-01 16 views
15

En los formularios HTML, los botones se puede desactivar mediante la definición del atributo "desactivado" en ellos, con cualquier valor:condicional establece un atributo de un elemento con los documentos JSP (JSPX)

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

Si un botón se encuentra a estar habilitado, el atributo no debería existir ya que no hay un valor definido que el atributo desactivado pueda establecerse para dejar el botón habilitado.

Esto me causa problemas cuando quiero habilitar/deshabilitar botones cuando uso Documentos JSP (jspx). Como documentos JSP tienen que ser documentos XML bien formados, no puedo ver ninguna manera de incluir condicionalmente este atributo, como algo parecido a lo siguiente no es legal:

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

Mientras que podía replicar la etiqueta utilizando dos veces 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 a hacer que la JSP sea muy complicada.

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

Respuesta

9

Uso una etiqueta JSP personalizada con atributos dinámicos. Se utiliza de esta manera:

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

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

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

+3

¿Podría publicar el código para esto? Creo que sería muy instructivo. –

+1

Parece que va a ser la mejor respuesta que obtendré, es una lástima que no hay forma de hacerlo con una sintaxis XML válida sin tener que escribir etiquetas personalizadas ... – iainmcgin

+0

Si miras la herramienta JSP2X, etiquetas de gotas para , y (para el cuerpo del elemento). Esa es otra alternativa que se puede usar con construcciones más complejas. –

-2

Realmente no uso JSP (y respondí una vez, luego la borré cuando entendí la cosa "debe ser válido por XML"). El más limpio que puedo llegar a es la siguiente:

<% if (isDisabled) { %> 
    <button name="btn1" disabled="disabled">Hello</button> 
<% } else { %> 
    <button name="btn1">Hello</button> 
<% } %> 
+0

Como se indica en la pregunta, mientras que esto funcionará es más desordenado de lo que quisiera, especial con más de 15 atributos en común entre las dos ramas de la declaración if. – iainmcgin

0

la <% = bla%> sintaxis XML no es legal necesario para los documentos JSP. Tiene 2 opciones:

  1. Reemplazar <% = (isDisabled)? "deshabilitado": ""% > con <jsp.expression> (isDisabled)? "Desactivado": "" </jsp.expression>
  2. Utilice el taglib Core y EL (asegúrese isDisabled se pone en ámbito de la página), así:
 
<c:choose> 
    <c:when test="${isDisabled}">"disabled"</c:when> 
    <c:otherwise>""</c:otherwise> 
</c:choose> 

Espero que ayude :)

+0

¿Dónde se colocarían estas etiquetas? Aún no podría ponerlos dentro de la sección de atributos de la etiqueta del botón, ya que esto aún sería un XML no válido, y colocarlos dentro del elemento resultará en que se agregue algo de CDATA. – iainmcgin

3

Leyendo sobre un automático jsp to jspx converter Encontré las etiquetas <jsp:element> y <jsp:attribute>. Si bien entiendo que usted debería ser capaz de hacer algo como

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

y tienen la potencia del motor JSP

<button someAttribute="value"/> 

o algo por el estilo. 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.

+0

En realidad, probablemente sea y así sucesivamente. La herramienta JSP2X los escribe como etiquetas personalizadas en su WEB-INF para su uso en archivos JSP convertidos. –

6

Usted puede utilizar 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, escala fácilmente a tantos atributos como necesite.

+0

Si bajas, por favor deja un comentario que diga por qué. Eso me da la oportunidad de mejorar la respuesta. –

+0

Tantos downvotes en esta respuesta, pero nadie realmente está diciendo por qué. :-( –

+0

No sé por qué alguien ha votado negativamente esta respuesta, pero creo que este es el mejor enfoque que me conviene. –

4

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

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> 

Utilizando la notación scriplet no funcionará para documentos JSP (.jspx)

+0

Ahh pero la etiqueta scriptlet funcionará http://code.google.com/p/jatl/wiki/JSPExample ... Una de las razones por las que escribí esa biblioteca (ver enlace). –

0

He estado luchando con el mismo problema. Intenté usar <jsp:attribute name="disabled"/> dentro de <c:if>, pero el compilador intenta adjuntar el atributo deshabilitado al elemento c:if que falla. Pero he encontrado que esto funciona (stripes:submit es un elemento para crear un botón de tipo presentará en rayas):

<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 sólo contiene espacios en blanco, por lo que cualquiera obtiene 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 jsp:attribute para agregar un atributo a un elemento HTML sin procesar.

+1

no funciona para mí ... el atributo se crea incluso cuando el cuerpo de la etiqueta está vacío. Supongo que depende de la impl de el JSP que estás usando (estoy usando resina 3.0.24) – Shamu

2

Crea una biblioteca de etiquetas (.tagx) y luego usa 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. Además, puedes hacer recursiones realmente desagradables y complicadas para las estructuras de los árboles de esta manera.

También he publicado otra solución en mi blog y gist.github que utiliza un conjunto de librerías de tagx: http://adamgent.com/post/8083703288/conditionally-set-an-attribute-on-an-element-with-jspx

5

@alex gran solución para utilizar el operador ternario.Agrego algunos de mis ejemplos, que gracias a usted, acabo de cambiar el resultado de la condición, si es verdadero, escribe el atributo; de lo contrario, no escriba 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 en iniciar 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' : ''} /> 
Cuestiones relacionadas