Método de pesquisa em java pegando um parâmetro de um input e pesquisando no banco

Pessoal estou com uma dúvida, já fiz dezenas de pesquisas e não encontrei o que realmente quero… Preciso fazer um método de pesquisa no banco onde vou pesquisar em uma tabela especialidade, porém o usuário que vai escolher a especialidade que ele deseja por meio de um input e quando ele clicar em buscar, tem que trazer do banco de dados todas as especialidades com o nome da especialidade encontrada, porém só tem que aparecer na tela quando ele clicar em buscar. PROBLEMA: já fiz um ArrayList que só busca a especialidade quando coloco no comando SQL a especialidade que desejo, quando coloco a tag ? ele simplesmente não traz nada, já fiz um método de pesquisa e usei uma servlet, porém não entendo como posso pegar o resultado do input para poder fazer a pesquisa.

SEGUE O MÉTODO DE PESQUISA QUE FIZ.

Método na DAO:

public Cad_Agenda_Bean Pesquisar_Especialidade (String especialidade)throws Exception {

    try{
    
        Cad_Agenda_Bean ms = new Cad_Agenda_Bean();
        
        AbrirConexao();
        String query = "SELECT * FROM tbl_agenda WHERE especialidade = ?";
        pst = (PreparedStatement) con.prepareStatement(query);
        pst.setString(1, ms.getEspecialidade());
        
        
        ResultSet rs = pst.executeQuery();
        
        if(rs.next()){
        
            ms.setId_agenda(rs.getInt("id_agenda"));
            ms.setEspecialidade(rs.getString("especialidade"));
            ms.setData(rs.getString("data"));
            ms.setHora(rs.getString("hora"));
            ms.setNome_dentista(rs.getString("nome_dentista"));
            return ms;
            
        }
        FecharConexao();
        
    }catch(Exception e){
        
        System.out.println("erro..."+e.getMessage());
        
    }
    
    return null;
}

SERVLET:

public class Serv_Pesquisar_Especialidade extends HttpServlet {

   protected void processRequest(HttpServletRequest request, HttpServletResponse response)
        throws ServletException, IOException {
    response.setContentType("text/html;charset=UTF-8");
    try (PrintWriter out = response.getWriter()) {
     
        Cad_Agenda_Bean agenda_bean = new Cad_Agenda_Bean();
        Cad_Agenda_DAO agenda_dao = new Cad_Agenda_DAO();
        
        String especialidade = request.getParameter("consulta_por_especialidade");
        
        try{
         agenda_bean = agenda_dao.Pesquisar_Especialidade(especialidade);
        }catch(Exception e){
             e.getStackTrace();
        }
        
        String msg ="";
        
        if(agenda_bean == null){
        
            msg = "Registro de especialidade não encontrada!";
            
            request.setAttribute("resp_msg", msg);
            RequestDispatcher rd = request.getRequestDispatcher("Resposta.jsp");
            rd.forward(request, response);
        }else {
        
            request.setAttribute("resp_id_agenda", agenda_bean.getId_agenda());
            request.setAttribute("resp_especialidade", agenda_bean.getEspecialidade());
            request.setAttribute("resp_data", agenda_bean.getData());
            request.setAttribute("resp_horario", agenda_bean.getHora());
            request.setAttribute("resp_nome_dentista", agenda_bean.getNome_dentista());
            
            RequestDispatcher rd = request.getRequestDispatcher ("index.jsp");
            rd.forward(request, response);
        
        }
        
    }
}

Vamos lá
Métodos em java começam com letra minuscula né ? Pelo menos segue a convenção, e particularmente não gosto desse tanto de _.
Seu é metodo Pesquisar_Especialidade, recebe uma String e não usa a mesma, porque ?
vc instancia um objeto Cad_Agenda_Bean , e depois usa o get do mesmo no preparedStatement, ms.getEspecialidade(), porque ?
Fechar a conexao dentro do try ? e se ele der exception ? fica aberta ?

1 curtida

Bom vou começar dizendo que estou começando a programar agora então tem certas regras ainda que as vezes não e não percebo, por falta de experiência, no caso coloquei como recebe uma string por que o atributo que quero que ele recebe e que vai vir do input é do tipo String, então por isso coloquei, realmente não sei se está correto desta forma, com relação ao get coloquei por que eu vi em um exemplo que estava assim, por isso achei que teria que colocar, normalmente não coloco quando é o método é do tipo ArrayList. Quanto a questão de fechar a conexão só prestei atenção agora que tinha colocado no lugar errado, mas sempre coloco fora.

Enfim, será que você tem alguma dica de como posso fazer esse método então? consigo fazer a busca por todos os registros da tabela, mas por um registro especifico escolhido pelo usuário não. até por que na verdade consigo listar os registros, mas fazer uma pesquisa não.

E outra dúvida, para o usuário poder fazer essa pesquisa por meio de um input, tem que ter um método que tenha um ArrayList ou não?

Depende se sua pesquisa retornar mais um registro, faz sentido ter uma lista certo ?
Caso contrário, não

É verdade, neste caso tenho que usar um Array, pois vou fazer uma pesquisar por um campo especifico da tabela, contudo vou retornar vários registros na tela, porém isso que não estou entendendo, quando faço um método do tipo ArrayList o comando SQL que seria: SELECT * FROM especialidade WHERE especialidade = ?; pra ser enviado para o banco através do PreparedStatement, ele não retorna os registros, porém se eu colocar dessa forma o SQL: SELECT * FROM especialidade WHERE especialidade = ‘Clareamento’; ele pega e retorna os dados, mas para meu sistema não funciona, por que eu preciso que o usuário escolha uma especialidade por meio de um input, mas nunca vi um exemplo de pesquisa deste tipo, por isso minha duvida.

Olá @Dreeh, no bloco abaixo vc não está percorrendo o seu resultSet. No primeiro registro que vem do seu select vc preenche sua classe e já vaza. Então modifica p/ um while ou for como você achar melhor.

E depois vamos mudar este retorno de Cad_Agenda_Bean p/ um List<Cad_Agenda_Bean>, por que ? Por que tú queres exibir vários registros e não apenas 1 certo?

Ficaria assim sua interação com resultSet:

List<Cad_Agenda_Bean> listCadAgendaBean = new ArrayList<Cad_Agenda_Bean>();
        while(rs.next()) {
            Cad_Agenda_Bean ms = new Cad_Agenda_Bean();
            
            ms.setId_agenda(rs.getInt("id_agenda"));
            ms.setEspecialidade(rs.getString("especialidade"));
            ms.setData(rs.getString("data"));
            ms.setHora(rs.getString("hora"));
            ms.setNome_dentista(rs.getString("nome_dentista"));
            
            listCadAgendaBean.add(ms);
        }
        return listCadAgendaBean;

Depois de modificar sua DAO tem que modificar na sua servlet

List<Cad_Agenda_Bean> listCadAgenda = agenda_dao.Pesquisar_Especialidade(especialidade);

// Pula os demais códigos
else{
request.setAttribute("listCadAgenda", listCadAgenda 
);

///
Depois é só interar esta lista na sua JSP com um foreach ou um componente que voce já tem ai que intera lista, sei lá .

Espero que ajude.

Primeiramente muito obrigado @RaulCrash, me ajudou muito mesmo, na parte da DAO eu já tinha resolvido, fiz de outra forma e retornou apenas um registro, aí finalmente entendi que realmente precisava de um List, ai vc me ajudou muito na questão da servlet que era o que realmente estava me gerando mais dúvidas, vc conseguiu sanar minhas dúvidas quanto a servlet, mas não está listando na jsp, e sinceramente não sei o pq, afinal estou fazendo tudo correto na questão de listar.

Método Ficou assim:

public List<Cad_Agenda_Bean> Pesquisar_Especialidade (String especialidade)throws Exception {

    List<Cad_Agenda_Bean> Lista_Espec = new ArrayList();
    
    try{
        AbrirConexao();
        String query = "SELECT * FROM tbl_agenda WHERE especialidade = ?";
        pst = (PreparedStatement) con.prepareStatement(query);
        pst.setString(1,especialidade);
        ResultSet rs = pst.executeQuery();

        while(rs.next()){
            
            Cad_Agenda_Bean ms = new Cad_Agenda_Bean();
            
            ms.setId_agenda(rs.getInt("id_agenda"));
            ms.setEspecialidade(rs.getString("especialidade"));
            ms.setData(rs.getString("data"));
            ms.setHora(rs.getString("hora"));
            ms.setNome_dentista(rs.getString("nome_dentista"));
            Lista_Espec.add(ms);  
        }
        
    }catch(Exception e){    
        System.out.println("erro..."+e.getMessage());
    }
    FecharConexao();
    
  return Lista_Espec;
}

Na página JSP fiz um for dessa maneira:

<%

    String id_agenda="";
    String especialidade ="";
    String data ="";
    String horario ="";
    String nome_dentista="";
    
    Cad_Agenda_Bean agenda_bean = new Cad_Agenda_Bean();
    Cad_Agenda_DAO agenda_dao = new Cad_Agenda_DAO();
    
    List<Cad_Agenda_Bean> lista_especialidade = agenda_dao.Pesquisar_Especialidade(especialidade);
    
    for (int i = 0; i < lista_especialidade.size(); i++){
    
        agenda_bean = lista_especialidade.get(i);
        
        id_agenda = String.valueOf(agenda_bean.getId_agenda());
        especialidade = String.valueOf(agenda_bean.getEspecialidade());
        data = String.valueOf(agenda_bean.getData());
        horario = String.valueOf(agenda_bean.getHora());
        nome_dentista = String.valueOf(agenda_bean.getNome_dentista());

%>

Porém a página retorna em branco, acredito que desta forma está correto, mas acredito que estou errando em algo, ou na servlet ou na jsp, lembrando que dentro do for e fora da tag java eu coloquei uma tabela para ser preenchido os dados da variáveis locais.

A SERVLET ficou assim:

Cad_Agenda_Bean agenda_bean = new Cad_Agenda_Bean();
Cad_Agenda_DAO agenda_dao = new Cad_Agenda_DAO();

        String especialidade = request.getParameter("consulta_por_especialidade");

        List<Cad_Agenda_Bean> listaCadAgenda = agenda_dao.Pesquisar_Especialidade(especialidade);
        
        if (listaCadAgenda != null){
        
            request.setAttribute("resp_lista",listaCadAgenda );
            RequestDispatcher rd = request.getRequestDispatcher ("Agendamentos.jsp");
            rd.forward(request, response);

        }else{
        
        response.sendRedirect("Resposta.jsp");
        }

Na servlet fiz alguns testes e ele consegue verificar que a lista não está retornando null, mas quando vai para a tela ele não retorna nada.

@Dreeh veja bem, nós usamos a Servlet p/ “pedir” ao DAO nossa lista de Agenda, correto?
Então não se torna redundante nós fazermos novamente a mesma coisa que a servlet fez na JSP com Scriptlets ?
Não usa isto, é feio e não vejo nenhuma situação com as tecnologias que temos hoje p/ vc usar isto.
Pois bem, sua servlet já te deu sua lista pronta é só “destrinchar” sua lista de agenda. Eu não tenho um projeto em JSP e Servlet aqui no momento, vou escrever um código nas cegas tenta ai e veja se funciona. Eu acredito que irá funcionar, espero rsrs:

<c:forEach items="${listCadAgenda}" var="cadAgendaVariavelSendoInterada">  
  ${cadAgendaVariavelSendoInterada.id_agenda}, ${cadAgendaVariavelSendoInterada.data},${cadAgendaVariavelSendoInterada.nome_dentista} 
 <br />  
</c:forEach> 

Apaga aquele scriptlet e só usa o forEach.