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.
Problema com tomcat/JSP/HTML
14 Respostas
Boa tarde Alexsandro,
Publique como você busca essas informações para serem apresentadas na JSP.
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!");
}
}
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;
}
}
E qual é a parte do código que traz os dados do banco?
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>
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.
O select é dentro do jsp?
Esse link pode te ajudar referente ao Servlet:
vou analisar melhor esse trecho Weverton, obrigado pela dica!
Luis_Augusto_Santos o select e feito dentro do DAO no método listarComunicados()
Deixa eu mudar a pergunta. Como os dados obtidos no select chegam a jsp?
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
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.
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!