[RESOLVIDO] Usar List em taglib

8 respostas
marcinh0

Olá. sou novo no fórum e iniciante em java e estou estudando com a ajuda da apostila fj21 da caelum.

Minha dúvida é no exercicio 10.6, que é sobre filtros. Eu consegui aplicar corretamente o filtro para criar uma só conexão, porém eu tenho uma página JSP que exibe uma lista com todos os contato cadastrados e somente esta não consegui fazer funcionar. Não sei como farei para instanciar a classe ContatoDAO enviando um parâmetro connection (como fiz nas outras e deu certo) pelo fato dessa página utilizar taglib, não sei nem se pe possivel. Segue os codigos. Obrigado

Pagina com mesma função, porém feita utilizando scriptlet
<%@ page import="java.util.*, java.text.*, br.com.caelum.jdbc.dao.*,
br.com.caelum.jdbc.modelo.*, java.sql.Connection"%>


<%@page import="java.text.SimpleDateFormat"%><html>
<body>
<table border='1'>
	<thead bgcolor='#B5B5B5'>
		<tr>
			<th>Nome</th>
			<th>E-mail</th>
			<th>Endereço</th>
			<th>Data de Nascimento</th>
		</tr>
	</thead>
	<tbody bgcolor='#DCDCDC'>
		<% Connection connection = (Connection)request.getAttribute("connection");
			
		ContatoDAO dao = new ContatoDAO(connection);
			List<Contato> contatos = dao.getLista();
			for(Contato contato : contatos ){ %>
		<tr>
			<td><%=contato.getNome()%></td>
			<td><%=contato.getEmail()%></td>
			<td><%=contato.getEndereco()%></td>
			<td>
				<%Format formato = new SimpleDateFormat("dd'/'MM'/'yyyy");%>
				<%=formato.format(contato.getDatanascimento().getTime())%>
			</td>
		</tr>
		<%} %>
	</tbody>
</table>
</body>
</html>

Como fazer a mesma funcionalidade utilizando taglibs? Tem como?

<%@ taglib uri="http://java.sun.com/jsp/jstl/fmt" prefix="fmt" %>
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
<c:import url="cabecalho.jsp"/>
	<jsp:useBean id="dao" class="br.com.caelum.jdbc.dao.ContatoDAO"/>
	
	
	<table border='1'>
		<thead bgcolor='#0000FF'>
		<tr>
				<th><font color='#FFFFFF'>ID</font></th>
				<th><font color='#FFFFFF'>Nome</font></th>
				<th><font color='#FFFFFF'>E-mail</font></th>
				<th><font color='#FFFFFF'>Endereço</font></th>
				<th><font color='#FFFFFF'>Data de Nascimento</font></th>
				<th><font color='#FFFFFF'>Opções</font></th>
		</tr>
		</thead>
		<c:forEach var="contato" items="${dao.lista}" varStatus="id">
			<tr align='center' bgcolor="#${id.count % 2 == 0 ? 'aaee88' : 'ffff00'}">
				<td>${contato.id}</td>
				<td>${contato.nome}</td>
				<td>
					<c:choose>
						<c:when test="${empty contato.email}">
						E-mail não Informado
						</c:when>
						<c:otherwise>
						<a href="mailto:${contato.email}">${contato.email}</a>
						</c:otherwise>
					</c:choose>
				</td>
				<td>${contato.endereco}</td>
				<td><fmt:formatDate value="${contato.datanascimento.time}" pattern="dd/MM/yyyy"/></td>
				<td align='center'>
					
						<a href="http://localhost:8080/agenda/mvc?logica=RemoveContatoLogic&id=${contato.id}&
						nome=${contato.nome}&endereco=${contato.endereco}&email=${contato.email}&
						dataNascimento=02/02/2010&link=lista-contatos-elegante.jsp" ><img border="0" src="<c:url value='/imagens/botao-excluir.gif'/>" alt="Excluir"/></a>
						
						<a href="http://localhost:8080/agenda/testa-altera-mvc.jsp?id=${contato.id}&dataNascimento=<fmt:formatDate value="${contato.datanascimento.time}" pattern="dd/MM/yyyy"/>"><img border="0" src="<c:url value='/imagens/icone-editar.gif'/>" alt="Editar"/></a>
					
				</td>
			</tr>
		</c:forEach>
	</table>
	<p>
		<a href="http://localhost:8080/agenda/adiciona-contato.jsp" style="margin-right: -530px;">
		<img border="0" src="<c:url value='/imagens/icone-incluir.jpg'/>" alt="Novo Contato"/></a>
	</p>
<c:import url="rodape.jsp"/>

Desde já agradeço!

8 Respostas

aeciovc

assim vc não passa parametro!!

e pra usar TagLibs… JSTL e etc… vc não passa parametros.

experimente colocar essa Connecion em um outro lugar no lugar de passar como parametro!

ela pode estar dentro da Classe DAO obtendo a instância de outra classe chamada Conexão por exemplo!>

Hebert_Coelho

Pq na action vc não seta a lista no request e só itera em cima dele na jsp?

Acaba por ficar fora de padrão colocar esse tipo de lógica em JSP. Sua view não tem que fazer consulta, ela deve apenas exibir dados. [=

Sacou?

marcinh0
aeciovc:
<jsp:useBean

assim vc não passa parametro!!

e pra usar TagLibs... JSTL e etc... vc não passa parametros.

experimente colocar essa Connecion em um outro lugar no lugar de passar como parametro!

ela pode estar dentro da Classe DAO obtendo a instância de outra classe chamada Conexão por exemplo!>

Então, o projeto ja tava com a connection dentro do DAO, mas a idéia da apostila era não criar uma conexão para cada vez q vc instanciar o DAO, portanto foi criado um filtro para criar somente uma conexão, fazer todo o trabalho com o banco de dados e depois fechá-la, para não sobrecarregar. Vou postar o código do filtro, quem sabe clareia um pouco mais... no filtro tem essa função, que controla abertura de conexão e garante o fechamento após o processo:

public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
		throws IOException, ServletException{
		
		try{
			Connection connection = new ConnectionFactory().getConnection();
			
			request.setAttribute("connection", connection);
			
			chain.doFilter(request, response);
			
			connection.close();
		}catch(SQLException e){
			throw new ServletException(e);
		}
	}
Pq na action vc não seta a lista no request e só itera em cima dele na jsp?

Não entendi essa idéia.

Hebert_Coelho

Onde vc faz esse código:

public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
		throws IOException, ServletException{
		
		try{
			Connection connection = new ConnectionFactory().getConnection();
			
			request.setAttribute("connection", connection);
			
			chain.doFilter(request, response);
			
			connection.close();
		}catch(SQLException e){
			throw new ServletException(e);
		}
	}

Adicione a lista no request que vai estar pronto:

public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
		throws IOException, ServletException{
		
		try{
			Connection connection = new ConnectionFactory().getConnection();
			//O dao não precisa ir mais
			//request.setAttribute("connection", connection);
			List<Contato> contatos = dao.getLista();
			//Envia apenas a lista com contatos
			request.setAttribute("contatos ", contatos );
			
			chain.doFilter(request, response);
			
			connection.close();
		}catch(SQLException e){
			throw new ServletException(e);
		}
	}

Agora basta iterar na lista dentro da JSP.

marcinh0

Opa, clareou um pouco mais pra mim… porém ainda não consegui fazer funcionar.

Eu pesquisei um pouquinho sobre Iteração na JSP e percebi que isso eh feito com a ajuda de um framework, estou certo?
Porém ainda não cheguei na parte de Struts da apostila (proximo capitulo) e creio que devo fazer isso funcionar com o que ja vi até o capítulo que estou, que foi JSP, Taglibs e Expression Language. E não consigo resolver isso, será que tem como?

Obrigado pelas respostas, estão me ajudando muito! :roll:

marcinh0

Consegui fazer funcionar! Por favor, dêem uma olhada e me digam se está "aceitável" o jeito que eu usei, lembrando que a intenção é não usar nenhum framework, pois nao cheguei no capítulo de struts ainda...

Exibição da Lista, arquivo JSP
Tirei o javabean e na tag da lista, adicionei o comando para buscar a lista no request (não conhecia esse)

<%@ taglib uri="http://java.sun.com/jsp/jstl/fmt" prefix="fmt" %>
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
<c:import url="cabecalho.jsp"/>
	

	<table border='1'>
		<thead bgcolor='#0000FF'>
		<tr>
				<th><font color='#FFFFFF'>ID</font></th>
				<th><font color='#FFFFFF'>Nome</font></th>
				<th><font color='#FFFFFF'>E-mail</font></th>
				<th><font color='#FFFFFF'>Endereço</font></th>
				<th><font color='#FFFFFF'>Data de Nascimento</font></th>
				<th><font color='#FFFFFF'>Opções</font></th>
		</tr>
		</thead> 
		<c:forEach var="contato" items="${requestScope.contatos}" varStatus="id">
			<tr align='center' bgcolor="#${id.count % 2 == 0 ? 'aaee88' : 'ffff00'}">
				<td>${contato.id}</td>
				<td>${contato.nome}</td>
				<td>
					<c:choose>
						<c:when test="${empty contato.email}">
						E-mail não Informado
						</c:when>
						<c:otherwise>
						<a href="mailto:${contato.email}">${contato.email}</a>
						</c:otherwise>
					</c:choose>
				</td>
				<td>${contato.endereco}</td>
				<td><fmt:formatDate value="${contato.datanascimento.time}" pattern="dd/MM/yyyy"/></td>
				<td align='center'>
					
						<a href="http://localhost:8080/agenda/mvc?logica=RemoveContatoLogic&id=${contato.id}&
						nome=${contato.nome}&endereco=${contato.endereco}&email=${contato.email}&
						dataNascimento=02/02/2010&link=lista-contatos-elegante.jsp" ><img border="0" src="<c:url value='/imagens/botao-excluir.gif'/>" alt="Excluir"/></a>
						
						<a href="http://localhost:8080/agenda/testa-altera-mvc.jsp?id=${contato.id}&dataNascimento=<fmt:formatDate value="${contato.datanascimento.time}" pattern="dd/MM/yyyy"/>"><img border="0" src="<c:url value='/imagens/icone-editar.gif'/>" alt="Editar"/></a>
					
				</td>
			</tr>
		</c:forEach>
	</table>
	<p>
		<a href="http://localhost:8080/agenda/adiciona-contato.jsp" style="margin-right: -530px;">
		<img border="0" src="<c:url value='/imagens/icone-incluir.jpg'/>" alt="Novo Contato"/></a>
	</p>
<c:import url="rodape.jsp"/>

Função do filtro

Fiz mais ou menos como o jakefrog me indicou!

public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
		throws IOException, ServletException{
		
		try{
			Connection connection = new ConnectionFactory().getConnection();
			
			request.setAttribute("connection", connection);
			
			ContatoDAO dao = new ContatoDAO(connection);
			List<Contato> contatos = dao.getLista();
			//envia apenas a lista com contatos
			request.setAttribute("contatos", contatos);
			
			chain.doFilter(request, response);
			
			connection.close();
		}catch(SQLException e){
			throw new ServletException(e);
		}
	}

MUITO OBRIGADO PELA AJUDA, PESSOAL! :D

Hebert_Coelho

Cara, ficou show!

Ta no caminho certo. Utilizando Struts não mudaria muuuuita coisa não.

Já que tu ta querendo aprender mesmo, 2 coisas vc pode colocar. Uma é estilo CSS. Ao invés de para cada fonte vc ter que colocar o #FFFF blah, vc configura uma vez e chama depois a atributo da classe tipo styleId=“linha”. Rapaz, fica show e OO.

Outra coisa a se pensar é que. Eu já vi duas linhas de raciocínio sobre fazer IF/ELSE em jsp. Já vi gente falar que essa lógica pode ser feita na action e apenas listada na JSP. No seu caso, vc criaria duas listas: uma de quem preencheu email e outra não, e depois apenas iteraria

A outra forma é a que vc fez. Qual a melhor? Vc decide! [=

Se lembre apenas de nunk deixar regra de negócio na VIEW. A VIEW não são apenas JSPs mas incluem as actions tb.

OBS.: Coloca resolvido então no tópico uai!

Qualquer coisa, tamo ae! =D

marcinh0

Aeaeae! Valeu mesmo cara, agora entendi melhor… cada vez to aprendendo mais! Quanto ao CSS, eu já sei como funciona, como é só um projetinho da apostila nao me apeguei a isso pq o foco eh o java mesmo…

MUITO OBRIGADO

Criado 12 de julho de 2010
Ultima resposta 15 de jul. de 2010
Respostas 8
Participantes 3