Problema com JSTL [RESOLVIDO]

16 respostas
L

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:when test="${not empty lista}">
  <table>
    <tr>
      <td> Coluna 1 </td>
      <td> Coluna 2 </td>
    </tr>
    <c:forEach var="i" items="${lista}">
      <tr>
        <td> <c:out value="${i.att1}"/> </td> 
        <td> <c:out value="${i.att2}"/> </td>
      </tr>
    </c:forEach>
  </table>
</c:when>
<c:otherwise>
  <c:out value="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?

16 Respostas

P

Tenta assim:

<c:when test="${!empty lista}">
L

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

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:when test="${lista.size > 0}">

Talvez dê algum resultado.
Mandar ele imprimir o tamanho da lista em um c:out também é uma alternativa.
:}

L

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

Um colega meu falou pra eu colar o seguinte trecho no começo do arquivo:

<%@ page language="java" contentType="text/html; charset=ISO-8859-1"
    pageEncoding="ISO-8859-1" isELIgnored="false" %>

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:when test="${!empty solicitacoes}">

O IDE tá acusando “attribute test does not accept any expressions”.
??? Será que estamos falando a mesma língua?

L

Alguém ajuda pelo amor de Deus!! rsrs
Já to quase voltando pro feio e funcional <% %> :smiley:

Tem pelo menos algum jeito de exibir erros no código JSTL? É difícil corrigir problemas sem ter mensagens de erro…

L

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

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.

http://www.guj.com.br/posts/list/66574.java#350515

L

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

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

é 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

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…

V

Simples, mapeamento no web.xml:

&lt;error-page&gt;
  &lt;exception-type&gt;java.lang.RuntimeException&lt;/exception-type&gt;
  &lt;location&gt;/erro.jsp&lt;/location&gt;
&lt;/error-page&gt;

e página de erro:

&lt;%@ page isErrorPage="true" %&gt;
&lt;!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN"&gt;
&lt;html&gt;
&lt;head&gt;
&lt;title&gt;Erro&lt;/title&gt;
&lt;link href="css/estilo.css" rel="stylesheet" type="text/css" /&gt;
&lt;/head&gt;

&lt;body&gt;
  &lt;div&gt;
    &lt;%exception.printStackTrace(new java.io.PrintWriter(out, true));%&gt;
  &lt;/div&gt;
&lt;/body&gt;
&lt;/html&gt;

isso ai funciona direitinho pra oque vc quer. e força o erro novamente que vc vai ver que funciona.

L

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

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.

L

Eu testei ué… dá um look no meu web.xml

<error-page>
        <exception-type>java.lang.Throwable</exception-type>
        <location>/erro.jsp</location>
    </error-page>
	
    <error-page>
        <exception-type>java.lang.RuntimeException</exception-type>
        <location>/erro.jsp</location>
    </error-page>

Acho que tá até redundante né… rs

Minha página de erro é a seguinte:

<%@ page isErrorPage="true" %>
<%@ page contentType="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>
        <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
        <title>JSP Page</title>
    </head>
    <body>
        <%exception.printStackTrace(new java.io.PrintWriter(out, true));%>
    </body>
</html>
Criado 3 de outubro de 2008
Ultima resposta 5 de out. de 2008
Respostas 16
Participantes 4