Чтение онлайн

на главную - закладки

Жанры

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>Поздравляем!

Регистрация завершена успешно</h3>”);

out.println(«</body>»);

out.println(«</html>»);

}

}

}

Запустив сервлет Input, вы увидите на странице веб-форму (рис. 4.37):

Рис. 4.37. Форма ввода данных

Введите в поля формы какие-либо значения и нажмите кнопку Отправить. Для обработки данных повторно вызовется сервлет Input. На этот раз сервлет получит непустой список параметров, поэтому выполнятся инструкции, следующие после ключевого слова else в листинге 4.19, а именно: создастся объект insert класса PreparedStatement, соответствующий SQL-команде INSERT. Далее с помощью методов setString в команду будут подставлены введенные вами имя, телефон и адрес, а затем для передачи команды на сервер MySQL вызовется метод executeUpdate. При успешном выполнении всех этих действий вы увидите на странице соответствующее сообщение (рис. 4.38).

Рис. 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-команды, с помощью этих функций вы можете создавать широкий спектр динамических веб-приложений.

Поделиться:
Популярные книги

Лорд Системы 12

Токсик Саша
12. Лорд Системы
Фантастика:
фэнтези
попаданцы
рпг
5.00
рейтинг книги
Лорд Системы 12

Младший научный сотрудник 2

Тамбовский Сергей
2. МНС
Фантастика:
попаданцы
альтернативная история
5.00
рейтинг книги
Младший научный сотрудник 2

#Бояръ-Аниме. Газлайтер. Том 11

Володин Григорий Григорьевич
11. История Телепата
Фантастика:
фэнтези
попаданцы
аниме
5.00
рейтинг книги
#Бояръ-Аниме. Газлайтер. Том 11

Цеховик. Книга 2. Движение к цели

Ромов Дмитрий
2. Цеховик
Фантастика:
попаданцы
альтернативная история
5.00
рейтинг книги
Цеховик. Книга 2. Движение к цели

Неестественный отбор.Трилогия

Грант Эдгар
Неестественный отбор
Детективы:
триллеры
6.40
рейтинг книги
Неестественный отбор.Трилогия

Попаданка в семье драконов

Свадьбина Любовь
Попаданка в академии драконов
Любовные романы:
любовно-фантастические романы
7.37
рейтинг книги
Попаданка в семье драконов

Звезда сомнительного счастья

Шах Ольга
Фантастика:
фэнтези
6.00
рейтинг книги
Звезда сомнительного счастья

Беглец

Кораблев Родион
15. Другая сторона
Фантастика:
боевая фантастика
попаданцы
рпг
5.00
рейтинг книги
Беглец

Я – Орк

Лисицин Евгений
1. Я — Орк
Фантастика:
юмористическая фантастика
попаданцы
аниме
5.00
рейтинг книги
Я – Орк

Смерть может танцевать 2

Вальтер Макс
2. Безликий
Фантастика:
героическая фантастика
альтернативная история
6.14
рейтинг книги
Смерть может танцевать 2

Идеальный мир для Лекаря 18

Сапфир Олег
18. Лекарь
Фантастика:
юмористическое фэнтези
аниме
5.00
рейтинг книги
Идеальный мир для Лекаря 18

Жандарм

Семин Никита
1. Жандарм
Фантастика:
попаданцы
альтернативная история
аниме
4.11
рейтинг книги
Жандарм

Путь Шедара

Кораблев Родион
4. Другая сторона
Фантастика:
боевая фантастика
6.83
рейтинг книги
Путь Шедара

Гром над Империей. Часть 1

Машуков Тимур
5. Гром над миром
Фантастика:
фэнтези
5.20
рейтинг книги
Гром над Империей. Часть 1