Problema com tomcat/JSP/HTML

14 respostas Resolvido
htmljsptomcatjava
Alexsandro_Andrade

tenho uma duvida, consegui executar um código, desde cadastrar itens até exibir eles em uma tela JSP.
no entanto eu deveria apenas dar enter na URL para que as informações na tela sejam atualizadas a cada vez que eu cadastrar um novo item, no entanto isso não acontece, apesar da informação esta corretamente gravada no banco. eu sempre tenho que reiniciar o servidor ou fazer e salvar alguma alteração no código para que as informações sejam atualizadas no browser. o que pode estar ocasionando esse problema?
obs:ja utilizei mais de um navegador.

14 Respostas

Weverton_Reis

Boa tarde Alexsandro,

Publique como você busca essas informações para serem apresentadas na JSP.

Alexsandro_Andrade

Ultilizando Servlet:

package br.com.leitemaranguape.servlets;

import java.io.IOException;
import java.util.List;

import javax.servlet.RequestDispatcher;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import br.com.leitemaranguape.persistencia.entidade.Comunicado;
import br.com.leitemaranguape.persistencia.jdbc.ComunicadoDAO;

@WebServlet("/comunicadoController")
public class ComunicadoServlet extends HttpServlet {

	List<Comunicado> lista = ComunicadoDAO.listarComunicados();
	
	@Override
	protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {

		RequestDispatcher dispatcher = req.getRequestDispatcher("admin.jsp");
		req.setAttribute("lista", lista);
		
		dispatcher.forward(req, resp);		
		
	}

	@Override
	protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {

		String titulo = req.getParameter("titulo");
		String comunicado = req.getParameter("comunicado");
		
		Comunicado com =  new Comunicado();
		com.setTitulo(titulo);
		com.setComunicado(comunicado);
		
		ComunicadoDAO dao = new ComunicadoDAO();
		dao.inserirComunicado(com); 
		
		resp.getWriter().println("comunicado - "+ com.getTitulo() +" salvo com sucesso!");

	}

}
Alexsandro_Andrade

a classe DAO que faz a comunicação com o banco

package br.com.leitemaranguape.persistencia.jdbc;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;

import br.com.leitemaranguape.persistencia.entidade.Comunicado;

public class ComunicadoDAO {

	private static Connection con = ConexaoFactory.getConnection();

	public void inserirComunicado(Comunicado com) {

		String sql = "insert into comunicado (titulo, texto) values (?,?)";

		try (PreparedStatement prepareStatement = con.prepareStatement(sql)) {

			prepareStatement.setString(1, com.getTitulo());
			prepareStatement.setString(2, com.getComunicado());
			prepareStatement.execute();
			System.out.println("inserido com sucesso!");

		} catch (SQLException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}

	}

	public void alterarComunicado(Comunicado com) {

		String sql = "update comunicado set titulo = ?, texto = ? where id=?";

		try (PreparedStatement prepareStatement = con.prepareStatement(sql)) {

			prepareStatement.setString(1, com.getTitulo());
			prepareStatement.setString(2, com.getComunicado());
			prepareStatement.setInt(3, com.getId());
			prepareStatement.execute();
			System.out.println("alterado com sucesso!");

		} catch (SQLException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}

	}

	public void excluirComunicado(Comunicado com){
		String sql = "delete from comunicado where id=?";

		try (PreparedStatement prepareStatement = con.prepareStatement(sql)) {

			prepareStatement.setInt(1, com.getId());
			prepareStatement.execute();
			System.out.println("excluido com sucesso");

		} catch (SQLException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}

	}

	public void salvarComunicado(Comunicado com) {
		if (com.getId() == null) {
			inserirComunicado(com);

		} else {
			alterarComunicado(com);

		}
	}

	/**
	 * Busca um registro no banco de dados pelo numero do ID
	 * 
	 * @param id
	 *            e o parametro que representa o codigo do comentario
	 * 
	 * @return retorna um comentario ou um valor nulo 
	 */
	public Comunicado buscaComunicadoporID(Integer id) {
		String sql = "select * from comunicado where id = ?";
		try (PreparedStatement prepareStatement = con.prepareStatement(sql)) {
			prepareStatement.setInt(1, id);

			ResultSet resultado = prepareStatement.executeQuery();
			if (resultado.next() == true) {
				Comunicado com = new Comunicado();
				com.setTitulo(resultado.getString("titulo"));
				com.setComunicado(resultado.getString("texto"));
				return com;
			}

		} catch (SQLException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		return null;
	}

	public static List<Comunicado> listarComunicados() {

		String sql = "SELECT * FROM comunicado";

		List<Comunicado> lista = new ArrayList<Comunicado>();

		try (PreparedStatement prepareStatement = con.prepareStatement(sql)) {

			ResultSet resultado = prepareStatement.executeQuery();
			while (resultado.next() == true) {
				Comunicado com = new Comunicado();
				com.setId(resultado.getInt("id"));
				com.setTitulo(resultado.getString("titulo"));
				com.setComunicado(resultado.getString("texto"));
				lista.add(com);

			}

		} catch (SQLException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}

		return lista;

	}

}
L

E qual é a parte do código que traz os dados do banco?

Alexsandro_Andrade

boa tarde luiz, é dentro do JSP

<form action="comunicadoController" method="post">

			<table>
				<tr>
					<td>Titulo:</td>
					<td><input type="text" name="titulo" size="40"> <br /></td>
				</tr>
				<tr>
					<td>Comunicado:</td>
					<td><textarea name="comunicado" rows="10" cols="40"
							maxlength="500"></textarea> <br /></td>
				</tr>


			</table>
			<input type="submit" value="Salvar">
		</form>

		<%
		List<Comunicado> lista = (List<Comunicado>)request.getAttribute("lista");	
		for(Comunicado c : lista){				
			out.print(c.getTitulo()+ "<br/>");
		}
		%>


	</section>
Weverton_Reis

Boa tarde Alexsandro,

Esse trexo não esta adequado, lembre que o Servlet só vai ser instanciado quando o seu servidor for iniciado e não em cada requisição.

Pode ser isso que esta causando a não alteração da lista depois que você cadastra.

L

O select é dentro do jsp?

Weverton_Reis
Solucao aceita

Esse link pode te ajudar referente ao Servlet:

Alexsandro_Andrade

vou analisar melhor esse trecho Weverton, obrigado pela dica!

Alexsandro_Andrade

Luis_Augusto_Santos o select e feito dentro do DAO no método listarComunicados()

L

Deixa eu mudar a pergunta. Como os dados obtidos no select chegam a jsp?

Alexsandro_Andrade

Luiz, observe que o método listarComunicados() é estático e me retorna uma lista de Comunicados,
eu recebo essa lista dentro do servlet
dessa forma
List< Comunicado > lista = ComunicadoDAO.listarComunicados();

depois atribui essa lista dentro de um request assim:
req.setAttribute(“lista”, lista);

pronto, depois eu recebo esse request la no JSP.

tentei explicar da forma mais clara possivel. valeu

L

Desta forma os valores existentes dentro da lista só serão alterados no carregamento da Servlet, ou seja, quando você para o Tomcat e o sobe de novo, não?
Para que funcione “dinamicamente”, você precisa colocar a chamada ao método listarComunicados() da classe ComunicadoDAO dentro de um método da servlet (seja o doGet, por exemplo). Aí sim, cada vez que você acessar a url referente ao projeto, você vai forçar a busca na base e, consequentemente, ter os dados atualizados na jsp.

Alexsandro_Andrade

muito obrigado, Weverton_Reis e Luiz, problema resolvido! a solução era essa mesma, a lista deve ser criada dentro do método GET, abraço e bom dia a todos!

Criado 20 de março de 2017
Ultima resposta 21 de mar. de 2017
Respostas 14
Participantes 3