Итак, мы приступаем к написанию нашего приложения в виде интернет-решения.

В предыдущих частях Вы уже посмотрели основы взаимодействия броузера с сервером. Мы выяснили, что запросы пользователя посылаются на сервер, где их обрабатывает сервлет. Сервлет может сам создать необходимый HTML, но это достаточно неудобно и поэтому в подавляющем большинстве случаев все данные сервлет может передать JSP, которая покажет все эти данные в виде HTML-страницы.

JNDI — первое знакомство
Для начала мы с вами немножко изменим наше ядро — ManagementSystem. Во-первых, посмотрим на новую технологию, во-вторых — сделаем наше приложение более профессиональным.
оспользуемся системой JNDI — Java Naming Directory Interface — специальная система имен, которая позволяет делать следующее: хранить в некотором репозитории нужные нам классы и возвращать их по требованию приложений по имени. Что очень удобно — мы можем задавать параметры для нужного нам ресурса во внешнем конфигурационном файл, а не прописывать жестко в коде — что в общем-то всегда является не очень хорошим стилем.
Заметьте, что даже класс драйвера мы можем теперь менять независимо от кода нашего приложения — можем позже использовать другую базу данных — Oracle, Sybase, DB2 и другие.

Рекомендуем: Для более полного ознакомления с технологией JNDI я вам советую посмотреть следующие ссылки:

http://java.sun.com/products/jndi/tutorial/TOC.html — это подробное описание системы JNDI

http://tomcat.apache.org/tomcat-4.1-doc/jndi-resources-howto.html — описание использования JNDI для сервера Tomcat

Как и в прошлый раз мы создадим необходимые нам файлы в обычном редакторе. Сейчас мы с вами сделаем приложение, которое будет очень похоже на то, что было сделано в «Части 7 — Первые шаги в Интернет». У нас будет один сервлет, который покажет нам таблицу групп.

Итак, давайте создадим наши файлы.

web.xml

Как видите, мы описали всего один сервлет, для которого сделали маппинг (связку, отображение — русского термина так и не придумали), т.е. связали URL и сервлет. Это мы уже видели раньше. Но вот дальше у нас с вами новинка — мы описали ресурс. У него есть описание — DB Connection. Далее мы указали имя, по которому мы будем его запрашивать через JNDI — jdbc/StudentsDS. Также мы описали тип/класс возвращаемого ресурса — javax.sql.DataSource. И в конце мы указали кто отвечает за авторизацию — будет ли приложение само подставлять логин и пароль или этим будет заниматься контейнер — в нашем случае этим будет заниматься Tomcat.

Отметим, что при таком описании контейнер берет на себя все заботы по поддержанию коннекта к базе. Причем не одного, а целого пула — несколько штук коннектов. Это удобно тем, что создание коннекта — дело сложное, долгое и ресурсоемкое. Если мы имеем некоторый запас свободных коннектов — это ускоряет работу.

Для того, чтобы Tomcat знал какие параметры он должен подставить нам необходим еще один файл — context.xml.

Я думаю. что многие параметры для вас очевидны. Но все же опишем их.
name — имя ресурса — оно должно совпадать с тем, кторое указано в файле web.xml
type — опять же должно совпадать с тэгом >res-type> из web.xml
username — логин к базе данных
password — пароль
driverClassName — класс драйвера JDBC (мы его можем получить из описанного ранее файла mysql-connector-java-3.1.13-bin.jar). К нему мы чуть позже еще раз вернемся.
maxIdle — максимальное количество незадействованных коннектов — свободных.
maxWait — время (в миллисекундах), в течении которого пул коннектов будет пытаться отдать коннект по запросу прежде чем «выбросит» исключение о недоступности ресурса.
validationQuery — запрос который будет выполнятся для проверки валидности (правильности) коннекта перед отдачей его приложению.
url — URL для соединения — его мы уже использовали
maxActive — максимальное количество акивных коннектов. Если надо будет больше, то остальным придется подождать. (см. параметр maxWait)

Теперь давайте посмотрим на изменения, которые мы сделали в файле ManagementSuystem.java. Сначала я приведу код, а после этого мы рассмотрим наши изменения.

ManagementSystem.java

Самое важное изменение находится в методе getInstance().
Раньше наш класс загружал драйвер и устанавливал соединение. Теперь мы видим, что соединения класс не делает — он только запрашивает ресурс по имени (отметим. что именно по тому имени, которое указано в файла web.xml и context.xml). А уже Tomcat берет на себя все необходимые действия — открывает соединение (несколько штук сразу), проверяет правильность и т.д.

Возможно, что в нашем случае в таком подходе нет необходимости, но это удобно при большом количестве баз данных, коннектов и прочего.

Также надо отметить новый метод – getStudentById(..). Он достаточно очевидный – получаем данные конкретного студента по его ID. Он нам пригодится.

Приведем код нашего сервлета — SimpleList.java

Ну и по традиции добавим код для двух классов — Group.java и Student.java

Group.java

Student.java

Для компиляции наших классов иерархия файлов должна выглядеть так:

Я скопировал файл servlet-api.jar из директории <TOMCAT_HOME>\lib. Так удобнее собирать. Об этом мы говорили в раньше.
Для того, чтобы скомпилировать классы набираем команду (текущая директория та, в которой находится каталог students):

Теперь скопируем все наши файлы в директорию <TOMCAT_HOME>\webapps\studentsApp. Структура файлов в каталоге должна выглядеть так:

Что касается файла 
mysql-connector-java-3.1.13-bin.jar — теперь он должен находится в каталоге <TOMCAT_HOME>\lib.
Если все нормально собралось и скопировалось, то запускаем Tomcat и после старта открываем броузер и набираем строку

По идее мы должны получить список групп из нашей базы. И теперь мы перейдем непосредственно к написанию нашего приложения.

Студенческий отдел кадров — WEB-приложение
В данном приложении автор не собирается делать какие-то супер красивые и удобные HTML-странички. Посему будет все очень просто — во-первыхЮ чтобы было понятнее. Во-вторых — цель проекта познакомиться, а не вдаваться в тонкости GUI.
Давайте перечислим еще раз те формы, котоыре нам потребуются:
1. Главная форма, которая показывает список групп, поле для ввода года и список студентов, соответсвующий выбранной группе и году. В этой же форме можно выполнять удаление студента и удаление всех студентов из выделенной группы.
2. Форма для ввода данных о студенте — мы можем использовать одну форму для добавления и для редактирования.

Давайте немного подробнее опишем эти формы.

Итак — главная форма.

Для ввода года будем использовать обычное текстовое поле — можно с помощью JavaScript проверку корректности, но мы не будем этого делать — упростим все до предела.

Список групп будет обычным выпадающим списком.

Список студентов оформим в виде таблицы где удаление и редактирование мы сделаем просто — каждый студент в списке может быть выделен с помощью радиокнопки (RadioButton). После этого достаточно нажать кнопку — Редактировать, Удалить — и можно посылать команду на сервер.

Форма для редактирования/добавления студента — мы просто перечислим поля. Для поля «Пол» используем радиокнопки, для поля «Группа» — список. Дату будем вводить просто строкой — не будем усложнять.

Разобравшись с формами попробуем набросать список команд. В общем-то он и определит, какие сервлеты нам потребуются. Мы постараемся не делать список слишком длинным, тем более, что те же команды редактирования/добавления студента в общем-то можно свести к одной — если мы передаем ID студента =0, то можно сказать, что надо добавить. Иначе — редактировать.

Итак наш список выглядит следующим образом:
— Показать список студентов для определенного года и определенной группы.
— Удалить студента
— Редактировать/добавить студента

Замечение: Умение правильно проектировать набор нужных сервлетов — дело опыта. Так что проектируйте, делайте, ломайте и заново стройте — после нескольких попыток вы научитесь этому занимательному делу.

Я не буду утверждать, что сделал оптимальный набор — возможно кому-то захочется сделать его более полным, кому-то покажется, что кое-какие команды можно реализовать одним сервлетом. но как сделано — так сделано. Мне важно показать технологию в действии.

Мы будем использовать сервлеты для получения данных, преобразования и потом вызывать JSP для отображения.

Пойдем по порядку — главная форма — MainFrameServlet.
Как уже говорилось в предыдущих частях JSP служит для того, чтобы показать данные которые ей передал сервлет. Профессионалы могут поспорить, но мне важно, чтобы вы поняли вот какой момент — сервлет собирает все данные по разным таблицам, по разным файла и т.д., кладет это все в некоторую структуру и передает JSP, которая занимается тем, что из этой структуры «вытаскивает» нужные данные и кладет их на соотвтествующее место на странице.

Как видите для реализации команды нам надо три компонента:
— сервлет, который выполняет какие-то действия, собирает необходимые нам данные и кладет их в
— структуру, которая содержит все необходимые данные для показа на
— JSP странице, которая «вынимает» из структуры данные и располагает их по странице

Начнем мы со второго пункта — состав структуры достаточно очевиден — год, список групп, ID конкретной группы, список студентов для конкретной группы и данного года. Для всех таких структур создадим новый пакет — students.web.forms.

Мы еще вернемся к этому вопросу, но все-таки предварительного упоминания этот момент заслуживает:

JSP 2.0 и выше используется так называемы «Язык выражений» (ЯВ) или Expression Language (EL) — основная его идея в том, чтобы не писать страшные конструкции типа

<%= request.getParameter(«parameter») %>

ЯВ имеет упрощенный синтаксис обращения к полям объектов, которые находятся в JSP (это как раз наша структура, которая содержит много данных). Писать постоянно формулы и get/set методы не очень интересно и поэтому был сделан ЯВ. В нем обращение к данным гораздо приятнее на вид.
Очень важно учесть, что ЯВ требует правильного именования полей и наличия методов set/get. Чуть ниже приведен код нашей структуры и там можно увидеть как именовать поля и методы доступа к ним.
Т.е. получим вот такой вот класс:

MainFrameForm.java

Код для сервлета нашей главной страницы:

MainFrameServlet.java

Теперь нам необходимо сделать страницу JSP, которая будет нам показывать наши результаты. Эту страницу мы положим в корень каталога для нашего WEB-приложения.

Вам необходимо обратить внимание на следующие моменты:

1.       <%@ taglib prefix=»c» uri=»http://java.sun.com/jsp/jstl/core» %> — команда, которая загружает библиотеку стандартных тэгов – тот самыйJSTL о котором мы говорили в предыдущей части.

2.       Фрагменты из JSP

c:forEach – специальный тэг, который позволяет перебрать элементы коллекции

c:choose – тэг для выбора из вариантов по условию c:when и то, что не подошло будет выполнятеся в теле тэгаc:otherwise

Стоит отметить, что JSTL является достаточно мощным инструментом и я советую Вам потратить время на изучение тэгов. Мне очень понравилась книга
Сью Шпильман.  «JSTL. Практическое руководство для JSP-программистов». Очень кратко, но  по делу

MainFrame.jsp

Теперь рассмотрим код, который необходим для редактирования данных о студенте.

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

StudentForm.java

Теперь код для нашего сервлета, который будет обрабатывать полученные данные.

StudentFrameServlet.java

И наконец JSP для отображения данных.

StudentFrame.jsp

Наш файл web.xml тоже притерпел некоторые изменения – в нем теперь два сервлета.

web.xml

В процессе работы Tomcat не может загрузить библиотеку тэгов JSTL — ее у него нет. Советую найти и загрузить файлы из каталога примеров, который идет вместе с Tomcat — каталог «TOMCAT_HOME/webapps/examples/WEB-INF/lib» — jstl.jar и standard.jar и положить их в <TOMCAT_HOME>\lib (туда, куда мы поместили драйвер для MySQL). Тогда все должно работать хорошо. В принципе можно устанавливать библиотеку вместе с приложением в каталог WEB-INF\lib, но т.к. большинство приложений будет использовать JSTL, то имеет смысл положить библиотеки в общий доступ.

Вот и все, что мне хотелось рассказать о WEB-программировании. Конечно же, мы не смогли просмотреть очень многое, но надеюсь, что Вам стало проще ориентироваться в его многообразии. А пока мы перейдем к несколько иной стороне программирования – к тестированию. Встречайте – Часть 10 — Тестирование с точки зрения разработчика

Я внес исправления и добавил архив с исходным кодом в виде проекта под NetBeans: Исходный код