[RESOLVIDO]Problema ao Gravar formulário

11 respostas
williamdasflores

Boa Noite galera!

Estou estudando JSP & Servlets, desenvolvi um programinha básico(CRUD), porém ele roda normal só que quando eu envio e da o erro" java.lang.NullPointerException".
Eu não estou conseguindo achar onde eu errei, vou postar aqui a view e o servlet(controller)

<title>Meu Primeiro MVC</title>
</head>
<body>
<form action = "PessoaServlet?cmd=add" method = "post">
<input type = "hidden" name = "cmd" value = "incluir">
	<table>
		<tr>
			<td> Nome </td><td><input type = "text" name = "nome" /></td>
		</tr>
		<tr>
			<td> Sobrenome </td><td><input type = "text" name = "sobrenome" /></td>
		</tr>
		<tr>
			<td> Idade </td><td><input type = "text" name = "idade" /></td>
		</tr>
		<tr>
			<td> CPF </td><td><input type = "text" name = "cpf" /></td>
		</tr>
		<tr>
			<td colspan="2">
			<input type = "submit" name = "Cadastrar" value = "Enviar" />
			</td>
		</tr>
	</table>
</form>

</body>
</html>
public class PessoaServlet extends HttpServlet {
	private static final long serialVersionUID = 1L;
    public PessoaServlet() {
        super();
    }

	protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException 
	{
		String cmd = request.getParameter("cmd");
		
		if(cmd == null)
		{
			cmd = "principal";
		}
		
		
		InterfaceDAO dao;
		Pessoa pessoa = new Pessoa();
		if(cmd != null || !cmd.equalsIgnoreCase("principal"))
		{
			pessoa.setNome(request.getParameter("nome"));
			pessoa.setSobreNome(request.getParameter("sobrenome"));
			pessoa.setIdade(request.getParameter("idade"));
			pessoa.setCpf(request.getParameter("cpf"));
			try {
				dao = new PessoaDAO();
				if(cmd.equalsIgnoreCase("add"))
					dao.salvar(pessoa);
			} catch (Exception e) {
				e.printStackTrace();
			}
			RequestDispatcher rd = request.getRequestDispatcher("/cadastro.jsp");
			rd.forward(request, response);
		}
		
		
	}

}

11 Respostas

cido18

Olá williamdasflores.

Cara tenho algumas perguntas sobre seu código:

A primeira seria em relação a classe PessoaServlet na linha 17, você criou uma variavel InterfaceDAO dao só que não adicionou nenhum valor(se não estiver falando nenhum besteira, sempre que for dentro de um método eh obrigatório colocar null no caso da sua variável), e dps instanciou com um PessoaDAO, por que você fez isso?

A segunda se não me engano na linha 27 o a condição if nunca será verdadeira, pois, nunca vai ser “add”, o correto no seria vc colocar if(!cmd.equalsIgnoreCase(“add”))?

e por afim acho que vc já fez, mas por via das dúvidas, vc declaro no web.xml o servlet-mapping?

espero ter ajudado
abrs.

nandooliveira

@cido18,

Não é obrigatório colocar a variável como NULL nem inializá-la ali… InterfaceDAO como o nome sugere, deve ser uma interface que é implementada pela classe PessoaDAO, por isso ele instanciou como pessoa DAO (Uso do polimorfismo)…

Quanto ao if… tá certo… ele só não vai entrar no if se cmd for nulo ou = principal

De resto sempre entrará…

@williamdasflores,

Tem certeza que a exceção está ocorrendo nesse código (arquivo)?? não vi nada errado e testei aqui também funcionou blz.

Veja se você mapeou a Servlet certinho no web.xml e se o problema não está no método salvar de PessoaDAO…

Outra coisa que vi é que tu tá passando uma String para o método setIdade()… Idade realmente é uma String??

cido18

nandooliveira vlw por explicar ^^ , prometo que vou dar uma lida melhor em polimorfismo.

williamdasflores
Então pessoa, debuggei aqui achei o problema, mas não estou conseguindo resolver o problema. Quando o Servlet cria um objeto(utlizando o construtor) da classe DAO, da pau
public PessoaDAO() throws Exception{
		try{
			this.conn = ConnectionFactory.getConnection();
		}catch(Exception e){
			throw new Exception("Erro no construtor da classe DAO " +e.getMessage());
		}
Vou colocar a classe que faz conexão com o banco
public class ConnectionFactory {
	
	public static Connection getConnection() throws Exception
	{
		try{
			Class.forName("com.mysql.jdbc.Driver");
			return DriverManager.getConnection("jdbc:mysql://localhost/cadastropessoas", "william", "123");
		}catch(ClassNotFoundException e){
			throw new Exception("Erro no Driver "+e.getMessage());
		}catch(Exception e){
			throw new Exception(e.getMessage());
		}
	}
	
	public static void close(Connection conn, PreparedStatement ps, ResultSet rs) throws Exception
	{
		try{
			if(conn != null)
				conn.close();
			if(ps != null)
				ps.close();
			if(rs != null)
				rs.close();
		}catch(Exception e){
			throw new Exception("Erro no método close "+e.getMessage());
		}
			
	}
	
	public static void closeConnection(Connection conn) throws Exception
	{
		close(conn, null, null);
	}
	
	public static void closeConnection(Connection conn, PreparedStatement ps) throws Exception
	{
		close(conn, ps, null);
	}
	
	public static void closeConnection(Connection conn, PreparedStatement ps, ResultSet rs) throws Exception
	{
		close(conn, ps, rs);
	}

}

Aparentemente ta tudo ok..mas ta dando erro.
Mudei o banco para Access e funcionou normalmente, mas quando mudo para mysql da problema.
Pensei que era o driver, então baixei o driver do site do Mysql e coloquei, mas não resolveu.
Alguem ai me da help..to rachando a cabeça aqui..rsrsrsrsrs

F

Já viu se o banco de dados existe?

williamdasflores

F

quem é Drivermanager?

não vi a declaração

williamdasflores

DriverManager e a classe que recebe a url do banco de dados para poder fazer a conexão.
Não entendi muito bem sua pergunta

F

nada só imaginei q estava faltando inicializar a classe Drivermanager

williamdasflores

Consegui resolver aqui. Coloquei o driver do mysql na pasta lib dentro da pasta do apache

F

Boa garoto

legal :smiley:

não imaginava q fosse issso… mas é sempre bom verificar… se tivesse o console do erro seria melhor ainda.

Criado 11 de julho de 2011
Ultima resposta 14 de jul. de 2011
Respostas 11
Participantes 4