Сервлеты Java EE фактически используются напрямую? - PullRequest
9 голосов
/ 13 мая 2011

Я просто пытаюсь начать работу с Java EE и сопутствующими концепциями. Однако у меня возникают проблемы с пониманием связи между некоторыми технологиями и их ролью.

Насколько я понимаю, сервлет Java EE - это класс Java, который работает внутри сервера и генерирует ответы на запросы (обычно ответы HTML на HTTP-запросы, хотя сервлеты теоретически могут обслуживать любой протокол).

Мои вопросы:

  • Насколько я понимаю, я могу либо написать класс сервлета напрямую, либо использовать какую-то технологию, например JSP или JSF, которая затем сгенерирует / предоставит мне сервлет. В любом случае, веб-контейнер Java EE (например, Apache Tomcat), в котором я в конечном итоге запускаю свое приложение, будет видеть только сервлеты и не будет заботиться о том, как они были созданы (поэтому сервлеты являются своего рода низкоуровневым каналом). Это правда?
  • Если сервлеты являются низкоуровневыми, есть ли причина использовать сервлеты напрямую? Я видел много учебников, которые объясняют, как написать сервлет, но это кажется довольно непрактичным. Есть ли ситуация, когда написание сервлета напрямую / предпочтительнее использования JSP или аналогичного?
  • Наконец, сервлетам нужен сервер для запуска (например, Apache Tomcat). Читая о серверах в этом контексте, я видел различные имена, такие как (Java EE) веб-контейнер или контейнер сервлета , или JSP-контейнер , или просто сервер Java EE . Все эти термины означают одно и то же или есть разница?

Спасибо за помощь в начале работы!

Ответы [ 5 ]

12 голосов
/ 13 мая 2011

Когда не используется инфраструктура MVC, такая как JSF, Spring MVC, Struts и т. Д., Вам все еще нужен сервлет для выполнения основной работы по контролю запросов / ответов.JSP, в то время как под обложками действительно компилируются в сервлеты, должны использоваться только как представление, а не как контроллер.

Я думаю, что ваша путаница вызвана относительно большим количеством некачественных учебных пособий о сервлетах, где они находятся.использовался для печати простого HTML с помощью операторов out.print().Это с точки зрения MVC совершенно неправильно.Я бы предложил начать с нашей вики-страницы: https://stackoverflow.com/tags/servlets/info

5 голосов
/ 13 мая 2011
  1. JSP и JSF - это технологии уровня представления. Хотя верно то, что JSP скомпилированы в сервлеты и что вы даже можете писать простой Java-код внутри JSP, это крайне плохой стиль кодирования. Как правило, ваши JSP-файлы не должны содержать никакого кода Java и не должны выполнять такие операции, как запрос к базе данных вашего сервера или непосредственный просмотр параметров запроса. Все это должно быть выполнено в отдельном сервлете (или, если вы используете веб-фреймворк, то абстракция сервлета вашего фреймворка) до попадания в JSP.

  2. В типичном случае кодирование сервлета для каждого запроса, который вы хотите обслуживать, нецелесообразно. Большинство веб-фреймворков Java полностью абстрагируют интерфейс Servlet, так что вы можете создать полноценное веб-приложение, даже не применяя Servlet напрямую. Однако могут быть уникальные случаи, когда наиболее эффективно обходить веб-инфраструктуру и предоставлять сервлет, обеспечивающий некоторые специальные функции.

  3. Они очень похожи, правда. Все они являются сервлет-контейнерами. Некоторые из них могут также включать другие функции Java EE, помимо поддержки сервлетов. Наличие контейнера сервлета не гарантирует поддержку дополнительных функций Java EE, но наличие контейнера Java EE гарантирует поддержку сервлетов.

3 голосов
/ 13 мая 2011

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

Сервлеты низкого уровня.Это базовая абстракция, на которой основаны все остальные веб-фреймворки Java EE.В «реальном мире» большую часть времени люди будут использовать некую платформу более высокого уровня, а не сырой сервлет.

Тем не менее, сервлеты все еще полезны, когда вы действительно хотите добраться до этого «голого металла»Интерфейс для HTTP-запроса (также как и для Servlets).Для простых вещей просто написать сервлет, чем создать кучу фреймворков и т. Д.

Что касается контейнеров, то в основном различие заключается в том, что сервер Java EE отличается от контейнера или сервера сервлетов.Tomcat НЕ является сервером Java EE, он обрабатывает только веб-часть стека Java EE.Чтобы запутать вещи, Java EE 6 теперь имеет «веб-профиль», который по сути является стеком сервлетов, но если раньше контейнер сервлетов нельзя было рассматривать как «сервер Java EE», то теперь он может быть «сервером Java EE».- Веб-профиль ".

Да, я тоже не знаю, что это значит.

Ключевое отличие состоит в том, что контейнеры сервлетов (Tomcat, Jetty, Resin) не поставляются в комплекте состальная часть стека Java EE (в частности, EJB), но имеет несколько других компонентов, которые являются частью общего стека Java EE.

Если вы только переходите к Java EE, я бы выбрал полную лодкуКонтейнер (как Glassfish), так как а) вы можете, б) это легко (GF тривиально настроить) и, в) вам не придется во-вторых угадывать, что входит или не входит в ваш контейнер, по сравнению с тем, что вы читаетео требует.У GF будет «все», что есть Java EE.Например, у него не будет Spring, так как это не Java EE, но если он есть в вашей книге по Java EE или статье на веб-сайте, GF будет иметь его.

Позже вы сможете выбрать, когда вы захотите полный комплектили просто хотите использовать что-то вроде Tomcat или нет.

2 голосов
/ 13 мая 2011

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

Знание - сила, чтобы ответить на ваш второй вопрос.Так что хорошая идея знать, что делают сервлеты;это может только помочь.Если вам когда-либо понадобится дополнить вашу базовую среду, вы можете работать на уровне сервлета - вы можете сделать это и для устранения проблем.

Сервлеты работают в контейнерах сервлетов.Существуют технические различия между контейнером сервлета и контейнерами Java EE.Вы можете иметь первое без второго, но вы не можете иметь второе без первого (я думаю).Сервлеты являются частью стека Java EE.Другими частями являются такие вещи, как JMS (обмен сообщениями) и JMX (расширения управления), среди прочих.

1 голос
/ 10 июня 2011

Фреймворки, такие как JSF, JSP, Struts и т. Д., Внутренне зависят от спецификации сервлета. Эти рамки построены только на основе сервлетов.

...