MySQL 5.0. Библиотека программиста
Шрифт:
public java.util.Enumeration getParameterNames
класса HttpServletRequest. Напомним, что метод service получает в качестве параметра объект класса HttpServletRequest, который содержит все параметры HTTP-запроса к Java-серверу. Метод getParameterNames этого объекта возвращает список имен полей формы, заполненной пользователем. Если этот список пуст, значит, нужно отобразить форму ввода данных, а если нет – обработать введенные данные. Кроме того, мы будем использовать метод
public java.lang.String getParameter(«<Имя поля формы>»)
класса HttpServletRequest для получения значения, введенного пользователем в поле формы, и метод
public void setCharacterEncoding(<Кодировка>) throws java.io.UnsupportedEncodingException
класса HttpServletRequest для указания кодировки данных, полученных сервлетом.
Итак, создайте сервлет с исходным кодом, представленным в листинге 4.19.
Листинг 4.19. Ввод данныхimport java.io.*;
import javax.servlet.*;
import javax.servlet.http.*;
import java.sql.*;
public class Input extends HttpServlet {
public void service(HttpServletRequest request,
HttpServletResponse response) throws IOException, ServletException {
response.setContentType(«text/html;charset=windows-1251»);
request.setCharacterEncoding(«CP1251»);
PrintWriter out = response.getWriter;
//Получаем
java.util.Enumeration params = request.getParameterNames;
//Если список имен параметров пуст, выводим форму
if(!params.hasMoreElements) {
out.println(«<html>»);
out.println(«<head>»);
out.println(«<title>Работа с MySQL</title>»);
out.println(«</head>»);
out.println(«<body>»);
out.println(“<h1>Пожалуйста, заполните следующие поля:</h1>”);
//Создаем форму для ввода данных
//Обрабатывать введенные данные будет этот же сервлет: /servlet/Input
out.println(«<form method=\\'post\\' action=\\'/servlet/Input\\'>»);
out.println(“<table>”);
//Создаем поле для ввода имени заказчика
out.println(“<tr><td>Ваше имя:</td>”);
out.println(«<td><input type=\'text\' name=\'CustomerName\'»);
out.println(« value=\'\'></td></tr>»);
//Создаем поле для ввода телефона заказчика
out.println(“<tr><td>Телефон:</td>”);
out.println(«<td><input type=\'text\' name=\'CustomerPhone\'»);
out.println(« value=\'(495)\'></td></tr>»);
//Создаем поле для ввода адреса заказчика
out.println(«<tr><td>Адрес:</td>»);
out.println(«<td><input type=\'text\' name=\'CustomerAddress\'»);
out.println(« value=\\'\\'></td></tr>»);
out.println(«</table>»);
out.println(«<br>»);
//Создаем кнопку для подтверждения данных
out.println(“<input type=\'submit\' value=\'Отправить\'>”);
out.println(«</form>»);
out.println(«</body>»);
out.println(“</html>”);
}
//Если список имен параметров непуст, сохраняем значения
else {
try {
//Подсоединяемся к базе данных
Connection dbh =
DriverManager.getConnection(«jdbc:mysql://localhost/SalesDept»
+»?user=username&password=userpassword&characterEncoding=cp1251»);
//Создаем объект для параметризованной SQL-команды
String insertTemplate =
«INSERT INTO Customers (name,phone,address)VALUES (?,?,?)»;
PreparedStatement insert = dbh.prepareStatement(insertTemplate);
//Присваиваем параметрам значения, полученные из формы
insert.setString(1,request.getParameter(«CustomerName»));
insert.setString(2,request.getParameter(«CustomerPhone»));
insert.setString(3,request.getParameter(«CustomerAddress»));
//Выполняем запрос к базе данных
insert.executeUpdate;
//Обрабатываем исключение
} catch (SQLException ex) {
out.println(“Ошибка доступа к базе данных.”);
out.println(“Приносим свои извинения”);
return;
}
//Выводим итоговое сообщение
out.println(“<html>”);
out.println(«<head>»);
out.println(«<title>Работа с MySQL</title>»);
out.println(«</head>»);
out.println(«<body>»);
out.println(“<h3>Поздравляем!
out.println(«</body>»);
out.println(«</html>»);
}
}
}
Запустив сервлет Input, вы увидите на странице веб-форму (рис. 4.37):
Введите в поля формы какие-либо значения и нажмите кнопку Отправить. Для обработки данных повторно вызовется сервлет Input. На этот раз сервлет получит непустой список параметров, поэтому выполнятся инструкции, следующие после ключевого слова else в листинге 4.19, а именно: создастся объект insert класса PreparedStatement, соответствующий SQL-команде INSERT. Далее с помощью методов setString в команду будут подставлены введенные вами имя, телефон и адрес, а затем для передачи команды на сервер MySQL вызовется метод executeUpdate. При успешном выполнении всех этих действий вы увидите на странице соответствующее сообщение (рис. 4.38).
Итак, вы научились сохранять в базе пользовательские данные с помощью параметризованной SQL-команды.
До этого момента во всех наших сервлетах обработка возможных ошибок при взаимодействии с базой данных сводилась к выводу на экран сообщения об ошибке. В следующем подразделе вы узнаете, какие еще действия можно выполнить при перехвате исключения.
Обработка ошибок
Изучая функции JDBC, вы узнали, что в случае возникновения ошибки все эти функции генерируют исключение SQLException. С помощью методов класса SQLException вы можете получить более подробные сведения об ошибке взаимодействия с базой данных. В частности, методpublic String getMessage
возвращает описание ошибки, а метод
public int getErrorCode
возвращает код ошибки. Эту информацию целесообразно отображать на вебстранице только при отладке сервлета; в дальнейшем, при эксплуатации сервлета, лучше записывать детальную информацию об ошибках в файл или отсылать на свой электронный почтовый ящик. В частности, чтобы сохранять сообщения об ошибках в log-файле, добавим в исходный код сервлета вызов метода
public void log(«<Текст сообщения>»)
класса HttpServlet:
…
try {
//Операции с базой данных
…
//Обрабатываем исключение
} catch (SQLException ex) {
out.println(«Ошибка доступа к базе данных.»);
out.println(«Приносим свои извинения»);
//Записываем сообщение об ошибке в log-файл
log(ex.getErrorCode + « « +ex.getMessage);
return;
}
…Например, если модифицировать таким образом сервлет Input (см. листинг 4.19), то в случае отсутствия в базе данных таблицы Customers (Клиенты) в log-файл будет записано следующее сообщение:
28.06.2008 11:15:00 org.apache.catalina.core.ApplicationContext log INFO: Input: 1146 Table \'salesdept.customers\' doesn\'t exist
Примечание
При запуске сервлета в созданной нами среде разработки сервлетов сообщение об ошибке будет записано в файл <Корневая папка Tomcat>\logs\localhost.<Текущая дата>.log. При использовании хостинга с поддержкой сервлетов уточните имя и местоположение log-файла у провайдера хостинга.
Итак, вы узнали, каким образом исключение SQLException позволяет организовать обработку ошибок, возникших при обращении к базе данных. В завершение кратко обобщим основные сведения, рассмотренные в разделе 4.3 «Интерфейс с Java».
Итоги
В данном разделе вы научились работать с базой данных MySQL, используя следующие функции JDBC:
• метод getConnection класса DriverManager для подключения к базе данных, установки кодировки и выбора текущей базы данных;
• методы createStatement и prepareStatement класса Connection для создания объектов, отвечающих за выполнение SQL-команды на сервере MySQL;
• методы set<Тип данных> класса PreparedStatement для подстановки значений в параметризованный запрос;
• методы executeUpdate классов Statement и PreparedStatement для выполнения SQL-команд изменения данных;
• методы executeQuery классов Statement и PreparedStatement для выполнения SQL-запросов;
• методы next и get<Тип данных> класса ResultSet для получения отдельных значений из результата запроса;
• методы getMessage и getErrorCode класса SQLException для обработки ошибок взаимодействия с базой данных.
Разумеется, возможности интерфейса JDBC не исчерпываются перечисленными функциями. Полную информацию о JDBC вы найдете на странице http://java.sun.com/javase/6/docs/technotes/guides/jdbc/.
Подведем теперь итоги главы.
4.4. Резюме
В данной главе вы познакомились с возможностями популярных языков веб-программирования – PHP, Perl и Java – по интеграции с базой данных MySQL. Хотя мы ограничились рассмотрением только самых необходимых функций, позволяющих подключаться к базе данных и выполнять SQL-команды, с помощью этих функций вы можете создавать широкий спектр динамических веб-приложений.