Como retornar valores na própria JSP usando Servlet

6 respostas
jspjavamysqlservlet
Y

Boa noite pessoal
Sou iniciante na área, e gostaria de tirar uma dúvida.

Eu montei uma página JSP onde, ao preencher os campos de um Formulário, ele retorna abaixo uma tabela. (No meu caso, seria passagens aéreas, ao ele preencher a origem, destino, data da partida e data da volta, ele deveria retornar abaixo com uma tabela com os dados).

Estou utilizando uma servlet na qual acessa o método da DAO, para fazer um ‘‘select’’ nos dados, e em seguida eu estou dando getRequestDispatcher na própria página JSP.

protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
	Voo voo = new Voo();
	voo.setOrigem(request.getParameter("origem"));
	voo.setDestino(request.getParameter("destino"));
	
	SimpleDateFormat formatoData = new SimpleDateFormat("yyyy/MM/dd");
	String data = request.getParameter("partida");
	Calendar c = Calendar.getInstance();

	try {
		c.setTime(formatoData.parse(data));
		
	} catch (Exception e) {
		
	} 
	voo.setDataPartida(c);
	
	SimpleDateFormat formatoData2 = new SimpleDateFormat("yyyy/MM/dd");
	String data2 = request.getParameter("volta");
	Calendar c2 = Calendar.getInstance();
	
	try {
		c.setTime(formatoData2.parse(data2));
		
	} catch (Exception e) {
		
	} 
	voo.setDataChegadaPrevista(c2);
	
	VooDAO vooDAO = new VooDAO();
	vooDAO.pesquisarVoosDetalhada();
	
	request.setAttribute("vooDAO", vooDAO);
	
	getServletContext().getRequestDispatcher("/paginas/buscarVoo.jsp").forward(request, response);


}

Porém, ele só está atualizando a página e não retorna nenhum dado. Alguém pode me ajudar?
Abaixo está o código da JSP

<%
			
				ArrayList<Voo> lista = new ArrayList<Voo>();					
			
		    	for (Voo voo : lista) {
	  		 %>
	  
	       	<tr>
			    <td><%=voo.getNumero()%></td>
			    <td><%=voo.getFileiras()%></td>
			    <td><%=voo.getPoltronasPorFileira()%></td>
			    <td><%=voo.getPrecoTrecho()%></td>
			    <td><%=voo.getOrigem()%></td>
			    <td><%=voo.getDestino()%></td>
			    <td><%=voo.getDataPartida()%></td>
			    <td><%=voo.getHoraPartida()%></td>
			    <td><%=voo.getDataChegadaPrevista()%></td>
			    <td><%=voo.getHoraChegadaPrevista()%></td>
			</tr>
	
	    	<%
	    	}
	  		%>

6 Respostas

M

Bom dia, tem dois probleminhas ai:

Você tem que passar uma lista de Voos e não o DAO

List<Voo> voos = vooDAO.pesquisarVoosDetalhada();

request.setAttribute("voos", voos);
  1. Você tem que recuperar o voo, apenas criar um arrayList e iterar não da certo
/*
* É necessário fazer um casting,
* pois o método getAttribute
* retorna Object
*/

<%
List<Voo> voos = (List<Voo>) request.getAttribute("voos");
%>
M

Mas ele não aprendeu Scriptlets ainda, deixa-o ir aos poucos…

JSTL é muito melhor, mas uma coisa de cada vez

Y

Eu tentei fazer da forma que vocês falaram, até usei algumas coisas diferentes que procurei, mas ainda não consegui.

Na servlet ficou assim

protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
	String origem = request.getParameter("origem");
	String destino = request.getParameter("destino");
	
	SimpleDateFormat formatoDataPartida = new SimpleDateFormat("yyyy/MM/dd");
	String dataPtda = request.getParameter("partida");
	Calendar calIda = Calendar.getInstance();
	
	SimpleDateFormat formatoDataVolta = new SimpleDateFormat("yyyy/MM/dd");
	String dataVlta = request.getParameter("volta");
	Calendar calVolta = Calendar.getInstance();

	try {
		calIda.setTime(formatoDataPartida.parse(dataPtda));
		calVolta.setTime(formatoDataVolta.parse(dataVlta));
		
	} catch (Exception e) {
		
	} 
	
	VooDAO vooDAO = new VooDAO();
	
	ArrayList<Voo> vooPartida = vooDAO.pesquisarVoosDetalhada(origem, destino, calIda);
	ArrayList<Voo> vooVolta = vooDAO.pesquisarVoosDetalhada(destino, origem, calVolta);
	
	request.setAttribute("vooPartida", vooPartida);
	request.setAttribute("vooVolta", vooVolta);
	
	request.getRequestDispatcher("/paginas/buscarVoo.jsp").forward(request, response);

}

Esse método que eu uso da pesquisa está na classe VooDAO, que está assim:

public ArrayList<Voo> pesquisarVoosDetalhada(String origem, String destino, Calendar dataPartida) {
	Connection conexao = ConnectionFactory.getConnection();
	String sql = "SELECT * FROM Voo WHERE origem = ?, AND destino = ?, AND dataPartida = ?";
	
	try {
		PreparedStatement prepared = conexao.prepareStatement(sql);
		
		ResultSet result = prepared.executeQuery();
		
		ArrayList <Voo> lista = new ArrayList();
		while(result.next()) {
			Voo temporario = new Voo();
			temporario.setId(result.getInt("id"));
			temporario.setNumero(result.getInt("numero"));
			temporario.setFileiras(result.getInt("fileiras"));
			temporario.setPrecoTrecho(result.getDouble("precoTrecho"));
			temporario.setOrigem(result.getString("origem"));
			temporario.setDestino(result.getString("destino"));
			
			Date dataPartidaT = result.getDate("dataPartida"); //data da partida
			Calendar calendarDataPartidaT = Calendar.getInstance();
			calendarDataPartidaT.setTime(dataPartidaT);
			temporario.setDataPartida(calendarDataPartidaT);			
			Date horaPartidaT = result.getDate("horaPartida"); //hora da partida
			Calendar calendarHoraPartidaT = Calendar.getInstance();
			calendarHoraPartidaT.setTime(horaPartidaT);
			temporario.setHoraPartida(calendarHoraPartidaT);	
			Date dataChegadaPrevistaT = result.getDate("dataChegadaPrevista"); //data da chegada
			Calendar calendarDataChegadaPrevistaT = Calendar.getInstance();
			calendarDataChegadaPrevistaT.setTime(dataChegadaPrevistaT);
			temporario.setDataChegadaPrevista(calendarDataChegadaPrevistaT);
			Date horaChegadaPrevistaT = result.getDate("horaChegadaPrevista"); //hora da partida
			Calendar calendarHoraChegadaPrevistaT = Calendar.getInstance();
			calendarHoraChegadaPrevistaT.setTime(horaChegadaPrevistaT);
			temporario.setDataChegadaPrevista(calendarHoraChegadaPrevistaT);

			PassagemDAO passagemDAO = new PassagemDAO();
			temporario.setPassagens(passagemDAO.listarPassagensVoo(temporario.getId()));
			
			lista.add(temporario);
		}
		
		return lista;
		
	} catch (Exception ex) {
		
	}
	return null;
}

E na JSP, no exemplo da Ida, na table ficou assim

<caption>Ida</caption>
		 <table class="table">
		  	<tr>
			    <th>Número</th>
			    <th>Origem</th>
			    <th>Destino</th>
			    <th>Data Partida</th>
			    <th>Hora Partida</th>
		  	</tr>
		  	<c:forEach var="vooPartida" items="${vooPartida}" varStatus="contador">
		  		<tr>
				    <td>${contador.index+1}</td>
				    <td>${vooPartida.origem}</td>
				    <td>${vooPartida.destino}</td>
				    <td><fmt:formatDate value="${vooPartida.dataPartida.time}" var="dataPartida" pattern="dd/MM/yyyy"/> 
				    	<c:out value="${dataPartida}" /></td>
				    <td><fmt:formatDate value="${vooPartida.horaPartida.time}" var="horaPartida" pattern="HH:mm:ss"/>
						<c:out value="${horaPartida}" /></td>
				</tr> 	
		  	</c:forEach>
		</table>
Y

O programa até vai pra Servlet, mas não apresenta nada na tela. E eu estou colocando os campos exatamente iguais como está no banco de dados. (tanto na acentuação, no formato de data que tentei de várias formas).

M

Tem certeza que o código não ta lançando exceção?

Remove essas virgulas ai pra nois

EDIT:

Coloca ex.printStackTrace() no seu catch ai, se não você não vai saber se esta dando erro…

Y

Desculpa, removi as vírgulas já.
Pra eu conseguir achar os erros, fui dando System.out.println em praticamente toda linha de código que tinha pra saber exatamente onde tava dando o problema, e ele sempre caía no catch.
Então, o que eu vi e tive que arrumar era: tirar as vírgulas, eu não tinha ‘‘setado’’ os valores que eram preenchidos, tipo, não tinha dado “prepared.setString(1, origem);” porque ele sempre retornava nulo, e os formatos yyyy-MM-dd, pois eu tinha colocado com barra ( / ) e não por hífen (-). E então acabou retornando sim o valor quando eu pesquisava hehehe.

Engraçado é que quando ele apresentou os dados na JSP, ele retornou o horário todo zerado (00:00:00).

Criado 7 de dezembro de 2018
Ultima resposta 8 de dez. de 2018
Respostas 6
Participantes 2