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

Последнее обновление: 30.09.2018

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

Вывод данных

Теперь добавим в проект в папку 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. Поскольку по умолчанию таблица пуста (если в нее ранее не были добавлены какие-нибудь данные), то мы увидим пустую таблицу. Поэтому перейдем по ссылке для добавления и добавим какие-нибудь данные:

Добавление данных в БД в сервлетах и jsp в JavaEE

И после успешного добавления мы сможем увидеть добавленные данные:

Вывод данных из БД в сервлетах и jsp в JavaEE

Редактирование

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

Редактирование данных в MySQL в сервлетах Java EE
Помощь сайту
Юмани:
410011174743222
Перевод на карту
Номер карты:
4048415020898850