вівторок, 10 червня 2008 р.

Введение в технологию Java Servlet

Что делает сервлет?

Когда вы работаете с интерактивным 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. Естественно, бизнес-логика реализована в коде сервлета. Вы не должны беспокоиться о низкоуровневых операциях, которые выполняются, пока что-то не перестает работать правильно.

К сожалению, что-то перестает работать правильно удручающе часто, особенно при настройке сервлета. Самым большим источником головной боли при создании приложений с сервлетами являются конфигурационные файлы. Их нельзя эффективно отлаживать. Настраивать их на правильную работу вы должны методом проб и ошибок, путем расшифровки сообщений об ошибках, которые можете увидеть (а может и нет) в вашем браузере.

Объявление класса

Сервлет - это класс, поэтому давайте создадим его. В Eclipse создайте класс с именем HelloWorldServlet в вашем проекте HelloWorld. Он должен выглядеть примерно так:

public class HelloWorldServlet extends HttpServlet {

public void service(HttpServletRequest request,
HttpServletResponse response)
throws ServletException, IOException {
PrintWriter writer = response.getWriter();
writer.println("Hello, World!");
writer.close();
}
}

Введите этот код, затем нажмите Ctrl+Shift+O для ввода ваших выражений import. Eclipse должен выбрать импорт следующих классов:

  • java.io.IOException
  • java.io.PrintWriter
  • javax.servlet.ServletException
  • javax.servlet.HttpServlet
  • javax.servlet.HttpServletRequest
  • javax.servlet.HttpServletResponse

Обратите внимание на то, что мы создали подкласс HttpServlet и переопределили метод service(). Метод service() является самым главным методом обработки, который механизм сервлетов будет вызывать в цикле жизни нашего сервлета. Он принимает конверт запроса и конверт ответа, к которым мы можем обратиться в нашем методе. Однако в данном случае нам не нужно этого делать, поскольку мы делаем только самое основное для того, чтобы сервлет заработал. Мы могли бы переопределить метод doGet(), но service() дает все, что нам надо.

В нашем методе service() мы вызвали getWriter() нашего конверта ответа, для того чтобы разрешить вывод строкового литерала в поток. Затем мы закрыли поток. Это типично для сервлетов, выполняющих вывод информации: вы выполняете необходимую логику, а затем пишете результаты в выходной поток.

Настройка web-приложения

Работа по Java-программированию сделана, теперь мы должны выполнить необходимую работу с конфигурационными файлами. По моему мнению, это самая большая головная боль Web-разработки. К счастью, подключаемый модуль Tomcat в определенной степени облегчает ее.

Нажмите правой кнопкой мыши на проекте HelloWorld и выберите Properties. Выберите категорию Tomcat для свойств. Вы должны увидеть контекст проекта, который выглядит примерно так:

/HelloWorld

Теперь посмотрите на файловую систему в вашем домашнем каталоге Tomcat. Прокрутите список вниз до каталога conf/Catalina/localhost. В нем вы должны увидеть набор XML-файлов. В частности, вы должны увидеть файл HelloWorld.xml. Откройте его. Этот файл определяет контекст Web-приложения для Tomcat.



<Context path="/HelloWorld" reloadable="true"
docBase="path to your project\HelloWorld"
workDir="path to your project\HelloWorld\work" />

Во время запуска Tomcat читает эти файлы контекста, для того чтобы проинформировать контейнер сервлетов, где искать ваши классы (которые содержат ваши сервлеты). Если вы снова посмотрите на выражения INFO, которые отображает Tomcat в консоли при загрузке, то увидите информацию о контексте вашего Web-приложения в списке.

Последним шагом для настройки вашего Web-приложения в Tomcat является создание файла web.xml, который должен размещаться в каталоге WEB-INF вашего проекта. Примечание: Не помещайте его в каталог WEB-INF/src - он служит для других целей. Вот как примерно должен выглядеть файл для данного простого примера:




<!DOCTYPE web-app PUBLIC '-//Sun Microsystems, Inc.//DTD
Web Application 2.3//EN' 'http://java.sun.com/dtd/web-app_2_3.dtd'>
<web-app>
<servlet>
<servlet-name>hello</servlet-name>
<servlet-class>HelloWorldServlet</servlet-class>

</servlet>

<servlet-mapping>
<servlet-name>hello</servlet-name>
<url-pattern>/hello</url-pattern>
</servlet-mapping>

</web-app>


Этот файл определяет ваше Web-приложение для Tomcat. Элемент servlet-name называет ваш сервлет для использования в этом файле. Элемент servlet-class отображает это имя в конкретный класс, определяющий сервлет - HelloWorldServlet в нашем примере. Элемент servlet-mapping указывает Tomcat, что URL (в нашем случае) /hello отображается в наш сервлет, определенный отображенным классом сервлета.

Если у нас имеется этот файл в нужном месте, то мы можем активизировать Tomcat и увидеть загрузку нашего сервлета.

Выполнение сервлета

Как я уже упоминал, "выполнение сервлета" заключается в запуске Tomcat и указании в Web-браузере URL для его активизации. Запустите Tomcat , используя соответствующую кнопку на панели инструментов (если Tomcat уже работает, необходимо остановить и запустить его повторно). После завершения загрузки Tomcat запустите Web-браузер и введите следующий URL:

http://localhost:8080/HelloWorld/hello
Вы должны увидеть приветствие в вашем браузере.



Немає коментарів: