Peço desculpa pela pergunta que deve ser básica, mas cansei de procurar na internet e não consigo achar a solução.
Sou novo no JSTL e estou tendo o seguinte problema:
Numa página JSP, eu recebo um ArrayList através de um atributo no request, para que a página possa exibir seus dados.
Antes de exibir os dados, eu devo verificar se a lista está vazia, porque se estiver eu devo exibir uma dada mensagem. Meu código está assim:
<c:choose><c:whentest="${notemptylista}"><table><tr><td>Coluna1</td><td>Coluna2</td></tr><c:forEachvar="i"items="${lista}"><tr><td><c:outvalue="${i.att1}"/></td><td><c:outvalue="${i.att2}"/></td></tr></c:forEach></table></c:when><c:otherwise><c:outvalue="Nenhuma dado a ser exibido...."/></c:otherwise></c:choose>
Mas não tá funcionando… Não está aparecendo nada na tela e não ta vindo nenhuma exceção, tá difícil saber o que pode estar errado.
Estou desconfiado do teste de lista vazia. Os atributos que vem no request vem como Object, será que o JSTL já “sabe” que o atributo lista pode ser um ArrayList e está usando o “empty” corretamente?
prbpedro, já tentei mas deu no mesmo…
Até já vi google afora que tanto o operador ! quanto not são aceitos do mesmo jeito…
N
NataliaOliveira
Olá,
Você já tentou mudar a sua condição de teste? Ao invés de usar algum método isEmpty, verificar através do tamanho da lista?
Algo como:
<c:whentest="${lista.size>0}">
Talvez dê algum resultado.
Mandar ele imprimir o tamanho da lista em um c:out também é uma alternativa.
:}
L
leandrocm86
Natalia, pior que já tentei isso também… já tentei de todo jeito, acho que deve estar faltando é fazer alguma coisa antes mesmo…
Eu realmente acho que de alguma forma eu devo indicar que se trata de um ArrayList… será que esse JSTL é tão poderoso que esse empty já iria identificar o atributo “lista” como uma coleção?
Ainda estou aprendendo, não sei como as coisas realmente funcionam… Não achei nenhum exemplo completo na internet que usa JSTL pra manipular coleções vindas no request.
L
leandrocm86
Um colega meu falou pra eu colar o seguinte trecho no começo do arquivo:
Não faço idéia do que isso faz, mas pelo menos agora o IDE começou a acusar erros no código.
Mas o erro é muito estranho. Na linha:
<c:whentest="${!emptysolicitacoes}">
O IDE tá acusando “attribute test does not accept any expressions”.
??? Será que estamos falando a mesma língua?
L
leandrocm86
Alguém ajuda pelo amor de Deus!! rsrs
Já to quase voltando pro feio e funcional <% %>
Tem pelo menos algum jeito de exibir erros no código JSTL? É difícil corrigir problemas sem ter mensagens de erro…
L
leandrocm86
CONSEGUI!!!
O problema era só que eu estava tentando acessar um atributo que não existia. Se você errar o nome na hora de chamar alguma variável qualquer, o browser simplesmente não exibe nada da página inteira! É porque o servidor de aplicação tenta compilar a página toda antes de exibir o conteudo, mas como houve erro, a compilação não é bem sucedida e a página não é exibida.
Isso é uma grave desvantagem em comparação ao uso de scriplets ( <% e %> ), porque com scriplets o próprio IDE ajuda na correção de erros de sintaxe durante a edição…
Fiquei desorientado, porque havia erro e eu não havia a mínima idéia do que poderia ser…
V
vanilton.coelho
Cara, não é desvantagem, você que não mapeou ou usou nenhuma mensagem de erro, vc deveria setar uma página de erro saca??? no seu arquivo web.xml é uma opção. Um exemplo de como fazer isso vc pode encontrar aqui neste post.
Eu até tenho uma tela de erro (pra Throwable), mas não teve exceção alguma.
Simplesmente não dá pra saber o que deu errado… talvez só no log do servidor de aplicação, sei lá, mas nem vi isso…
Não digo que é uma desvantagem em relação ao recurso da linguagem, mas é uma coisa do JSTL que dificulta no processo de desenvolvimento.
Você tem que procurar os erros direto no código, sem nenhuma pista.
L
leandrocm86
Corrigindo: Na verdade nem é problema do JSTL, mas da EL mesmo…
Quando vc faz um acesso dinâmico com ${} a verificação de tipo é em tempo de execução né… o IDE nunca vai poder saber se você tá usando o tipo adequadamente, chamando algum método inexistente etc…
Mas o grande problema é a falta de mensagem de erro mesmo, e a página inteira não ser exibida…
V
vanilton.coelho
é justamente isso que estou falando, tem como definir uma página de erro para erros especificos, se é em tempo de execução que vc quer, é só vc especificar no web.xml o tipo de erro e a página que irá mostrar. inclusive vc pode ter uma página de erro para cada exceção, erro 500 uma página, 403 outra página, RuntimeException, outra página, NullpointerException, outra página e assim por diante, sacou???
L
leandrocm86
saquei…
Mas tem como eu mandar imprimir a causa do erro nessa página?
Isso eu não sei fazer… configurei uma página padrão de erro que aparece em todas as exceções não tratadas, mas só isso…
Nesse caso do erro de EL ela nem foi chamada, como eu disse a tela só ficou em branco, mas mesmo se ela fosse chamada só teria uma mensagem padrão de erro né, sem especificar pro desenvolvedor o que aconteceu…
Quando o sistema tiver pronto, a mensagem de erro a ser exibida pro usuário deve ser padrão mesmo, o problema é durante o desenvolvimento, que eu preciso rastrear o erro…
<%@pageisErrorPage="true"%><!DOCTYPEHTMLPUBLIC"-//W3C//DTD HTML 4.0 Transitional//EN"><html><head><title>Erro</title><linkhref="css/estilo.css"rel="stylesheet"type="text/css"/></head><body><div><%exception.printStackTrace(newjava.io.PrintWriter(out,true));%></div></body></html>
isso ai funciona direitinho pra oque vc quer. e força o erro novamente que vc vai ver que funciona.
L
leandrocm86
Eu não sabia desse <%exception.printStackTrace(new java.io.PrintWriter(out, true));%>
Valeu!
Mas pra erro de EL mesmo assim não tem mensagem… rsrs
Pode testar aí… Basta fazer no código algo assim ${objeto.atributo2} sem que atributo2 exista, por exemplo, como se o nome do atributo correto fosse atributo1.
Se você errar na digitação em EL a coisa pode ficar preta… Será que tem como achar uma mensagem de erro pra isso?
V
vanilton.coelho
teste rapaz, esse mapeamento que te passei é justamente para isso, exceções de Runtime, vai servir na hora do EL avaliar as variaveis e verificar que não existe ou qualquer outro erro do genero.
<%@pageisErrorPage="true"%><%@pagecontentType="text/html"pageEncoding="UTF-8"%><!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"><html><head><metahttp-equiv="Content-Type"content="text/html; charset=UTF-8"><title>JSP Page</title></head><body><%exception.printStackTrace(newjava.io.PrintWriter(out,true));%></body></html>