
Рис. 4.33. Стартовая страница Tomcat
9. Чтобы запустить сервлет, наберите в адресной строке браузера его адрес, который вы задали в файле web.xml: http://localhost:8080/servlet/test. Вы увидите результат выполнения сервлета: текст "Мой первый сервлет" (рис. 4.34).

Рис. 4.34. Результат выполнения сервлета
Итак, вы научились создавать собственные сервлеты и запускать их. Отмечу, что при изменении ранее созданного сервлета его необходимо перекомпилировать (см. пп. 5–6), а затем перезапустить Tomcat, используя файлы shutdown.bat и startup.bat в папке bin корневой папки Tomcat.
Перейдем теперь к разработке сервлета, взаимодействующего с базой данных MySQL.
Подключение к базе данных
В данном разделе мы рассмотрим простой сервлет, который подключается к базе данных и выводит диагностическое сообщение. Чтобы создать такой сервлет, необходимо импортировать пакеты java.sql.*.
Соединение с базой данных описывается объектом класса Connection. Для создания такого объекта предназначен метод
public static Connection getConnection("jdbc:mysql://<Имя
хоста>[:<Имя порта>]/<Имя базы данных>[<Параметры>]")
throws SQLException
класса DriverManager. Параметры соединения задаются в формате
?<Имя параметра>=<Значение>&<Имя параметра>=<Значение>…
Важнейшими параметрами соединения являются user (имя пользователя), password (пароль) и characterEncoding (кодировка).
Если при подключении к базе данных произошла ошибка, метод getConnection() сгенерирует исключение SQLException, о котором подробно будет рассказано в подразделе "Обработка ошибок".
Например, вызов метода
Connection dbh =
DriverManager.getConnection("jdbc:mysql://localhost/SalesDept"
+ "?user=username"
+ "&password=userpassword"
+ "&characterEncoding=cp1251");
осуществляет подключение к серверу MySQL, работающему на локальном компьютере, используя имя пользователя username и пароль userpassword, устанавливает для взаимодействия с сервером кодировку CP-1251 и выбирает базу данных SalesDept (Отдел продаж) в качестве текущей. Созданному соединению соответствует объект dbh класса Connection.
...
Совет
В целях защиты от несанкционированного доступа рекомендуется подключаться к базе данных не от имени пользователя root, а от имени специально созданного пользователя с минимально необходимыми правами доступа. О регистрации пользователей и настройке прав читайте в главе 4.
Создайте теперь сервлет Connect с исходным кодом, представленным в листинге 4.17.
Листинг 4.17.
Подключение к базе данных
import java.io.*;
import javax.servlet.*;
import javax.servlet.http.*;
import java.sql.*;
public class Connect extends HttpServlet {
public void service(HttpServletRequest request,
HttpServletResponse response) throws IOException, ServletException {
response.setContentType("text/html;charset=windows-1251");
PrintWriter out = response.getWriter();
try {
//Подсоединяемся к базе данных
Connection dbh =
DriverManager.getConnection("jdbc:mysql://localhost/SalesDept"
+"?user=username&password=userpassword&characterEncoding=cp1251");
//Обрабатываем испключение
} catch (SQLException ex) {
out.println("Ошибка доступа к базе данных. Приносим свои извинения");
return;
}
out.println("Подключение выполнено успешно");
}
}
После размещения и регистрации сервлета в контейнере наберем его адрес в адресной строке браузера. При успешном подключении к базе данных на вебстранице появится соответствующее сообщение (рис. 4.35).

Рис. 4.35. Результат подключения к базе данных
После подключения к серверу MySQL можно переходить к работе с данными. В следующем подразделе мы рассмотрим выполнение простых SQL-команд.
Выполнение простых SQL-команд. Обработка результатов запроса
Для выполнения SQL-команд, не имеющих подстановочных параметров, предназначен класс Statement. Объект класса Statement создается с помощью метода
Statement createStatement() throws SQLException
класса Connection. Например, вызов метода
Statement query = dbh.createStatement();
создает объект query, соответствующий SQL-команде. Если SQL-команда не предполагает получение данных из базы (такими командами являются, например, команды INSERT, UPDATE, DELETE), то для ее выполнения используется метод
int executeUpdate("<Текст команды>") throws SQLException
класса Statement. Метод executeUpdate() возвращает количество строк, с которыми была выполнена операция. Для выполнения SQL-запроса используется метод
ResultSet executeQuery("<Текст запроса>") throws SQLException
класса Statement. Метод executeQuery() возвращает объект класса ResultSet, содержащий набор полученных запросом данных. Важным элементом результирующего набора является курсор – указатель на текущую строку.
Для извлечения данных из результирующего набора нам потребуются следующие методы класса ResultSet.
• boolean next() throws SQLException
Переводит курсор на следующую строку. При первом вызове устанавливает курсор на первую строку. Если строки результирующего набора исчерпаны, возвращает значение FALSE.
• Методы вида get^rn данных>(<Имя или номер столбца>) возвращают значение, находящееся в текущей строке в указанном столбце. В зависимости от типа данных столбца вы можете использовать следующие функции:
• для числовых столбцов:
boolean getBoolean(<Имя или номер столбца>)
throws SQLException
int getInt(<Имя или номер столбца>)
throws SQLException
long getLong(<Имя или номер столбца>)
throws SQLException
float getFloat(<Имя или номер столбца>)
throws SQLException
double getDouble(<Имя или номер столбца>)
throws SQLException
BigDecimal getBigDecimal(<Имя или номер столбца>)
throws SQLException
• для столбцов с типом даты и/или времени:
Date getDate(<Имя или номер столбца>)
throws SQLException
Timestamp getTimestamp(<Имя или номер столбца>)
throws SQLException
Time getTime(<Имя или номер столбца>)
throws SQLException
• для символьных типов данных:
String getString(<Имя или номер столбца>)
throws SQLException
byte[] getBytes(<Имя или номер столбца>)
throws SQLException
Рассмотрим сервлет, который выполняет простой запрос для получения данных из таблицы Products (Товары) и выводит сведения о товарах на веб-странице (листинг 4.18). Листинг 4.18. Получение информации и отображение ее на странице
import java.io.*;
import javax.servlet.*;
import javax.servlet.http.*;
import java.sql.*;
public class Output extends HttpServlet {
public void service(HttpServletRequest request,
HttpServletResponse response) throws IOException, ServletException {
response.setContentType("text/html;charset=windows-1251");
PrintWriter out = response.getWriter();
//Создаем строку для вывода результата запроса
String pagecontent = "";
try {
//Подсоединяемся к базе данных
Connection dbh =
DriverManager.getConnection("jdbc:mysql://localhost/SalesDept"
+"?user=username&password=userpassword&characterEncoding=cp1251");
//Создаем объект для SQL-команд
Statement query = dbh.createStatement();
//Выполняем запрос к базе данных
ResultSet qresult = query.executeQuery("SELECT * FROM Products");
//Для каждой строки в результирующем наборе выводим значения столбцов
//description (наименование), details (описание) и price (цена)