带有 JDBC 的 JSF 项目,我无法在 Servlet 上调用 DAO [重复]

Posted

技术标签:

【中文标题】带有 JDBC 的 JSF 项目,我无法在 Servlet 上调用 DAO [重复]【英文标题】:JSF project with JDBC, I can't call DAO on Servlet [duplicate] 【发布时间】:2020-07-27 10:02:50 【问题描述】:

我在 JSF + JDBC 项目中遇到问题,更具体地说,在我的 servlet 中,我无法调用 DAO 方法,它给了我以下错误

Error connecting: org.gjt.mm.mysql.Driver
abr 14, 2020 12:29:11 PM org.apache.catalina.core.StandardWrapperValve invoke
GRAVE: Servlet.service() for servlet [br.com.cuponsdesconto.controllers.CadastrarUsuario] in context with path [/WebCupom] threw exception

一个有趣的事实是,如果我创建一个测试类并调用我的 DAO 方法,它可以正常工作,见下文

package br.com.cuponsdesconto.controllers;

import br.com.cuponsdesconto.dao.UsuarioDao;
import br.com.cuponsdesconto.entidades.Usuario;

public class TestaInsercaoDeRegistro 
    public static void main(String[] args) 
        Usuario u = new Usuario();
        u.setCpf("123");
        u.setEmail("teste");
        u.setNome("Arthur");
        u.setSenha("123");

        new UsuarioDao().adicionar(u);
    


也就是说,问题不在于数据库连接,但为什么我不能在 Servlet 中使用我的 DAO?

我会告诉你我的文件是怎样的

我的 Servlet:

package br.com.cuponsdesconto.controllers;

import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import br.com.cuponsdesconto.dao.UsuarioDao;
import br.com.cuponsdesconto.entidades.Usuario;

@WebServlet("/CadastrarUsuario")
public class CadastrarUsuario extends HttpServlet 
    private static final long serialVersionUID = 1L;

    public CadastrarUsuario() 
        super();
    

    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException 
        System.out.println("I'm here!");

        String nome = request.getParameter("nome");
        String cpf = request.getParameter("cpf");
        String email = request.getParameter("email");
        String senha = request.getParameter("senha");

        Usuario usuario = new Usuario();
        usuario.setNome(nome);
        usuario.setCpf(cpf);
        usuario.setEmail(email);
        usuario.setSenha(senha);

        UsuarioDao dao = new UsuarioDao();
        dao.adicionar(usuario);

        response.getWriter().append("Usuario cadastrado").append(request.getContextPath());
    

    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException 
        doGet(request, response);
    



(那个 sout 出现在控制台上,所以这是一个好兆头)

现在让我们看看我的 web.xml

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://xmlns.jcp.org/xml/ns/javaee" xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd" id="WebApp_ID" version="4.0">
  <session-config>
    <session-timeout>
        30
    </session-timeout>
  </session-config>
  <welcome-file-list>
    <welcome-file>index.jps</welcome-file>
  </welcome-file-list>
</web-app>

最后,这是我的UsuarioDao

package br.com.cuponsdesconto.dao;

import br.com.cuponsdesconto.entidades.Entidade;
import br.com.cuponsdesconto.entidades.Usuario;

import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.List;
import java.util.logging.Level;
import java.util.logging.Logger;

public class UsuarioDao extends Dao implements FuncoesDao 

    @Override
    public boolean adicionar(Entidade entidade) 
        Usuario usuario = (Usuario) entidade;
        String sql = "insert into usuario (nome, cpf, email, senha) values (?,?,?,?)";
        try
            this.conectar();
            this.stmt = this.conn.prepareStatement(sql);
            this.stmt.setString(1, usuario.getNome());
            this.stmt.setString(2, usuario.getCpf());
            this.stmt.setString(3, usuario.getEmail());
            this.stmt.setString(4, usuario.getSenha());
            this.stmt.execute();
            System.out.println("Usuario criado com sucesso!");
         catch(SQLException ex)
            System.out.println("Erro ao inserir Usuario "+ex.getMessage());
            return false;
        
        finally
            try 
                this.conn.close();
             catch (SQLException ex) 
                Logger.getLogger(UsuarioDao.class.getName()).log(Level.SEVERE, null, ex);
            
        
        return true;
    

我到处找,找不到答案,请帮帮我

【问题讨论】:

【参考方案1】:

解决我的问题很简单,JSF无法连接到数据库,因为WebContent(存储前端的文件夹)在WEB-INF / lib文件夹中没有连接器,我添加了一个mysql-connector.jar并且成功了。

当我在 / src(存储或后端的文件夹)中创建测试时,它可以工作,因为它是具有连接器的项目的一部分。

我不知道执行项目的确切 2 个 mysql 连接器

【讨论】:

以上是关于带有 JDBC 的 JSF 项目,我无法在 Servlet 上调用 DAO [重复]的主要内容,如果未能解决你的问题,请参考以下文章

带有 JSF 项目的组件库

JSF-2 f:带有Map的selectItems不显示itemLabel

JBoss 7.1 无法加载带有托管 Bean 的简单 JSF (JBAS018210)

无法使用 Web 应用程序读取属性文件(带有 JSF 的 Maven Web 应用程序)

我应该使用带有 render 属性的 ui:fragment 来有条件地在带有 JSF 2.2 的 Facelets 中呈现 HTML 标记吗?

无法将 JSF + CDI 项目从 Tomcat 迁移到 Wildfly