#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, чтобы заставить код работать. Большое спасибо.