Configurar a sintaxe do JSTL no JSP para listar os objetos na view

Olá, eu estou desenvolvendo um código de cadastro de contas bancárias e travei na parte de mudar a linguagem JSP para a JSTL, na parte do forEach. Eu preciso listar os atributos inseridos da classe mãe da herança e, depois, dizer qual foi o respectivo tipo de conta, utilizando o ifElse (ou choose, no caso).

Classe Controller

public class ContaBancariaController extends HttpServlet {
private static final long serialVersionUID = 1L;

public ContaBancariaController() {
	super();
}

protected void doGet(HttpServletRequest request, HttpServletResponse response)
		throws ServletException, IOException {
	
	if (request.getParameter("operacao") != null) {
		request.getRequestDispatcher("contaBancariaCadastro.jsp").forward(request, response);
	} else {
		request.setAttribute("contasBancarias", ContaBancariaDao.obterLista());

		request.getRequestDispatcher("contaBancariaLista.jsp").forward(request, response);
	}
	
	//MÉTODO EXCLUIR ESTÁ DANDO EXCEÇÃO

// int id = Integer.valueOf(request.getParameter(“id”));
//
// ContaBancariaDao.excluir(id);
//
// this.chamarListaContaBancaria(request, response);
}

protected void doPost(HttpServletRequest request, HttpServletResponse response)
		throws ServletException, IOException {

	String tipo = request.getParameter("tipo");

	int agencia = Integer.valueOf(request.getParameter("agencia"));
	int numConta = Integer.valueOf(request.getParameter("numConta"));
	float saldo = Float.valueOf(request.getParameter("saldo"));

	if ("CC".equals(tipo)) {
		ContaCorrente cc = new ContaCorrente(agencia, numConta, saldo);

		request.getSession().setAttribute("novaCC", cc);

		request.getRequestDispatcher("contaCorrenteCadastro.jsp").forward(request, response);

	} else if ("CP".equals(tipo)) {

		ContaPoupanca cp = new ContaPoupanca(agencia, numConta, saldo);

		request.getSession().setAttribute("novaCP", cp);

		request.getRequestDispatcher("contaPoupancaCadastro.jsp").forward(request, response);

	} else if ("INV".equals(tipo)) {

		Investimento inv = new Investimento(agencia, numConta, saldo);

		request.getSession().setAttribute("novoInv", inv);

		request.getRequestDispatcher("investimentoCadastro.jsp").forward(request, response);
	}
}

// private void chamarListaContaBancaria(HttpServletRequest request, HttpServletResponse response)
// throws ServletException, IOException {
// request.setAttribute(“contasBancarias”, ContaBancariaDao.obterLista());
//
// request.getRequestDispatcher(“contaBancariaLista.jsp”).forward(request, response);
// }
}

Classe DAO

public class ContaBancariaDao {

public static ContaBancaria incluir(ContaBancaria cb) {
	try {
		PreparedStatement ps = 
				Conexao.obterConexao().prepareStatement(
				"INSERT into TContaBancaria (agencia, numConta, saldo) values (?,?,?)",
				Statement.RETURN_GENERATED_KEYS
				);

		ps.setInt(1, cb.getAgencia());
		ps.setInt(2, cb.getNumConta());
		ps.setFloat(3, cb.getSaldo());
		
		ps.execute();
		
		ResultSet rs = ps.getGeneratedKeys();
		
		if(rs.next()) {
			cb.setId(rs.getInt(1));
		}
		
		return cb;
	} catch (SQLException e) {
		e.printStackTrace();
	}

	return null;
}

public static List<ContaBancaria> obterLista(){
	List<ContaBancaria> lista = new ArrayList<ContaBancaria>();
	
	lista.addAll(ContaCorrenteDao.obterLista());
	lista.addAll(ContaPoupancaDao.obterLista());
	lista.addAll(InvestimentoDao.obterLista());
	
	return lista;
}

public static boolean excluir(int id){
	try {
		PreparedStatement ps = 
				Conexao.obterConexao().prepareStatement(
						"DELETE FROM TContaBancaria WHERE id = ?"
					);

		ps.setInt(1, id);
		
		ps.execute();
		
		return true;
	} catch (SQLException e) {
		e.printStackTrace();
	}
		
	return false;
}

}

JSP PAGE da lista da classe Mãe

<%@page import=“dao.ContaBancariaDao”%>
<%@page import=“negocio.ContaCorrente”%>
<%@page import=“modelo.ContaBancaria”%>
<%@page import=“java.util.List”%>
<%@ taglib uri=“http://java.sun.com/jsp/jstl/core” prefix=“c”%>
<%@ page language=“java” contentType=“text/html; charset=UTF-8”
pageEncoding=“UTF-8”%>

contaBancariaLista <% List lista = (List) request.getAttribute("contasBancarias"); %>

Cadastramento de Contas

	<form action="ContaBancariaController" method="get">
		<input type="hidden" name="operacao" value="new">
		<button type="submit" class="btn btn-default">Novo</button>
	</form>
	<hr>

	<%
		if (lista != null) {
	%>
	<table class="table table-striped">
		<thead>
			<tr>
				<th>Id</th>
				<th>Agência</th>
				<th>Número da Conta</th>
				<th>Saldo</th>
				<th>Tipo de conta</th>
			</tr>
		</thead>
		<tbody>

			<c:forEach var="item" items="${lista}">

				<tr>
					<td>${item.id}</td>
					<td>${item.agencia}</td>
					<td>${item.numConta}</td>
					<td>${item.saldo}</td>
			</c:forEach>

			<c:choose>
				<c:when test="item instanceof ContaCorrente">
				item = "Conta-Corrente"
				</c:when>

				<c:when test="item instanceof ContaPoupanca">
				item = "Conta-Poupança"
				</c:when>


				<c:when test="item instanceof Investimento">
				item = "Investimento"
				</c:when>
			</c:choose>

			<form action="ContaBancariaController" method="get">
				<input type="hidden" name="idContaBancaria" value="${item.id}">
				<td><button type="submit" class="btn btn-default">Excluir</button></td>
			</form>

			<%-- 				<% --%>
			<%-- 				for (ContaBancaria item : lista) { --%>
			<%-- 				%> --%>
			<!-- 				<tr> -->
			<%-- 					<td><%=item.getId()%></td> --%>
			<%-- 					<td><%=item.getAgencia()%></td> --%>
			<%-- 					<td><%=item.getNumConta()%></td> --%>
			<%-- 					<td><%=item.getSaldo()%></td> --%>
			<%-- 					<td><%=item instanceof ContaCorrente ? "Conta-Corrente" : "Conta-Poupança"%></td> --%>



			</tr>
			<%-- 				<% --%>
			<!-- //  					}  -->
			<%-- 				%> --%>

		</tbody>
	</table>
	<%
		} else {
	%>
	<p>Nenhuma conta cadastrada!</p>
	<%
		}
	%>
</div> </body> </html>

O código salva as informações no mySQL, mas não apresenta a lista que está no BD na View da aplicação. Quando o código estava somente com a linguagem JSP, ele listava tudo, sem nenhum erro; mas, agora, apesar de não apresentar alguma exceção, o código não lista na View as contas que eu cadastro, e eu preciso utilizar a linguagem JSTL na minha aplicação.

Eu desconfio que seja na parte do ifElse (choose), pois, quando o professor deu um exemplo em sala de aula, ele usou a condição ternária, porém eu possuo três subclasses na herança.

Se alguém puder me ajudar, eu agradeço!

Será que você não tá fechando o for antes da hora?

Tenta assim:

<table class="table table-striped">
		<thead>
			<tr>
				<th>Id</th>
				<th>Agência</th>
				<th>Número da Conta</th>
				<th>Saldo</th>
				<th>Tipo de conta</th>
			</tr>
		</thead>
		<tbody>

			<c:forEach var="item" items="${lista}">

				<tr>
					<td>${item.id}</td>
					<td>${item.agencia}</td>
					<td>${item.numConta}</td>
					<td>${item.saldo}</td>
					<c:choose>
						<c:when test="item instanceof ContaCorrente">
						item = "Conta-Corrente"
						</c:when>

						<c:when test="item instanceof ContaPoupanca">
						item = "Conta-Poupança"
						</c:when>


						<c:when test="item instanceof Investimento">
						item = "Investimento"
						</c:when>
					</c:choose>

					<form action="ContaBancariaController" method="get">
						<input type="hidden" name="idContaBancaria" value="${item.id}">
						<td><button type="submit" class="btn btn-default">Excluir</button></td>
					</form>

					<%-- 				<% --%>
					<%-- 				for (ContaBancaria item : lista) { --%>
					<%-- 				%> --%>
					<!-- 				<tr> -->
					<%-- 					<td><%=item.getId()%></td> --%>
					<%-- 					<td><%=item.getAgencia()%></td> --%>
					<%-- 					<td><%=item.getNumConta()%></td> --%>
					<%-- 					<td><%=item.getSaldo()%></td> --%>
					<%-- 					<td><%=item instanceof ContaCorrente ? "Conta-Corrente" : "Conta-Poupança"%></td> --%>

			</tr>
			</c:forEach>
			<%-- 				<% --%>
			<!-- //  					}  -->
			<%-- 				%> --%>

		</tbody>
	</table>

Não funcionou… só triplicou os dados inseridos no BD :confused:
Eu acho que o problema pode estar no choose, mas se estiver realmente errado, eu não sei consertar…

Como era o código que funcionava?

Desse modo:

<%
for (ContaBancaria item : lista) {
%>


<%=item.getId()%>
<%=item.getAgencia()%>
<%=item.getNumConta()%>
<%=item.getSaldo()%>
<%=item instanceof ContaCorrente ? “Conta-Corrente” : “Conta-Poupança”%>
				<form action="ContaBancariaController" method="get">
					<input type="hidden" name="id" value="${item.id}">
					<td><button type="submit" class="btn btn-default">Excluir</button></td>
				</form>

			</tr>

			<%
				}
			%>

		</tbody>
	</table>
	<%
		} else {
	%>
	<p>Nenhuma conta cadastrada!</p>
	<%
		}
	%>

Mas preciso colocar esse código em JSTL e só tive uma aula de aprendizado de JSTL.

Aqui você diz que item é um objeto que representa um elemento da tua lista.

Dentro do choose, em cada caso, você atribui um valor String para o item, como assim?

O que você está tentando fazer com isso, exatamente?

Você tem um for dentro do for, acho que esqueceu de apagar o código antigo.
Testa isso:

<table class="table table-striped">
		<thead>
			<tr>
				<th>Id</th>
				<th>Agência</th>
				<th>Número da Conta</th>
				<th>Saldo</th>
				<th>Tipo de conta</th>
			</tr>
		</thead>
		<tbody>

			<c:forEach var="item" items="${lista}">

				<tr>
					<td>${item.id}</td>
					<td>${item.agencia}</td>
					<td>${item.numConta}</td>
					<td>${item.saldo}</td>
					<c:choose>
						<c:when test="item instanceof ContaCorrente">
							<td>Conta-Corrente</td>
						</c:when>

						<c:when test="item instanceof ContaPoupanca">
						    <td>Conta-Poupança</td>
						</c:when>


						<c:when test="item instanceof Investimento">
							<td>Investimento</td>
						</c:when>
					</c:choose>

					<form action="ContaBancariaController" method="get">
						<input type="hidden" name="idContaBancaria" value="${item.id}">
						<td><button type="submit" class="btn btn-default">Excluir</button></td>
					</form>
			</tr>
			</c:forEach>
		</tbody>
	</table>

Estou querendo imprimir a seleção que eu criei no controller da classe mãe. Como tive só uma aula de JSTL, eu não sei como faz para receber o valor no choose… Desculpa a demora para responder, é que estou com um monte de projetos para entregar na facul, daí tô sem tempo nenhum :confused:

Funcionou aqui! Pensava que no choose o valor tinha que receber algo de alguma variável, mas é como se fosse um return, então :smiley: Desculpa a demora para responder, é que estou com um monte de projetos para entregar na facul, daí tô sem tempo nenhum… Muito obrigado, @RoinujNosde!