Статьи

Обзор сервлета 3.0

JSR 315 (Servlet 3.0) является обновлением существующей спецификации Servlet 2.5. Сервлет 3.0 сфокусирован на расширяемости и подключаемости веб-фреймворка, что соответствует целям Java EE 6. Простота разработки (EoD) будет поддерживаться с использованием новых языковых функций. Эталонная реализация доступна в ночной сборке GlassFish v3 . Общественный обзор содержит:

  • Pluggability
  • EoD
  • Асинхронная поддержка
  • Улучшения безопасности
  • Разные Изменения

В этой статье мы познакомим вас с тем, что происходит со спецификацией Servlet 3.0, и дадим более подробную информацию о том, что включено.

Примечание: эта статья соответствует публичному рассмотрению спецификации. Поскольку это еще не окончательно, некоторые вещи могут измениться.

Экспертная группа

Раджив Мордани из Sun Microsystems — ведущий специалист по спецификации в группе экспертов, состоящей из многих наиболее узнаваемых имен в сообществе Java:

  • Adobe Systems Inc.
  • Apache Software Foundation
  • BEA Systems
  • Ericsson AB
  • Google Inc.
  • Охотник, Джейсон
  • IBM
  • Icesoft Technologies Inc
  • NCsoft Corporation
  • оракул
  • Pramati Technologies
  • Прасанна, Дханджи Р.
  • SAP AG
  • Корабль, Говард М. Льюис
  • Сулейман, Хани
  • Sun Microsystems, Inc.
  • Tmax Soft, Inc.
  • Уокер, Джо
  • Уилкинс, Грегори Джон

Pluggability

В связи с популярностью множества различных веб-фреймворков Servlet 3.0 облегчит использование и настройку фреймворка для разработчиков. Так что если вы хотите добавить в Struts или Spring Web Flow, это будет легко сделать.

  • Методы добавления сервлетов и фильтров

    Если ServletContextListener зарегистрирован и хочет добавить сервлет или фильтр, то во время инициализации контекста событие, которое вызывается для прослушивателя, может добавить сервлеты и фильтры в контекст. Это методы addServlet и addFilter. Более подробную информацию можно найти на сайте JCP по адресу  http://jcp.org/aboutJava/communityprocess/pr/jsr315/index.html .

  • Веб-фрагменты

    Вместо того, чтобы иметь только один монолитный файл web.xml, который используется разработчиком для объявления сервлетов, фильтров и другой конфигурации для использования платформы, платформа теперь может включать в себя web-фрагмент.xml со всей своей конфигурацией.

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

    Большим преимуществом этого является то, что поставщики библиотек могут предоставить свой собственный фрагмент web.xml для использования в вашем веб-приложении.

Легкость развития

Для упрощения разработки в Servlet 3.0 было определено несколько новых аннотаций, позволяющих писать сервлет без использования дескриптора. Эти аннотации находятся в пакете javax.servlet.annotation. Благодаря добавлению аннотаций теперь возможно иметь Servlet, Filter и ServletContextListener в файле war без web.xml.

Важно отметить, что это делает web.xml необязательным, а не избыточным. Пользователь web.xml может переопределять метаданные, указанные в аннотациях.

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

Давайте подробнее рассмотрим аннотации, представленные в спецификации Servlet 3.0:

Сервлет Аннотация

В Servlet 3.0 метаданные сервлета можно указывать с помощью @WebServlet

@WebServlet(name="mytest", 
urlPatterns={"/myurl"}, 
initParams={ @InitParam(name="n1", value="v1"), @InitParam(name="n2", value="v2") }) 
public class TestServlet extends javax.servlet.http.HttpServlet { 
.... 
} 

TestServlet расширяет HttpServlet, в то время как предоставленные метаданные соответствуют web.xml следующим образом:

параметр

Параметр аннотации

web.xml

Имя сервлета

имя =

<Сервлет> <имя сервлета>

Шаблон URL

urlPatterns = {}

<Сервлет-отображение>

Параметры инициализации

InitParams = {@InitParam {name = ””, value = ””}

<Сервлет>

<Init-пары>

<param-name> .. </ param-name>

<param-value> .. </ param-value>

<Init-пары>

 

Фильтр сервлетов Аннотация

Метаданные ServletFilter указываются с помощью аннотации @ServletFilter.

public void doFilter(ServletRequest req, ServletResponse res, FilterChain chain) throws IOException, ServletException { 
.... 
} 

public void destroy() { 
.... 
} 
} 

параметр

Параметр аннотации

web.xml

Шаблон URL

urlPatterns = {}

<Сервлет-отображение>

Параметры инициализации

InitParams = {@InitParam {name = ””, value = ””}

<Сервлет>

<Init-пары>

<param-name> .. </ param-name>

<param-value> .. </ param-value>

<Init-пары>

 

Аннотация слушателя контекста сервлета

ServletContextListener просто помечается @WebServletContextListener вместо того, чтобы указывать его в файле web.xml.

@WebServletContextListener 
public class TestServletContextListener implements javax.servlet.ServletContextListener { 
.... 
public void contextInitialized(ServletContextEvent sce) { 
.... 
} 

public void contextDestroyed(ServletContextEvent sce) { 
.... 
} 
} 

Асинхронная поддержка

Самым большим изменением в спецификации является добавление асинхронной обработки. Основные случаи для покрытия были:

  • Ожидание доступности ресурса, такого как JDBC или вызова веб-службы.

  • Генерация ответа асинхронно

  • Использование существующих структур для генерации ответов после ожидания завершения асинхронной операции.

В то время как ранний черновик имел приостановку и возобновление, последняя спецификация имеет два варианта метода startAsync () в ServletRequest .

Один ( startAsync () ) не принимает параметров и инициализирует AsyncContext с исходным запросом и ответом. Другой ( startAsync ()) принимает запрос и ответ в качестве параметра для инициализации AsyncContext .

Сервлеты ( @WebServlet ) и Фильтры ( @ServletFilter ), поддерживающие асинхронную обработку, необходимо аннотировать с помощью набора атрибутов supportAsync . Запрещается вызывать startAsync, если у вас есть сервлет или фильтр, который не поддерживает асинхронную обработку где-либо в цепочке обработки запросов.

Это также AsyncListener, который можно зарегистрировать для получения уведомления о тайм-ауте и завершении асинхронной обработки запроса. Этот слушатель может быть использован для очистки ресурсов, если для создания его AsyncContext использовался упакованный запрос и ответ .

Вы можете пересылать запросы обратно в контейнер , используя AsyncContext.forward(path)и AsyncContext.forward()методы , так как рамки JSP может создать ответ.

Улучшения безопасности

HTTPServletRequestбудет расширен методами, позволяющими программный вход в систему и выход из системы, а ServletRequestтакже возможность принудительного входа в систему. Метод выхода из системы позволит приложению сбросить состояние проверки подлинности запроса, не требуя привязки проверки подлинности к HTTPSession.

Вывод

Проект только начинает внедряться в Glassfish v3. Спецификация будет обязательной частью Java EE 6, и, следовательно, все описанные выше функции будут доступны во всех Java EE 6-совместимых контейнерах. Наличие различных функций, описанных выше, значительно облегчит разработку веб-приложений на Java.

Спасибо Радживу Мордани за его вклад в эту статью, а также Шинг Ваю и Яну Люэ за фрагменты кода.