Estou com uma dúvida quando a apostila da Caelum FJ-21 página 110. Quanto AdicionarLogic

O projeto é outro mas o princípio lógico estou seguindo o mesmo.

Estou mandando abaixo o que tenho, para que se possível me ajudem.

SgrDao.java

package br.com.fiabilite.dao;

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.fiabilite.bean.Sgr;

public class SgrDao {
private Connection cnn;

public SgrDao(Connection cnn) {
	this.cnn = cnn;
}

// insere sgr
public void InsereSgr(Sgr sgr){

	try {
		String sql = "INSERT INTO tbl_sgr " + "(sgr_localizacao)" + " values (?)";
		
		PreparedStatement ps = cnn.prepareStatement(sql);
		
		ps.setString(1, sgr.getSgr_localizacao());

		ps.execute();
		
	} catch (Exception e) {
		// mensagem de erro para o usuário
		throw new RuntimeException(e);
	}
}

// cria um array
public List<Sgr> getLista() throws SQLException {
	try {
		List<Sgr> sgrs = new ArrayList<>();
		
		PreparedStatement ps = this.cnn.prepareStatement("SELECT * FROM tbl_sgr");
		
		ResultSet rs = ps.executeQuery();

		while (rs.next()) {
			
			// criando o obj sgr
			Sgr sgr = new Sgr();
			
			sgr.setSgr_id(rs.getLong("sgr_id"));
			sgr.setSgr_localizacao(rs.getString("sgr_localizacao"));

			// adicionando o objeto à lista
			sgrs.add(sgr);
		}

		rs.close();
		ps.close();
		
		return sgrs;
		
	} catch (SQLException e) {
		throw new RuntimeException(e);
	}
}

// alterar registro
public void altera(Sgr sgr) {
	String sql = "UPDATE tbl_sgr set sgr_localizacao=? WHERE sgr_id=?";
	try {
		PreparedStatement ps = cnn.prepareStatement(sql);
		ps.setString(1, sgr.getSgr_localizacao());
		ps.setLong(2, sgr.getSgr_id());
		
		ps.execute();
		ps.close();
		
	} catch (SQLException e) {
		throw new RuntimeException(e);
	}
}

// remove registro
public void remove(Sgr sgr) {
	try {
		PreparedStatement ps = cnn.prepareStatement("DELETE FROM contatos WHERE id=?");
		
		ps.setLong(1, sgr.getSgr_id());
		
		ps.execute();
		ps.close();
	} catch (SQLException e) {
		throw new RuntimeException(e);
	}
}

}

AdicionaSgrLogic.java

package br.com.fiabilite.logica;

import java.sql.Connection;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import br.com.fiabilite.bean.Sgr;
import br.com.fiabilite.dao.SgrDao;

public class AdicionaSgrLogic implements Logica {
public String executa(HttpServletRequest req, HttpServletResponse res) throws Exception{

	Connection cnn = (Connection) req.getAttribute("cnn");
	
	//buscando os parâmetros no request
	String local = req.getParameter("sgr_localizacao");
	
	// monta um objeto Sgr
    Sgr sgr = new Sgr();
    sgr.setSgr_localizacao(local);
    
    // salva a Sgr
    SgrDao dao = new SgrDao(cnn);
    dao.InsereSgr(sgr);

    return "mvc?logica=ListaContatosLogic";
}

}

ERRO
HTTP Status 500 – Internal Server Error
Type Exception Report

Message A lógica de negócios causou uma exceção

Description The server encountered an unexpected condition that prevented it from fulfilling the request.

Exception

javax.servlet.ServletException: A lógica de negócios causou uma exceção
br.com.fiabilite.servlet.ControllerServlet.service(ControllerServlet.java:31)
javax.servlet.http.HttpServlet.service(HttpServlet.java:742)
org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52)
Root Cause

java.lang.RuntimeException: java.lang.NullPointerException
br.com.fiabilite.dao.SgrDao.InsereSgr(SgrDao.java:33)
br.com.fiabilite.logica.AdicionaSgrLogic.executa(AdicionaSgrLogic.java:25)
br.com.fiabilite.servlet.ControllerServlet.service(ControllerServlet.java:26)
javax.servlet.http.HttpServlet.service(HttpServlet.java:742)
org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52)
Root Cause

java.lang.NullPointerException
br.com.fiabilite.dao.SgrDao.InsereSgr(SgrDao.java:25)
br.com.fiabilite.logica.AdicionaSgrLogic.executa(AdicionaSgrLogic.java:25)
br.com.fiabilite.servlet.ControllerServlet.service(ControllerServlet.java:26)
javax.servlet.http.HttpServlet.service(HttpServlet.java:742)
org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52)
Note The full stack trace of the root cause is available in the server logs.

Apache Tomcat/8.5.24

Cara, olhando o erro, ele esta dando nullpointer nessa linha :
PreparedStatement ps = cnn.prepareStatement(sql);
Provavelmente o erro estaja na cnn, pelo que entendi do seu codigo, vc tenta recuperar a cnn(Connection) da request e passa ela para o DAO, provavelmente ela esta vindo nula, e vc esta passando este objeto nulo para o DAO.
Tem certeza que é assim que ele pega a conexão na apostila? nunca vi um caso que vc pega a conexão pela requisição

Amigo sim está exatamente assim o PS na apostila.
Ele pega a conexão exatamente assim.

O problema não é na forma como esta usando o PS, e sim antes, na sua classe AdicionaSgrLogic
To procurando aqui na apostila, não encontrei nd nessa pagina não rsrs, consegue mostrar um print?
pq tipo não tem muito sentido, pq vc não tem como criar a conexão na request(ate tem, mas seria gambi kkkkk)
Tenta isso:
1 - criar uma classe que seria sua fabrica de conexões

public class ConnectionFactory	{
				public	Connection	getConnection() {
								try	{
												return	DriverManager.getConnection(
																				"jdbc:mysql://localhost/nomeDatabase",	"root",	"senha");
								}	catch	(SQLException	e)	{
												throw new	RuntimeException(e);
								}
				}
}

2 - troca essa linha :Connection cnn = (Connection) req.getAttribute(“cnn”); por esta:

Connection cnn = new ConnectionFactory().getConnection();

Bom dia willvideira…agora deu um erro quanto ao drive…estranho, pois já vinha manipulando esse banco de dados de outra forma…veja:

AdicionaSgrLogic.java

package br.com.fiabilite.logica;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import br.com.fiabilite.bean.Sgr;
import br.com.fiabilite.dao.SgrDao;

public class AdicionaSgrLogic implements Logica {
public String executa(HttpServletRequest req, HttpServletResponse res) throws Exception {

	class ConnectionFactory {
		public Connection getConnection() {
			try {
				return DriverManager.getConnection("jdbc:mysql://localhost/db_psa", "root", "12345Db");
			} catch (SQLException e) {
				throw new RuntimeException(e);
			}
		}
	}
	
	Connection cnn = new ConnectionFactory().getConnection();

	// buscando os parâmetros no request
	String local = req.getParameter("sgr_localizacao");

	// monta um objeto Sgr
	Sgr sgr = new Sgr();
	sgr.setSgr_localizacao(local);

	// salva a Sgr
	SgrDao dao = new SgrDao(cnn);
	dao.InsereSgr(sgr);

	return "mvc?logica=ListaContatosLogic";
}

}

ERRO

HTTP Status 500 – Internal Server Error
Type Exception Report

Message A lógica de negócios causou uma exceção

Description The server encountered an unexpected condition that prevented it from fulfilling the request.

Exception

javax.servlet.ServletException: A lógica de negócios causou uma exceção
br.com.fiabilite.servlet.ControllerServlet.service(ControllerServlet.java:31)
javax.servlet.http.HttpServlet.service(HttpServlet.java:742)
org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52)
Root Cause

java.lang.RuntimeException: java.sql.SQLException: No suitable driver found for jdbc:mysql://localhost/db_psa
br.com.fiabilite.logica.AdicionaSgrLogic$1ConnectionFactory.getConnection(AdicionaSgrLogic.java:21)
br.com.fiabilite.logica.AdicionaSgrLogic.executa(AdicionaSgrLogic.java:26)
br.com.fiabilite.servlet.ControllerServlet.service(ControllerServlet.java:26)
javax.servlet.http.HttpServlet.service(HttpServlet.java:742)
org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52)
Root Cause

java.sql.SQLException: No suitable driver found for jdbc:mysql://localhost/db_psa
java.sql/java.sql.DriverManager.getConnection(DriverManager.java:703)
java.sql/java.sql.DriverManager.getConnection(DriverManager.java:229)
br.com.fiabilite.logica.AdicionaSgrLogic$1ConnectionFactory.getConnection(AdicionaSgrLogic.java:19)
br.com.fiabilite.logica.AdicionaSgrLogic.executa(AdicionaSgrLogic.java:26)
br.com.fiabilite.servlet.ControllerServlet.service(ControllerServlet.java:26)
javax.servlet.http.HttpServlet.service(HttpServlet.java:742)
org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52)
Note The full stack trace of the root cause is available in the server logs.

Apache Tomcat/8.5.24

Opa…
cara, antes de mais nada, não é uma boa pratica vc criar a classe de conexão, dentro da classe que vc vai utilizar ela… tenta separar isso.
Esse erro geralmente ocorre pq ele não achou o driver no banco no classpath do projeto, chegou a olhar isso?
Uma sugestão que eu te dou, é ler novamente o topico de JDBC dessa apostila.

Obrigado meu nobre pela ajuda vou rever as boas práticas…sou novo no java e estou aprendendo essas práticas legais…quanto a parte do JDBC vou sim rever…muito obg por sua ajuda.