使用 MVC 模式在 JSP 页面中的 HTML <table> 中显示 JDBC ResultSet - NullPointerException

Posted

技术标签:

【中文标题】使用 MVC 模式在 JSP 页面中的 HTML <table> 中显示 JDBC ResultSet - NullPointerException【英文标题】:Show JDBC ResultSet in HTML <table> in JSP page using MVC pattern - NullPointerException 【发布时间】:2015-12-22 21:11:29 【问题描述】:

如果我将 UsuarioDAO 中的代码放入 UsuarioServletJSP 运行良好。但是我正在尝试使用 MVCOO,但我无法理解我的代码有什么问题,因为我从 UsuarioDAOUsuarioServlet 中的 /strong>,理论上应该可以很好地工作,但事实并非如此。如果有人能告诉我我做错了什么,我将不胜感激。

Usuario.java

package modelo;

public class Usuario 

    private String nome;
    private String login;
    private String senha;
    private int tipo;
    private String cpf;

    public void setNome(String nome) 
        this.nome = nome;
    

    public void setLogin(String login) 
        this.login = login;
    

    public void setSenha(String senha) 
        this.senha = senha;
    

    public void setTipo(int tipo) 
        this.tipo = tipo;
    

    public void setCpf(String cpf) 
        this.cpf = cpf;
    

    public String getNome() 
        return nome;
    

    public String getLogin() 
        return login;
    

    public String getSenha() 
        return senha;
    

    public int getTipo() 
        return tipo;
    

    public String getCpf() 
        return cpf;
    


UsuarioDAO.java

package controle;

import modelo.Usuario;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.servlet.ServletConfig;
import javax.servlet.ServletException;

public class UsuarioDAO 

    private Connection con;

    public void init(ServletConfig config) throws ServletException 
        final String url = "jdbc:oracle:thin:@oracle.inf.poa.ifrs.edu.br:1521:XE";
        final String us = "kar";
        try 
            Class.forName("oracle.jdbc.OracleDriver");
         catch (ClassNotFoundException ex) 
            Logger.getLogger(ex1.class.getName()).log(Level.SEVERE, null, ex);
        
        try 
            con = DriverManager.getConnection(url, us, us);
         catch (SQLException ex) 
            throw new ServletException(ex);
        
    

    public List<Usuario> list() throws SQLException 
        List<Usuario> lista = new ArrayList<>();
        try (
                Connection connection = con;
                PreparedStatement statement = connection.prepareStatement("SELECT * FROM JDBC_USUARIO");
                ResultSet rs = statement.executeQuery();) 
            while (rs.next()) 
                Usuario usuario = new Usuario();
                usuario.setNome(rs.getString(1));
                usuario.setLogin(rs.getString(2));
                usuario.setSenha(rs.getString(3));
                usuario.setTipo(rs.getInt(4));
                usuario.setCpf(rs.getString(5));
                lista.add(usuario);
            
        
        return lista;
    


Usuarioservlet.java

    package controle;

    import modelo.Usuario;
    import java.io.IOException;
    import java.sql.SQLException;
    import java.util.List;
    import javax.servlet.ServletException;
    import javax.servlet.annotation.WebServlet;
    import javax.servlet.http.HttpServlet;
    import javax.servlet.http.HttpServletRequest;
    import javax.servlet.http.HttpServletResponse;

    @WebServlet(name = "UsuarioServlet", urlPatterns = "/UsuarioServlet")
    public class UsuarioServlet extends HttpServlet 

        UsuarioDAO usrDAO = new UsuarioDAO();

        @Override
        protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException 
            try 
                List<Usuario> retorno = usrDAO.list();
                request.setAttribute("listaJSP", retorno);
                request.getRequestDispatcher("/WEB-INF/listarUsuarios.jsp").forward(request, response);
             catch (SQLException e) 
                throw new ServletException("Erro ao obter os dados", e);
            
        
    

listarUsuarios.jsp

<%@ taglib prefix="c" uri="http://java.sun.com/jstl/core_rt" %>  
<%@ taglib prefix="fn" uri="http://java.sun.com/jsp/jstl/functions" %>
<%@page contentType="text/html" pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
    <head>
        <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
        <title>Servlet Exibe Resultado</title>
    </head>
    <body>
        <TABLE BORDER=“1”>       

            <th>ID</th>
            <th>Nome</th>
            <th>Login</th>
            <th>Senha</th>
            <th>Tipo</th>
            <th>CPF</th>

            <c:forEach items="$listaJSP" var="show" >
                <c:set var="i" value="$i+1"  />
                <tr>
                    <td><c:out value="$i"             /></td>
                    <td><c:out value="$show.nome"     /></td>
                    <td><c:out value="$show.login"    /></td>
                    <td><c:out value="$show.senha"    /></td>
                    <td><c:out value="$show.tipo"     /></td>
                    <td><c:out value="$show.cpf"      /></td>
                </tr>
            </c:forEach>
        </table>
    </body>
</html>

【问题讨论】:

你能提供错误堆栈跟踪吗? 当我运行项目并尝试打开页面时,我只有这个错误:exception java.lang.NullPointerException 【参考方案1】:

您收到此错误是因为您的 UsuarioDAO 上的 init() 方法从未被调用,而这一行

List<Usuario> retorno = usrDAO.list();

返回null。 在调用列表之前尝试usrDAO.init()

原因可能是因为UsuarioDAO 不是httpServlet 所以init() 方法在创建时没有运行

【讨论】:

同样的错误,这是你说要试试的吗? usrDAO.list();List&lt;Usuario&gt; retorno = usrDAO.list(); usrDAO.init(null);然后 List retorno = usrDAO.list(); 哦,当然,我看错了,我像你说的那样改成了usrDAO.init(null);,它有效!所以,据我了解,我必须将class.method 称为 null 来初始化他,然后再次调用?像我以前一样调用class.method 不会“初始化”该方法吗?发生这种情况是因为不是 servlet? init(... ) 命令只会在您的类扩展 HttpServlet 的情况下自动运行。这就是为什么当你将 UsuarioDAO 放入 UsuarioServlet 时它可以工作的原因。

以上是关于使用 MVC 模式在 JSP 页面中的 HTML <table> 中显示 JDBC ResultSet - NullPointerException的主要内容,如果未能解决你的问题,请参考以下文章

MVC模式

谈谈JAVA工程狮面试中经常遇到的面试题目------什么是MVC设计模式

MVC的使用方法!

spring mvc返回的jsp被当作html中的body

JSP开发的MVC架构

Java EE模式和MVC