Tenho a seguinte Servlet que quero fazer um insert no banco atraves do JDBC.
protected void processRequest(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException{
int codigo = Integer.parseInt(request.getParameter("codigo"));
String nome = request.getParameter("nome");
double preco = Double.parseDouble(request.getParameter("preco"));
int quantidade = Integer.parseInt(request.getParameter("quantidade"));
Produto prod = new Produto(codigo,nome,preco,quantidade);
try{
ProdutoBD prodBD = new ProdutoBD();
prodBD.gravaCarro(prod);
System.out.println("Produto Gravado com Sucesso");
}catch(ErroBD e){
e.printStackTrace();
System.out.println("Catch cadastra\n"+e.getMessage());
response.sendRedirect("Erro");
}catch(SQLException e){
e.printStackTrace();
System.out.println("Catch cadastra\n"+e.getMessage());
response.sendRedirect("Erro");
}
request.setAttribute("produto", prod);
RequestDispatcher rd;
rd = request.getRequestDispatcher("/SituacaoProduto");
rd.forward(request, response);
}
}
Caso ocorra um erro na classe ProdutoBD (uma exceção do tipo SQLException) quero redirecionar para uma pagina html com uma mensagem padrão dizendo que
houve um erro.
public class ProdutoBD {
Connection conexao = null;
/**
* Método Construtor responsavel em instanciar o drive de conexao com o banco de dados
*
*/
public ProdutoBD() throws SQLException{
try{
Class.forName("com.mysql.jdbc.Driv");
}catch(Exception erro){
erro.printStackTrace();
throw new ErroBD("Erro na instanciação do Driver");
}
}
public void criaConexao() throws SQLException{
try{
//Defina o database que você usará
//Defina seu usuario e sua senha
conexao = DriverManager.getConnection(
"jdbc:mysql://localhost:3306/teste",
"root",
"");
}catch(SQLException erro){
erro.printStackTrace();
//força a geração de uma exceção
//personalizada
throw new ErroBD("Erro ao Criar a Conexão");
}
}
/**
* Método responsável em fechar a conexao com o banco de dados
*
* @throws ErroBD
*/
public void fechaConexao() throws SQLException{
if(conexao != null){
try{
conexao.close();
System.out.println("Conecção Fechada");
}catch (SQLException e){
e.printStackTrace();
throw new ErroBD("Erro ao Fechar a Conexão");
}
}
}
/**
* Método responsável em cadastrar o carro no banco de dados
*
* @param car
* @return verdadeiro caso o carro seja cadastrado com sucesso
* @throws ErroBD
*/
public boolean gravaCarro(Produto prod) throws SQLException{
boolean gravou = false;
PreparedStatement comando = null;
criaConexao();
try{
String sql = "insert into Produto (idProduto, nome, preco, quantidade) values (?,?,?,?)";
comando = conexao.prepareStatement(sql);
comando.setInt(1,prod.getCodigo());
comando.setString(2,prod.getNome());
comando.setDouble(3,prod.getPreco());
comando.setInt(4,prod.getQuantidade());
gravou = comando.executeUpdate() > 0;
comando.close();
}catch(SQLException e){
e.printStackTrace();
System.out.println("Passou pelo catch ProdutoBD");
throw new ErroBD(e.getMessage());
}
finally{
fechaConexao();
return gravou;
}
}
}
Quando ocorrem Exceções nos metodos public ProdutoBD() throws SQLException e public void criaConexao() throws SQLException
o catch da minha servlet consegue pegar, mas quando tento pegar um erro do metodo public boolean gravaCarro(Produto prod) throws SQLException{
o catch da servlet não consegue pegar e não consigo redirecionar para uma pagina de erro.
O que poderia ser ?
outro problema é quando ocorrem exceções para os métodos:
etodos public ProdutoBD() throws SQLException e
public void criaConexao() throws SQLException
a servlet não redireciona para a minha pagina html à Erro.html (response.sendRedirect(“Erro”)
e sim para uma pagina padrão do TOMCAT.
Essa é minha classe ErroBD:
public class ErroBD extends SQLException{
public ErroBD(String mensagem){
super(mensagem);
System.out.println("Passou pelo catch ErroBD");
}
}
Caso alguem possa me ensinar outra maneira de informar ao cliente no navegador que houve um erro ficarei grato.