<c:forEach> Não Funciona

13 respostas
nandobgi

Boa tarde pessoal,

Estou fazendo uma app sem o uso de framework, mas não estou tendo sucesso em exibir meus dados, alguém pode me ajudar.

Servlet

public class ControllerEmpresa extends HttpServlet {
	
	DAOEmpresa daoEmpresa = new DAOEmpresa();
		
	public void doPost(HttpServletRequest request, HttpServletResponse response) throws
	  IOException, ServletException {
		
		String opcao = request.getParameter("txtAcao");
		
		
				
	
			
			Empresa empresa = new Empresa();
					
			empresa.setCodigo(0);
			empresa.setEmpresa(request.getParameter("txtEmpresa"));
			empresa.setEndereco(request.getParameter("txtEndereco"));
			empresa.setNumero(request.getParameter("txtNumero"));
			empresa.setBairro(request.getParameter("txtBairro"));
			empresa.setCidade(request.getParameter("txtCidade"));
			empresa.setEstado(request.getParameter("txtEstado"));
			
			daoEmpresa.cadastrar(empresa);
			listar(request,response);
	}
	
	private void listar(HttpServletRequest request, HttpServletResponse response) 
		throws IOException, ServletException {
		
		ArrayList<Empresa> listEmpresa = new ArrayList<Empresa>();
		listEmpresa = daoEmpresa.listar();
				
		
		request.setAttribute("listEmpresa", listEmpresa);
		RequestDispatcher view = request.getRequestDispatcher("admEmpresaConsulta.jsp");
		view.forward(request, response);
			
	}

}

JSP

<c:forEach var="movie" items="${listEmpresa}">
              <tr class="linha">
                   <td>${movie}</td>
                                
              </tr>
              </c:forEach>      
						     
						
						
						</table>

DAO

public void cadastrar(Empresa empresa) {
		
		try {
			prepared = con.prepareStatement("INSERT INTO EMPRESA VALUES(?,?,?,?,?,?,?)");
			prepared.setLong(1,empresa.getCodigo());
			prepared.setString(2,empresa.getEmpresa());
			prepared.setString(3,empresa.getEndereco());
			prepared.setString(4,empresa.getNumero());
			prepared.setString(5,empresa.getBairro());
			prepared.setString(6,empresa.getCidade());
			prepared.setString(7,empresa.getEstado());
			prepared.executeUpdate();			
		} catch (Exception e ) {
			e.printStackTrace();
		} finally {
			closeBD();
		}
	
	} // fim do método cadastrar
	
	public ArrayList<Empresa> listar() {
		
		
		ArrayList<Empresa> listEmpresa = new ArrayList<Empresa>();
		
		try {
			ResultSet rs = prepared.executeQuery("SELECT * FROM EMPRESA");
			
			while(rs.next()) {
				
				Empresa empresa = new Empresa();
				empresa.setCodigo(rs.getLong("CODIGO"));
				empresa.setEmpresa(rs.getString("EMPRESA"));
				empresa.setEndereco(rs.getString("ENDERECO"));
				empresa.setNumero(rs.getString("NUMERO"));
				empresa.setBairro(rs.getString("BAIRRO"));
				empresa.setCidade(rs.getString("CIDADE"));
				empresa.setEstado(rs.getString("UF"));
				
				listEmpresa.add(empresa);
				empresa = null;
			}
			
			return listEmpresa;
		} catch(Exception e) {
			e.printStackTrace();
			return null;
		}finally {
			closeBD();
		}

Os dados são gravados no BD, mas a página jsp não exibe os dados

Obrigado

13 Respostas

_Renatu

Olá

mas o que acontece?! aparece um erro na pagina? nao aparece nada?
existem erros nos logs?

um detalhe:

&lt;c:forEach var="movie" items="${listEmpresa}"&gt;
  &lt;tr class="linha"&gt;
    &lt;td&gt;${movie}&lt;/td&gt;
  &lt;/tr&gt;
&lt;/c:forEach&gt;

movie aqui é uma empresa. Portanto é um objeto. Voce pode usar os atributos bean da classe para acessar aqui. ${movie.empresa} ou ${movie.cidade} sao exemplos.

marcos.junqueira

cara, não tenho certeza, mas quando vc faz

listEmpresa.add(empresa);

vc adiciona, mas quando faz

empresa = null;

vc não está setando como nula a referencia, tanto de empresa como o item do ArrayList?
e tbm acho q não tem necessidade de setar como nulo pq vc usa essa varialvel no escopo do while, depois q terminar o while não será usada mais…

tente sem o

empresa = null;

e me diga o resultado para que eu possa confirmar minha duvida…

nandobgi

Renatu não da erro nenhum simplesmente os dados não aparecem, no caso do ${movie} meu objeto empresa ta sobreescrendo o método toString()

[ ]'s

nandobgi

Marcos tirei o empresa = null mas o erro continua, eu utilizo essa classe para mostrar dados em uma JTable e funciona normalmente.

[ ]'s

marcos.junqueira

nandobgi:
Marcos tirei o empresa = null mas o erro continua, eu utilizo essa classe para mostrar dados em uma JTable e funciona normalmente.

[ ]'s

hum… certo…

tente imprimir somente o
${listEmpresa}

coloca uma varStatus=“cont” e manda imprimir ela tbm…

marcos.junqueira
<p>${listEmpresa}</p>
&lt;c:forEach var="movie" varStatus="cont" items="${listEmpresa}"&gt;
   &lt;tr class="linha"&gt;
     &lt;td&gt;${movie} - ${cont}&lt;/td&gt;
   &lt;/tr&gt;
 &lt;/c:forEach&gt;

tem q verificar direitinho se é assim q usa o varStatus... não lembro... e to sem o que fiz aqui pra olhar...

nandobgi

Usei assim marcos

<c:forEach var="movie" varStatus="movieLoopCount" items="${listEmpresa}">
              <tr class="linha">
                   <td>${movieLoopCount.count}</td>
                   <td>${movie}</td>
                                
              </tr>
              </c:forEach>

Mas nada ainda :frowning:

marcos.junqueira

não apareceu nem o numero do contador? se sim eh porque listEmpresa não existe ou está vazia, vc imprimiu a variavel listEmpresa? não apareceu nada como null ou 3AB32C@ArrayList??

_Renatu

Este método listar() já foi testado separadamente?

nandobgi

Estranho que não me apareceu nada na página.
Tentei o seguinte:

listEmpresa = new ArrayList<Empresa>();
		listEmpresa = daoEmpresa.listar();
		for (Empresa emp : listEmpresa ) {
			out.println(emp);
		}

Ai sim eu recebo um NullPointerException, o estranho é que o mesmo método funciona utlizando JTable, fiquei perdido agora :?

[ ]'s

_Renatu

heheheh acontece…
entao o erro nao é no <c:forEach>

Tenta dar uma olhada nas conexoes, nas configuraçoes do banco, nas queries…

nandobgi

Seguinte pessoal,

Alterei esse trecho do meu código:

ResultSet rs = prepared.executeQuery("SELECT * FROM EMPRESA");

Para:

prepared = con.prepareStatement("SELECT * FROM EMPRESA");
			ResultSet rs = prepared.executeQuery();

Ai mandando a resposta direto pelo meu servlet funciona

listEmpresa = new ArrayList<Empresa>();
 		listEmpresa = daoEmpresa.listar();
 		for (Empresa emp : listEmpresa ) {
 			out.println(emp);
 		}

Se eu enviar a reposta para ser tratada no jsp com o <c:forEach> não funciona.

Ai comentei a linha abaixo e funcionou:

Empresa empresa = new Empresa();
					
			empresa.setCodigo(0);
			empresa.setEmpresa(request.getParameter("txtEmpresa"));
			empresa.setEndereco(request.getParameter("txtEndereco"));
			empresa.setNumero(request.getParameter("txtNumero"));
			empresa.setBairro(request.getParameter("txtBairro"));
			empresa.setCidade(request.getParameter("txtCidade"));
			empresa.setEstado(request.getParameter("txtEstado"));
			
		//	daoEmpresa.cadastrar(empresa); <--comentário
			listar(request, response);

O que acontece é o seguinte, se eu tento gravar os dados e listar no mesmo servlet ocorre o que os dados são gravados mas não são exibidos, com essa liha comentada os dados são apresentados

Como devo proceder?

[ ]'s

marcos.junqueira

cara, acho q o erro pode estar na hora de você colocar o arraylist no seu request, já que o metodo listar funciona no JTable…

olha lá o que acontece se vc imprimir só ${listEmpresa}

outra coisa q me veio à cabeça, tente imprimir sem o toString implicito, algo como um get…

Criado 18 de janeiro de 2007
Ultima resposta 18 de jan. de 2007
Respostas 13
Participantes 3