Как решить исключение нулевого указателя при передаче атрибутов между классом сервлета и jsp.файлом

#java #mysql #jsp #servlets #attributes

#java #mysql #jsp #сервлеты #атрибуты

Вопрос:

Я продолжаю получать NullPointerException ошибку при запуске userList.jsp :

Я пытаюсь вывести размер списка пользовательских объектов массива:

 <%-- 
    Document   : userList
    Created on : 13-Mar-2019, 22:08:54
    Author     : sonia
--%>

<%@page import="java.util.ArrayList"%>
<%@page import="java.util.List"%>
<%@page import="com.mycompany.gartisweb.domain.User"%>
<%@page contentType="text/html" pageEncoding="UTF-8"%>
<% ArrayList users = (ArrayList)request.getAttribute("users"); %>
<!DOCTYPE html>
<html>
    <head>

        <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
        <title>List of Users</title>
    </head>
    <body>

                <% users.size(); %>

    </body>
</html>
  

Вот как выглядит мой класс servlet:

 public class UserListServlet extends HttpServlet {

    public UserListServlet() {
    }

    //private final UserDao ud = new UserDao();

    /**
     * Processes requests for both HTTP <code>GET</code> and <code>POST</code>
     * methods.
     *
     * @param request servlet request
     * @param response servlet response
     * @throws ServletException if a servlet-specific error occurs
     * @throws IOException if an I/O error occurs
     */
    @Override
    protected void service(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {

       // List<User> users = new ArrayList();
         //   users = ud.findAllUsers();


        request.setAttribute("users", new UserDao().findAllUsers());
        ServletContext servletContext = getServletContext();
        RequestDispatcher requestDispatcher = servletContext.getRequestDispatcher("userList.jsp");
        //RequestDispatcher rd = request.getRequestDispatcher("userList.jsp");
        requestDispatcher.forward(request, response);
        //rd.forward(request, response);

    }
  

Функция findAllUsers() в классе UserDao:

  @Override
public ArrayList<User> findAllUsers() {
    ArrayList<User> userList = new ArrayList<>();
    Connection con;
    con = DBConnection.createConnection();
    Statement statement = null;
    ResultSet rs;
    try {
        con.setAutoCommit(false);
        statement = con.createStatement();
        rs = statement.executeQuery("SELECT * FROM user");
        while (rs.next()) {
           User user = new User();

            user.setId(rs.getInt(1));
            user.setEmail(rs.getString(2));
            user.setPassword(rs.getString(3));
            user.setFirstName(rs.getString(4));
            user.setSurName(rs.getString(5));
            user.setRole(rs.getString(6));
            userList.add(user);
        }
    } catch (SQLException e) {
        throw new RuntimeException(e);
    } finally {

        if (con != null) {
            try {
                con.close();
            } catch (SQLException ex) {
                throw new RuntimeException(ex);

            }
        }
        if (statement != null) {
            try {
                statement.close();
            } catch (SQLException ex) {
                throw new RuntimeException(ex);

            }
        }
    }

    return userList;
}
  

Я не могу найти ошибку в своем коде, кто-нибудь может объяснить мне, как я мог бы решить эту проблему?

Комментарии:

1. Сохраните весь код, если service метод находится в try, и он перехватывается с исключением, а внутри catch вы печатаете трассировку стека, которая покажет номер строки, в которой возникает исключение

Ответ №1:

Это потому, что вы обращаетесь к JSP напрямую с http://.../userList.jsp URL. Используйте URL, который сопоставлен с UserListServlet , чтобы сервлет мог установить переменную и выполнить пересылку.

Вы также, вероятно, захотите сделать <%= users.size(); %> для отображения количества пользователей.

Комментарии:

1. Хорошо, я сделал это, но теперь размер arraylist по-прежнему не отображается (см. скриншот выше) …

2. @SoniaMathews вместо <% использования <%= , как предложено в ответе.