Problema com a taglib c:forEach

7 respostas
D

Bom dia pessoal,

Sou iniciante em uso de taglibs e estou com a seguinte dificuldade:

Tenho um servlet que coloca em escopo de request uma collection e redireciona para um jsp:

....
			c = new ArrayList<Object>();

			rs =  pstm.executeQuery();
			while(rs.next()){
				c.add(new Object[]{new Long(rs.getLong(1)),rs.getString(2),rs.getString(3),rs.getString(4),rs.getInt(5),rs.getString(6)});
			}

request.setAttribute("manutencoes", c);

		// encaminho navegação
		return request.getParameter("pagina");

No JSP eu tenho usar uma tag do core <c:forEach>, mas nada acontece. Nem dá erro nem funciona. Simplesmente a página fica em branco.

&lt;%@ page import="java.util.*" %&gt;
&lt;%@ taglib uri="http&#58;//java.sun.com/jstl/core" prefix="c" %&gt;
&lt;%
				Collection col = &#40;Collection&#41; request.getAttribute&#40;"manutencoes"&#41;;
%&gt;
	&lt;c&#58;catch var="excecao"&gt;
		&lt;c&#58;forEach items="$&#123;col&#125;" var="obj&#91;&#93;" varStatus="status"&gt;
			&lt;c&#58;out value="Teste"/&gt;
			&lt;c&#58;out value="$&#123;status.count&#125;"/&gt;
		&lt;/c&#58;forEach&gt;
	&lt;/c&#58;catch&gt;
	&lt;c&#58;out value="$&#123;excecao&#125;" escapeXml="false"&gt;nunhuma exceção&lt;/c&#58;out&gt;

Alguém pode me ajudar?

Obrigado,
Dnax

7 Respostas

D

tente fazer assim:

&lt;c&#58;forEach items="$&#123;requestScope.manutencoes&#125;"...
D

Muito obrigado. Funcionou perfeitamente.
:grin:
Posso pedir mais uma ajuda?

Como faço para acessar os métodos dessa coleção? Tentei das duas formas abaixo e a página ficou em branco.

&lt;c&#58;out value="$&#123;requestScope.manutencoes.isEmpty&#125;"/&gt;
&lt;c&#58;out value="$&#123;requestScope.manutencoes.isEmpty&#40;&#41;&#125;"/&gt;

Existe alguma forma de verificar qual o erro de sintaxe que ocorreu na página? É que ela só fica em branco e eu fico sem referência nenhuma.

Mais uma vez, obrigado.

D

Pessoal,

:grin: Consegui fazer a verificação que precisava (se a collection estava vazia) com o código abaixo:

&lt;c&#58;choose&gt; 
 					 
  &lt;c&#58;when test="$&#123;empty requestScope.manutencoes&#125;"&gt;
...

Porém ainda não sei como fazer para ver os erros que ocorreram ao invés da tela ficar em branco. Alguém sabe como configurar isso? :?:

[]s

G

“Dnax”:
Pessoal,

:grin: Consegui fazer a verificação que precisava (se a collection estava vazia) com o código abaixo:

&lt;c&#58;choose&gt; 
 					 
  &lt;c&#58;when test="$&#123;empty requestScope.manutencoes&#125;"&gt;
...

nesse caso vc usou o operador empty… que faz parte da EL
hum… e sobre os erros, eu acho que não tem como…
:wink:

D

É… Essa parte dos erros é complicada. Não achei nenhuma referência que falasse sobre isso. :cry:

A questão do empty funcionou certinho, mas ainda fiquei sem saber como chamar um método pela JSTL :?:

Se alguém puder ajudar.

[]s :jcup:

M

Salve Dnax,

Bem, na verdade quando você trabalha com JSTL o interessante é tratar as exeções no Bean ou Servlet que irá compor as informações que serão exibidas em teu JSP. Você pode utilizar Flag’s para responder a determinados tipos de exeções… caso queria trata-las exclusivamente…

Quanto a chamada de métodos posso lhe sugerir que caso necessite de utilizar um método em especial, faça isto no teu bean ou criei uma própria TagLib… aí chamar o método é o mais fácil como algumas funciotions da própria JSTL:

&lt;%@ taglib prefix=&quot;fn&quot; uri=&quot;http&#58;//java.sun.com/jsp/jstl/functions&quot; %&gt; &lt;c&#58;set var=&quot;nome&quot; value=&quot;$&#123;fn&#58;split&#40;Disciplina,'-'&#41;&#125;&quot;/&gt;

até mais.

:okok:

A

Cara,

para tratar este tipo é erro é muito simples, vc testa se sua lista de valores esta vazia, se estiver exibe um conteudo, se não estiver vc chama o for each!
<c:if test="${not empty tedDevolvidaForm.map.itensPlc}">

<c:forEach items="${tedDevolvidaForm.map.itensPlc}" var=itensPlc varStatus=i>

Ai vc nao fica com a tela em branco!
Criado 23 de abril de 2005
Ultima resposta 25 de abr. de 2005
Respostas 7
Participantes 5