Servlet e mySQL

14 respostas
brunatassia

Bom dia pessoal!

Tô tentando fazer um programa simplérrimo que envia código e o nome para um banco de dados no mysql, o problema é que não tá funcionando quando eu clico em enviar. O que será que está errado?? Já testei a conexão com o mySQL e está funcionando. Acredito que tenha algum erro no código. Alguém pode ajudar?

Alunos.jsp

<html>
    <head>
        Alunos
    </head>
    <body>
        <form action ="AlunosServlet" method ="doGet">
            <p>
            Codigo: <input type="text" name ="codigo">
            Nome: <input type="text" name ="nome">
                <input type="submit" value ="Enviar">
                <input type="reset" value ="Limpar">
             </p>
          </form>
    </body>
</html>
package br.cefet.bruna;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
import java.io.IOException;
import java.io.PrintWriter;
import java.util.*;
import java.sql.*;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

public class AlunosServlet extends HttpServlet {

    
    protected void processRequest(HttpServletRequest request, HttpServletResponse response)
    throws ServletException, IOException {
        response.setContentType("text/html;charset=UTF-8");
        PrintWriter out = response.getWriter();
        
        try {
           
        } finally { 
            out.close();
        }
    } 

       
    protected void doGet(HttpServletRequest request, HttpServletResponse response)
    throws ServletException, IOException {
       
        response.setContentType("text/html");
        PrintWriter out = response.getWriter();
        String url = "jdbc:mysql://localhost:3306/test";
        String usuario = "root";
        String senha = "neydja";
        Connection con;
        Statement stmt;
        String query = "select * from alunos";
      
        try{
            Class.forName("com.mysql.jdbc.Driver").newInstance();
            }
        catch(Exception e){
           out.println("<p>ClassNotFoundException: ");
           out.println("<p>" + e.getMessage());
            }
        try{
            con= DriverManager.getConnection(url, usuario, senha);
            stmt=con.createStatement();
            String cod = request.getParameter("codigo");
            String nome = request.getParameter("nome");
            stmt.executeUpdate("INSERT INTO alunos (codigo, nome) VALUES('"+cod+"', '"+nome+"')");

            ResultSet rs = stmt.executeQuery(query);
            out.println("<p>Códigos e Alunos Cadastrados");
                while(rs.next())
                {
                String s = rs.getString("nome");
                int n = rs.getInt("codigo");
                out.println("<p>"+s+ " "+n);
                }
            stmt.close();
            con.close();
            }
        catch(SQLException ex){
        out.println("<html>");
        out.println("<title>Obrigado!</title>");
        out.println("Obrigado por participar");
        out.println("<html>");
        out.close();
        }
    } 

   
    protected void doPost(HttpServletRequest request, HttpServletResponse response)
    throws ServletException, IOException {
        processRequest(request, response);
    }

   
    public String getServletInfo() {
        return "Short description";
    }

}

14 Respostas

soro

Separe a classe de negocio do seu servlet.
Para que o mysql funcione no java WEB é preciso que o jconnector esteja em WEB-INF/lib :slight_smile:

Deixe seu servlet cuidando do formulário e se preciso você faz a instancia da classe DAO para inserir.

Vamos criar uma classe que cria conexão para o nosso banco:

public class ConnectionFactory {
    public static Connection getConnection() throws SQLException {
        try {
            Class.forName("com.mysql.jdbc.Driver");
            return DriverManager.getConnection("jdbc:mysql://localhost/teste","root","");
        } catch (ClassNotFoundException e) {
            throw new SQLException(e.getMessage());
        }
    }
}

Você pode modificar o usuário, colocar atributos que definirão o usuário e a senha, lógico.

Agora vamos criar o DAO referente ao Aluno para adicionar o que você precisa ao banco:

public class AlunoDao {
  private Connection connection;
  public AlunoDAO() throws SQLException {
      this.connection = ConnectionFactory.getConnection();
  }
  public void adiciona(Aluno aluno) throws SQLException {
      // prepared statement para inserção
        String sql = "insert into alunos (nome, codigo) values (?,?)";
        PreparedStatement stmt = connection.prepareStatement(sql);
      // seta os valores
      stmt.setString(1,aluno.getNome());
      stmt.setString(2,aluno.getCodigo());
      // executa
      stmt.execute();
      stmt.close();
  }
}

E lógico, você deve ter uma classe aluno que vai ter o codigo e o nome e se privados seus métodos de acesso.

Então quando você pegar do formulário você seta os valores para o Aluno:

Aluno aluno = new Aluno();
aluno.setCodigo(request.getParameter("codigo"));
aluno.setNome(request.getParameter("nome"));

Estou levando em consideração que os atributos de aluno são todos strings e por isso não estou convertendo nada.

Depois é só adicionar o aluno:

AlunoDao alunoDao = new AlunoDao();
alunoDao.adiciona(aluno);

Se for preciso tratar os erros, trate-os.
Creio que desta forma, deixando separado, você vai conseguir ter o código mais legível e simples de manutenção. :slight_smile:

Fica a dica.

maiconramones

Opa,

Bruna não cheguei a olhar o código da sua servlet, mas no seu jsp está assim:

<form action ="AlunosServlet" method ="doGet">

Só que ali no method você não coloca o método que você vai chamar, e sim a forma que e o seu formulário trabalha: ou é get ou post. Imagino que você quer trabalhar com get, se for isso mesmo apenas coloque: method =“get”.

Quando clicar em submit o seu formulário “automagicamente” vai chamar o doGet que é método que recebe as requisições que chegam no modo get.

Espero ter ajudado

soro

É verade.

Além disso na ação creio que deve ser passado o nome do projeto/servlet-mapeada

Mas afinal, qual é o erro? 404 - File Not Found? Ou simplesmente ele diz que adiciona, mas não tem nada no banco? Ou retorna algum erro como Class.forName = null?

Verifica em relação ao action, acho que deve ser incluso o /nomeDoProjeto/servlet-mapeado.

<form action ="/nomeDoProjeto/AlunosServlet" method ="get">
brunatassia

Gente, esse é o erro…

HTTP Status 404 - /SORedes_Serra/AlunosServlet

type Status report

message /SORedes_Serra/AlunosServlet

description The requested resource (/SORedes_Serra/AlunosServlet) is not available.

Apache Tomcat/6.0.18

Não coloquei o nome do projeto pq está tudo no mesmo projeto…Precisa colocar?

maiconramones

Coloca ai o teu web.xml pra gente ver como está mapeando a url pro teu servlet.

geralmente é o contextoDaAplicação/teuServlet.

brunatassia

<?xml version="1.0" encoding="UTF-8"?> <web-app version="2.5" xmlns="http://java.sun.com/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"> <servlet> <servlet-name>HelloYou</servlet-name> <servlet-class>br.cefet.bruna.HelloYou</servlet-class> </servlet> <servlet> <servlet-name>AlunoServlet</servlet-name> <servlet-class>br.cefet.bruna.AlunosServlet</servlet-class> </servlet> <servlet-mapping> <servlet-name>HelloYou</servlet-name> <url-pattern>/HelloYou</url-pattern> </servlet-mapping> <servlet-mapping> <servlet-name>AlunoServlet</servlet-name> <url-pattern>/AlunoServlet</url-pattern> </servlet-mapping> <session-config> <session-timeout> 30 </session-timeout> </session-config> <welcome-file-list> <welcome-file>index.jsp</welcome-file> </welcome-file-list> </web-app>

maiconramones

hahahaha

Tu mapeou /AlunoServlet e no teu form tu ta tentando acessar: /AlunosServlet.
Repara no “s” a mais de alunos que tu colocou.

Erro: HTTP Status 404 - /SORedes_Serra/AlunosServlet

web.xml: /AlunoServlet

brunatassia

e o que eu faço então?

maiconramones

Para que o teu servlet receba a requisição. Tu tem que colocar no form o mesmo que tu mapeou no xml.

Ficaria assim: /SORedes_Serra/AlunoServlet

brunatassia

O problema é que o certo é AlunosServlet e não AlunoServlet…

maiconramones

Então mapeia no teu web.xml para que atenda a requisição na url AlunosServlet, ficaria assim:

<servlet-mapping>  
         <servlet-name>AlunoServlet</servlet-name>  
         <url-pattern>/AlunosServlet</url-pattern>  
     </servlet-mapping>

Uma coisa é certa: o que tu colocar no url-pattern tem que ser o mesmo que tu vai colocar no form senão não vai funcionar

brunatassia

Ops.Coloquei o S e deu certo…hehehe…

Obrigada!!!

brunatassia

Gente, eu sei que eu pergunto muito mas é o jeito…rs

Como é que posso verificar se realmente os dados que eu coloquei foram inseridos no banco de dados?
Eu estou usando o netbeans…

soro

Acessa o banco e: select * from tabela;

Criado 8 de julho de 2009
Ultima resposta 8 de jul. de 2009
Respostas 14
Participantes 3