5

## 5.3 Основные операции с базой данных. Часть 2

Продолжим работу с проектом из прошлой статьи и добавим в него функционал по добавлению, выводу, редактированию и удалению объектов из БД.

### Вывод данных

Теперь добавим в проект в папку 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 и проверим работоспособность добавленного функционала:

Назад Содержание