Как мне правильно вернуть arraylist, который отображает данные на основе идентификатора пользователя?

#java #mysql #servlets #arraylist

#java #mysql #сервлеты #arraylist

Вопрос:

Я смог правильно отобразить arraylist, который отображает все данные в моей базе данных MySQL, однако у меня возникли проблемы с отображением данных на основе идентификатора пользователя.

Вот мой код:

CreditsServlet.java

 private void listTrans(HttpServletRequest request, HttpServletResponse response)
        throws SQLException, IOException, ServletException {

    int id = Integer.parseInt(request.getParameter("id"));
    List<Credits> creditlist = OrganizerDao.getAllCredits(id);

    for (Credits credits : creditlist) {
        if (credits.getOrganizerid() == id) {
            request.setAttribute("creditlist", creditlist);
        }

        request.getRequestDispatcher("credits.jsp").include(request, response);
    }
}
  

Любая помощь или направление будут высоко оценены. Заранее спасибо

РЕДАКТИРОВАТЬ: CreditsDao.java

 public static List<Credits> getAllCredits(int id) throws SQLException {

    List<Credits> creditlist=new ArrayList<>();

    try{
        Connection con= OrganizerDao.getConnection();
        PreparedStatement ps=con.prepareStatement("select users.id AS organizerid, credits.invoiceid, "  
                "credits.amountin AS creditamount, attendees.name AS payee, credits.purpose, gateway.name AS gatewayname "  
                "from users, credits, attendees, gateway where credits.userid=users.id and credits.attendeeid=attendees.id "  
                "and credits.gateway=gateway.id");

        ResultSet rs=ps.executeQuery();
        while(rs.next()){

            Credits credits = new Credits();

            credits.setOrganizerid(rs.getInt("organizerid"));
            credits.setInvoiceid(rs.getInt("invoiceid"));
            credits.setCreditamount(rs.getDouble("creditamount"));
            credits.setPayee(rs.getString("payee"));
            credits.setPurpose(rs.getString("purpose"));
            credits.setGatewayname(rs.getString("gatewayname"));

            creditlist.add(credits);

        }
        con.close();
    }catch(Exception e){e.printStackTrace();}

    return creditlist;

}
  

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

1. При этом метод не OrganizerDao.getAllCredits(id) возвращает кредиты для конкретного пользователя с этим идентификатором, или все кредиты в систему?

2. Опубликованный мной код возвращает кредиты для конкретного пользователя, но только при наличии одной записи в базе данных. В тот момент, когда вы добавляете больше записей, код больше не работает. Не уверен, почему это

3. Тогда метод OrganizerDao.getAllCredits(id) неисправен. Сначала вам нужно исправить этот метод, а позже — сервлет.

Ответ №1:

Намного проще, чем вы думаете:

Сначала исправьте DAO и используйте параметр. Изменения ниже:

 public static List<Credits> getAllCredits(int id) throws SQLException {

  ...

  PreparedStatement ps=con.prepareStatement("select users.id AS organizerid, credits.invoiceid, "  
    "credits.amountin AS creditamount, attendees.name AS payee, credits.purpose, gateway.name AS gatewayname "  
    "from users, credits, attendees, gateway where credits.userid=users.id and credits.attendeeid=attendees.id "  
    "and credits.gateway=gateway.id"  
    " and users.id = ?"); // Added this extra SQL code
  ps.setInt(1, id); // Added this code to use the id parameter

  ...

}
  

Затем вы можете просто использовать полученный список в сервлете:

 private void listTrans(HttpServletRequest request, HttpServletResponse response)
        throws SQLException, IOException, ServletException {
  int id = Integer.parseInt(request.getParameter("id"));
  List<Credits> creditlist = OrganizerDao.getAllCredits(id);
  request.setAttribute("creditlist", creditlist);
  response.sendRedirect("resultpage.jsp");  
}
  

Этот код:

  • Извлекает параметр id (условие фильтрации).
  • Извлекает кредиты для конкретного пользователя.
  • Затем он помещает их в атрибут creditlist области запроса.
  • В конечном итоге он перенаправляет на новую результирующую страницу, на которой будут показаны кредиты.

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

1. Это решило мою проблему, но response.sendRedirect не сработал. я использовал dispatcher и include, чтобы заставить код работать. Большое спасибо.