Продолжим работу с проектом из прошлой статьи и добавим в него функционал по добавлению, выводу, редактированию и удалению объектов из БД.
Теперь добавим в проект в папку Java Resources/src новый сервлет IndexServlet со следующим кодом:
import java.io.IOException; import java.util.ArrayList; 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 mysqlapp.business.Product; import mysqlapp.business.ProductDB; @WebServlet("/") public class IndexServlet extends HttpServlet { protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { ArrayList<Product> products = ProductDB.select(); request.setAttribute("products", products); getServletContext().getRequestDispatcher("/index.jsp").forward(request, response); } }
Этот сервлет получает все данные из бд через метод ProductDB.select()
и передает их странице index.jsp.
Определим в папке WebContent страницу index.jsp:
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %> <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title>Products</title> </head> <body> <h2>Products List</h2> <p><a href='<c:url value="/create" />'>Create new</a></p> <table> <tr><th>Name</th><th>Price</th><th></th></tr> <c:forEach var="product" items="${products}"> <tr><td>${product.name}</td> <td>${product.price}</td> <td> <a href='<c:url value="/edit?id=${product.id}" />'>Edit</a> | <form method="post" action='<c:url value="/delete" />' style="display:inline;"> <input type="hidden" name="id" value="${product.id}"> <input type="submit" value="Delete"> </form> </td></tr> </c:forEach> </table> </body> </html>
Страница index.jsp получает список объектов и с помощью тегов JSTL выводит их в коде html.
В начале страницы определена ссылка на добавление нового объекта. Для реализации функционала добавления определим в проекте новый сервлет CreateServlet:
import java.io.IOException; import java.util.ArrayList; 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 mysqlapp.business.Product; import mysqlapp.business.ProductDB; @WebServlet("/create") public class CreateServlet extends HttpServlet { protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { getServletContext().getRequestDispatcher("/create.jsp").forward(request, response); } protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { try { String name = request.getParameter("name"); int price = Integer.parseInt(request.getParameter("price")); Product product = new Product(name, price); ProductDB.insert(product); response.sendRedirect(request.getContextPath()+"/index"); } catch(Exception ex) { getServletContext().getRequestDispatcher("/create.jsp").forward(request, response); } } }
При get-запросе сервлет будет отдавать польователю форму для заполнения добавляемых данных в виде страницы create.jsp.
А при post-запросе он получает отправленные через форму данные и добавляет их в базу данных пр помощи метода ProductDB.insert(product);
.
И после успешного добавления идет переадресация на сервлет IndexServlet.
Поскольку в данном случае необходимо получить числовое представление цены добавляемого товара из параметра price, то при конвертации из строки в число мы можем столкнуться с потенциальной ошибкой, поэтому весь код преобрзования помещен в конструкцию try..catch. Если же ошибка все таки возникнет, то сервлет опять же возвратит пользователю форму для добавления данных.
Далее добавим в папку WebContent новую страницу create.jsp:
<!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title>Create product</title> </head> <body> <h3>New product</h3> <form method="post"> <label>Name</label><br> <input name="name"/><br><br> <label>Price</label><br> <input name="price" type="number" min="100" /><br><br> <input type="submit" value="Save" /> </form> </body> </html>
Здесь определена простая форма, которая по нажатию кнопки отправляет данные сервлету CreateServlet.
Проверим добавленный функционал. Запустим сервлет IndexServlet. Поскольку по умолчанию таблица пуста (если в нее ранее не были добавлены какие-нибудь данные), то мы увидим пустую таблицу. Поэтому перейдем по ссылке для добавления и добавим какие-нибудь данные:
И после успешного добавления мы сможем увидеть добавленные данные:
Добавим в папку Java Resources/src новый сервлет EditServlet:
import java.io.IOException; 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 mysqlapp.business.Product; import mysqlapp.business.ProductDB; @WebServlet("/edit") public class EditServlet extends HttpServlet { protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { try { int id = Integer.parseInt(request.getParameter("id")); Product product = ProductDB.selectOne(id); if(product!=null) { request.setAttribute("product", product); getServletContext().getRequestDispatcher("/edit.jsp").forward(request, response); } else { getServletContext().getRequestDispatcher("/notfound.jsp").forward(request, response); } } catch(Exception ex) { getServletContext().getRequestDispatcher("/notfound.jsp").forward(request, response); } } protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { try { int id = Integer.parseInt(request.getParameter("id")); String name = request.getParameter("name"); int price = Integer.parseInt(request.getParameter("price")); Product product = new Product(id, name, price); ProductDB.update(product); response.sendRedirect(request.getContextPath() + "/index"); } catch(Exception ex) { getServletContext().getRequestDispatcher("/notfound.jsp").forward(request, response); } } }
В методе doGet сервлет получает параметр id и по нему извлекает из базы данных соответствующий объект. Если объект найден, то он передается на страницу edit.jsp. Если объект не найден или произошла какая-нибудь ошибка, то возвращается страница notfound.jsp.
В методе doPost получаем отправленные данные и через метод ProductDB.update(product)
передаем их в базу данных.
Теперь добавим в папку WebContent страницу edit.jsp:
<!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title>Edit product</title> </head> <body> <h3>Edit product</h3> <form method="post"> <input type="hidden" value="${product.id}" name="id" /> <label>Name</label><br> <input name="name" value="${product.name}" /><br><br> <label>Price</label><br> <input name="price" value="${product.price}" type="number" min="100" /><br><br> <input type="submit" value="Send" /> </form> </body> </html>
Здесь определена форма, которая выводит редактируемые данные в поля формы. И по нажатию на кнопку данные уходят обратно сервлету EditServlet.
Также добавим страницу notfound.jsp для отображения ошибки:
<!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title>Page not found</title> </head> <body> <h2>Page not found</h2> </body> </html>
Здесь просто выводится сообщение о том, что ресурс не найден. Однако можно выводить более осмысленное сообщение или для различных ситуаций определить различные страницы ошибок.
И также добавим в сервлет DeleteServlet для реализации удаления данных:
import java.io.IOException; 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 mysqlapp.business.ProductDB; @WebServlet("/delete") public class DeleteServlet extends HttpServlet { protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { try { int id = Integer.parseInt(request.getParameter("id")); ProductDB.delete(id); response.sendRedirect(request.getContextPath() + "/index"); } catch(Exception ex) { getServletContext().getRequestDispatcher("/notfound.jsp").forward(request, response); } } }
Сервлет получает id удаляемого объекта и через метод ProductDB.delete(id)
производит удаление. И после успешного удаления
идет переадресация на IndexServlet.
Запустим сервлет IndexServlet и проверим работоспособность добавленного функционала: