Pergunta

formulários em HTML, botões pode ser desativado, definindo o atributo "desativado" sobre eles, com qualquer valor:

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

Se um botão é para ser habilitado, o atributo não deve existir como não existe um valor definido que o atributo desativado pode ser configurado para que deixaria o botão habilitado.

Isso está causando problemas me quando eu quero para ativar / desativar botões ao usar JSP Documentos (JSPX). Como documentos JSP tem que ser documentos XML bem formados, eu não consigo ver nenhuma maneira de condicionalmente incluindo este atributo, como algo como o seguinte não é legal:

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

Enquanto eu poderia replicar a tag duas vezes usando um JSTL se tag para obter o efeito desejado, no meu caso específico eu tenho mais de 15 atributos declarados no botão (lotes de manipulador de eventos javascript atributos para AJAX) para duplicar a tag vai para fazer a JSP muito confuso.

Como posso resolver este problema, sem sacrificar a legibilidade do JSP? Existem quaisquer marcas personalizadas que podem adicionar atributos para o pai através da manipulação do DOM saída?

Foi útil?

Solução

Eu uso um costume tag JSP com atributos dinâmicos. Você usá-lo como este:

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

Basicamente, o que este tag faz é gerar um elemento XML com elementName e coloca todos os atributos presentes na tag, mas ignora os vazios.

A marca em si é bastante fácil de implementar, minha implementação está a apenas 44 linhas.

Outras dicas

Você pode usar a tag <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>

Esta é, obviamente, mais detalhado do que algumas outras soluções. Mas é completamente auto-suficiente : há tags personalizadas necessário. Além disso, ele escalas facilmente para quantos atributos que você precisa.

@alex excelente solução para usar o operador ternário. Eu adiciono um pouco do meu exemplo, que graças a você, eu só mudou o resultado da condição, se verdadeira, escreve o atributo, caso contrário, não escreva nada

para preencher a lista e selecione o 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 verificar a iniciar um botão de rádio para evitar c: se:

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

eu acho que algum tempo se passou desde o último post sobre isso, mas eu vim contra exatamente o mesmo problema com as tags <select><option selected="selected">, ou seja, declarando dinamicamente qual opção é selecionada. Para resolver isso que eu fiz um tagx costume; Eu postei os detalhes mais em outra resposta href="https://stackoverflow.com/questions/1761479/how-to-output-option-selectedtrue-from-jspx/2353187#2353187">

Eu vim à conclusão de que não há nenhum atalho agradável; expressões EL e JSP só pode existir dentro de atributos de elementos XML (e no conteúdo do corpo). Então você tem que fazer o seguinte;

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

Usando a notação scriptlet não funcionará para documentos JSP (.jspx)

Lendo sobre um jsp para JSPX conversor me deparei com a <jsp:element> e <jsp:attribute> Tag. Se eu entender que corretamente, você deve ser capaz de fazer algo assim

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

e ter a potência do motor jsp

<button someAttribute="value"/>

ou algo parecido. O único problema, apontado na página acima, é que este não parece funcionar bem com construções condicionais. O autor do conversor contornado que criar algumas tags auxiliares, que você pode ter um olhar para transferir o código fonte, eu acho. Espero que ajude.

Faça uma biblioteca de tags (.tagx), em seguida, usar a tag scriptlet.

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>

Sim este é batota ... mas ele começa o trabalho feito. Além disso, você pode fazer recursão complicado realmente desagradável para estruturas de árvore desta forma.

Eu também postou outra solução no meu blog e gist.github que usa um grupo de bibliotecas tagx: http://adamgent.com/post/8083703288/conditionally-set-an-attribute-on-an-element-with-jspx

O <% = blah%> sintaxe não é XML legal necessária para JSP documentos. Você tem 2 opções:

  1. Substitua <% = (isDisabled)? "Desativado": "" %> com (isDisabled)? "Desativado": ""
  2. Use o taglib Core e EL (certifique-se isDisabled é colocado em âmbito página) assim:
<c:choose>
  <c:when test="${isDisabled}">"disabled"</c:when>
  <c:otherwise>""</c:otherwise>
</c:choose>

Espero que ajude:)

Eu apenas fui lutando com o mesmo problema. Eu tentei usar <jsp:attribute name="disabled"/> dentro <c:if>, mas o compilador tenta anexar o atributo desativado para o elemento c:if que falha. Mas descobri que isso não funciona (stripes:submit é um elemento para a criação de um botão do tipo enviar em listras):

<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 não irá criar um atributo em todos, se o corpo contém somente espaços em branco, assim que você quer obter disabled="disabled" ou nada.

isso só funcionará se você estiver usando algum tipo de taglib para gerar o botão, e o elemento tag devem suportar o atributo disabled (passagem através do elemento HTML subjacente). Você não pode usar jsp:attribute para adicionar um atributo para um elemento HTML puro.

Eu realmente não usar JSP (e eu respondi uma vez, em seguida, excluí-la quando eu entendi o "must pelo válida XML" coisa). O mais limpo que eu posso vir acima com é o seguinte:

<% if (isDisabled) { %>
  <button name="btn1" disabled="disabled">Hello</button>
<% } else { %>
  <button name="btn1">Hello</button>
<% } %>
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top