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