Невозможно отобразить ArrayList из сервлета в JSP - PullRequest
0 голосов
/ 16 ноября 2018

Я использую сервлет и jsp для отображения базы данных Access.

MainDatabase.java

    public class MainDatabase
    {
        private int proId;
        private String proName;
        private String proQuantity;
        private String proPrice;

        public MainDatabase()
        {
            this.proId = 0;
            this.proName = "";
            this.proQuantity = "";
            this.proPrice = "";
        }

        public int getProId() {
            return proId;
        }

        public void setProId(int proId) {
            this.proId = proId;
        }

        public String getProName() {
            return proName;
        }

        public void setProName(String proName) {
            this.proName = proName;
        }

        public String getProQuantity() {
            return proQuantity;
        }

        public void setProQuantity(String proQuantity) {
            this.proQuantity = proQuantity;
        }

        public String getProPrice() {
            return proPrice;
        }

        public void setProPrice(String proPrice) {
            this.proPrice = proPrice;
        }
    }

MainDatabaseUtil.java

    import org.hsqldb.Database;

    import java.io.*;
    import java.sql.*;
    import java.util.*;
    import java.util.ArrayList;
    import java.util.List;
    import org.json.simple.JSONObject;
    import org.json.simple.JSONArray;


    public class MainDatabaseUtil
    {
        public static List<MainDatabase> getMainDB() throws Exception
        {
            List<MainDatabase> mainDatabases = null;
            JSONArray payload = null;
            try
            {
                Connection conn = DriverManager.getConnection("jdbc:ucanaccess://D:\\study_materials\\Java\\Resources\\Database\\smsDemo.accdb");
                Statement stmt = conn.createStatement();
                ResultSet rs = stmt.executeQuery("SELECT * from Database");

                stmt.close();
                conn.close();

                mainDatabases = new ArrayList<>();

                //payload = new JSONArray();

                if(rs != null)
                {
                    while(rs.next())
                    {
                        MainDatabase proDB = new MainDatabase();
                        proDB.setProId(rs.getInt("ID"));
                        proDB.setProName(rs.getString("ProName"));
                        proDB.setProQuantity(rs.getString("Quantity"));
                        proDB.setProPrice(rs.getString("Price"));

                        mainDatabases.add(proDB);
                    }
                }

                return mainDatabases;
                //return payload;
            }

            catch(Exception el)
            {
                return mainDatabases;
            }
        }
    }

MainDatabaseServlet.java

    import java.io.IOException;
    import java.io.PrintWriter;
    import java.sql.SQLException;
    import java.util.List;

    import javax.servlet.RequestDispatcher;
    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 org.json.simple.JSONObject;
    import org.json.simple.JSONArray;
    import javax.servlet.*;

    @WebServlet("/MainDatabaseServlet")

    public class MainDatabaseServlet extends HttpServlet
    {
        private static final long serialVersionUID = 1L;

        public MainDatabaseServlet()
        {
            super();
        }

        public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException
        {
            try
            {
                List<MainDatabase> mainDatabases = MainDatabaseUtil.getMainDB();
                request.setAttribute("main_list", mainDatabases);
                RequestDispatcher dispatcher = request.getRequestDispatcher("/MainDatabaseView.jsp");
                dispatcher.forward(request, response);
            }
            catch (Exception el)
            {
                el.printStackTrace();
            }
        }

        public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException
        {
            doGet(request, response);
        }
    }

MainDatabaseView.jsp

    <%--
      Created by IntelliJ IDEA.
      User: Xenon
      Date: 11/15/2018
      Time: 9:15 PM
      To change this template use File | Settings | File Templates.
    --%>
    <%@ page contentType="text/html;charset=UTF-8" language="java" %>
    <%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
    <%@ page import ="java.util.ArrayList"%>
    <%@ page import ="java.util.List"%>

    <html>
    <head>
        <title>Main Database</title>
    </head>
    <body>
        <h2>Student Table Demo</h2><br>
        <hr>
        <br>
        <table border="1">

            <tr>
                <th>ID</th>
                <th>NAME</th>
                <th>QUANTITY</th>
                <th>PRICE</th>
            </tr>

            <c:forEach var="tempData" items="${main_list}">
                <tr>
                    <td>${tempData.proId}</td>
                    <td>${tempData.proName}</td>
                    <td>${tempData.proQuantity}</td>
                    <td>${tempData.proPrice}</td>
                </tr>
            </c:forEach>

        </table>
    </body>
    </html>

Я использую IntelliJ Idea. Это показывает, что в MainDatabaseView.jsp он не может разрешить переменную main_list.

Текущий вывод: отображается имя столбца таблицы, но нет данных в нем.

enter image description here

Ожидаемый вывод должен отображать значение базы данных в табличном представлении при запуске программы.

Пожалуйста, помогите. Спасибо.

1 Ответ

0 голосов
/ 16 ноября 2018

Вызовите stmt.close(); и conn.close(); после получения значений из ResultSet

https://docs.oracle.com/javase/tutorial/jdbc/basics/processingsqlstatements.html

Когда вы закончите использование Statement, вызовите метод Statement.close для немедленного освобождения ресурсов, которые он использует.Когда вы вызываете этот метод, его объекты ResultSet закрываются.

Если закрыть оператор перед извлечением набора результатов, набор результатов больше не будет ссылаться на данные.

...