Java сервлеты
Что делает сервлет?
Когда вы работаете с интерактивным Web-сайтом, все, что вы видите, отображается в браузере. За кулисами процесса Web-сервер принимает от вас запросы во время сессии, возможно, передает их в другой код (возможно, другим серверам) для обработки запроса и обращения к данным, а также генерирует результаты для отображения в браузере.
Сервлет - это диспетчер процесса. Он находится на Web-сервере и обрабатывает входящие запросы и исходящие ответы. Вообще говоря, он не имеет ничего общего с представлением и, в действительности, не должен иметь. Вы можете использовать сервлет для записи в поток, который добавляет содержимое к Web-странице, но это, обычно, не очень хорошая идея, поскольку происходит смешение логики представления и бизнес-логики.
Альтернативы сервлетам
Сервлеты не являются единственным методом работы с Web-страницами. Одной из самых ранних технологий для этой цели являлся CGI (common gateway interface), но он инициализировал отдельный процесс для каждого запроса, что не было очень эффективно. Существовали также патентованные серверные расширения, например Netscape Server API (NSAPI), но они были, да-да, патентованными. В мире Microsoft существует стандарт ASP (active server pages). Сервлеты являются альтернативой всем этим технологиям и предлагают несколько преимуществ:
Они также платформо-независимы, как язык Java.
Они предоставляют полный доступ ко всем API языка Java, включая библиотеки для доступа к данным (например, JDBC).
Они (в большинстве случаев) в своей основе более эффективны, чем CGI, поскольку сервлеты порождают новые субпроцессы (thread) для запросов, а не отдельные процессы.
Существует распространенная отраслевая поддержка сервлетов, включая контейнеры для наиболее популярных Web-серверов и серверов приложений. Сервлеты являются мощным дополнением к инструментальным средствам профессионального программиста.
Но что такое сервлет?
Большинство Java-сервлетов, с которыми вы столкнетесь как профессиональный программист, предназначены для ответов на HTTP-запросы в контексте Web-приложения. Следовательно, вы должны знать HTTP-классы из пакетов javax.servlet и javax.servlet.http.
При создании Java-сервлета обычно создается подкласс HttpServlet. Этот класс имеет методы, предоставляющие доступ к конвертам запроса и ответа для обработки запросов и создания ответов.
HTTP-протокол, естественно, не связан с Java. Это просто спецификация, определяющая, какими должны быть запросы и ответы. Классы Java-сервлетов заключают эти низко-уровневые конструкции в Java-классы, имеющие удобные методы, которые облегчают работу с этими конструкциями в контексте языка Java. Когда пользователь инициирует запрос через URL, классы Java-сервлетов преобразуют их в HttpServletRequest и передают адресату, указанному в URL, как определено в конфигурационных файлах конкретного контейнера сервлетов, который вы используете. Когда сервер завершает свою работу с запросом, Java Runtime Environment упаковывает результаты в HttpServletResponse и затем передает HTTP-ответ обратно клиенту, пославшему запрос. Взаимодействуя с Web-приложением, вы обычно посылаете несколько запросов и получаете несколько ответов. Все они работают в контексте сессии, которая в языке Java заключается в объект HttpSession. Вы можете обратиться к этому объекту при обработке запросов и добавить что-нибудь к нему при создании ответов. Он обеспечивает некоторого рода контекст кросс-запросов.
Контейнер, например Tomcat, управляет средой исполнения для сервлетов. Вы можете настроить способ функционирования J2EE-сервера и должны настроить его для отображения ваших сервлетов внешнему миру. Как мы увидим в дальнейшем, используя различные конфигурационные файлы контейнера, вы обеспечиваете мост от URL (введенного пользователем в браузере) к серверным компонентам, обрабатывающим запрос, в который транслируется URL. Во время работы вашего приложения контейнер загружает и инициализирует ваш сервлет (сервлеты) и управляет его жизненным циклом.
Когда мы говорим о том, что сервлеты имеют жизненный цикл, это просто означает, что при активизации сервлета все работает предсказуемо. Другими словами, для любого создаваемого вами сервлета всегда будут вызываться определенные методы в определенном порядке. Вот обычный сценарий:
Пользователь вводит URL в браузере. Конфигурационный файл вашего Web-сервера указывает, что этот URL предназначен для сервлета, управляемого контейнером сервлетов на вашем сервере.
Если экземпляр сервлета еще не был создан (существует только один экземпляр сервлета для приложения), контейнер загружает класс и создает экземпляр объекта.
Контейнер вызывает метод init() сервлета.
Контейнер вызывает метод service() сервлета и передает HttpServletRequest и HttpServletResponse.
Сервлет обычно обращается к элементам запроса, передает запрос другим серверным классам для выполнения запрошенной службы и для доступа к таким ресурсам, как базы данных, а затем создает ответ, используя эту информацию.
При необходимости, когда сервлет выполнил полезную работу, контейнер вызывает метод destroy() сервлета для его финализации.
Как "запустить" сервлет?
"Выполнение" сервлета аналогично выполнению Java-программы. Если вы настроили ваш контейнер, и он знает о вашем сервлете, а также знает, что для определенных URL контейнер должен активизировать сервлет, контейнер будет вызывать методы жизненного цикла сервлета в предопределенном порядке. Поэтому выполнение сервлета, в сущности, означает его корректную настройку и указание в браузере нужного URL. Естественно, бизнес-логика реализована в коде сервлета. Вы не должны беспокоиться о низкоуровневых операциях, которые выполняются, пока что-то не перестает работать правильно.
К сожалению, что-то перестает работать правильно удручающе часто, особенно при настройке сервлета. Самым большим источником головной боли при создании приложений с сервлетами являются конфигурационные файлы. Их нельзя эффективно отлаживать. Настраивать их на правильную работу вы должны методом проб и ошибок, путем расшифровки сообщений об ошибках, которые можете увидеть (а может и нет) в вашем браузере.
|