Продолжим работу с проектом из прошлой статьи и добавим в него функционал по добавлению, выводу, редактированию и удалению объектов из БД.
Теперь добавим в проект в папку 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 и проверим работоспособность добавленного функционала: