ОБНОВИТЬ
В качестве обновления и, чтобы быть более точным, это основные различия между сервлетами 2.5 и 3 (я не пытаюсь быть исчерпывающим, я просто упоминаю наиболее интересные части):
Аннотации для объявления сервлетов, фильтров и слушателей (простота разработки)
В сервлетах 2.5, чтобы объявить сервлет с одним параметром инициализации, вам нужно добавить это в web.xml :
<servlet>
<servlet-name>myServlet</servlet-name>
<servlet-class>my.server.side.stuff.MyAwesomeServlet</servlet-class>
<init-param>
<param-name>configFile</param-name>
<param-value>config.xml</param-value>
</init-param>
</servlet>
<servlet-mapping>
<servlet-name>myServlet</servlet-name>
<url-pattern>/path/to/my/servlet</url-pattern>
</servlet-mapping>
В сервлетах 3 web.xml является необязательным, и вы можете использовать аннотации вместо XML. Тот же пример:
@WebServlet(name="myServlet",
urlPatterns={"/path/to/my/servlet"},
initParams={@InitParam(name="configFile", value="config.xml")})
public class MyAwesomeServlet extends HttpServlet { ... }
Для фильтров вам нужно добавить это в web.xml в сервлетах 2.5:
<filter>
<filter-name>myFilter</filter-name>
<filter-class>my.server.side.stuff.MyAwesomeServlet</filter-class>
</filter>
<filter-mapping>
<filter-name>myFilter</filter-name>
<url-pattern>/path/to/my/filter</url-pattern>
</filter-mapping>
Эквивалентно использованию аннотаций в сервлетах 3:
@ServletFilter(name="myFilter", urlPatterns={"/path/to/my/filter"})
public class MyAwesomeFilter implements Filter { ... }
Для слушателя (в данном случае ServletContextListener) в сервлетах 2.5:
<listener>
<listener-class>my.server.side.stuff.MyAwesomeListener</listener-class>
</listener>
То же самое с аннотациями:
@WebServletContextListener
public class MyAwesomeListener implements ServletContextListener { ... }
Модуляризация web.xml (возможность расширения)
- В сервлетах 2.5 есть только один монолитный файл web.xml .
- В сервлетах 3 каждая «загружаемая» банка может иметь в своем каталоге META-INF файл web-fragment.xml, определяющий сервлеты, фильтры и т. Д. Это позволяет библиотекам и фреймворкам определять свои собственные сервлеты или другие объекты.
Динамическая регистрация сервлетов, фильтров и слушателей во время инициализации контекста (возможность подключения)
В сервлетах 3, A ServletContextListener
может добавить динамически сервлеты, фильтры и слушателей с использованием следующих методов добавлены SevletContext
: addServlet()
, addFilter()
иaddListener()
Асинхронная поддержка
Пример: предположим, что некоторый контейнер сервлетов имеет пять потоков в своем пуле потоков, и существует трудоемкий процесс, который должен выполняться для каждого запроса (например, сложный запрос SQL).
С сервлетами 2.5 в этом контейнере сервлетов закончились бы доступные потоки, если бы он получил пять запросов одновременно и пять доступных потоков не начали бы выполнять процесс, потому что потоки не вернутся, пока service()
(или doGet()
, doPost()
и т. Д.) Не будут выполнены с самого начала. до конца и возвращает ответ.
С сервлетами 3.0 этот длительный процесс можно делегировать другому потоку и завершить его service()
до отправки ответа (теперь ответ будет отправлен последним потоком). Таким образом, поток может получать новые ответы.
Пример асинхронной поддержки:
Сервлеты 2.5:
public class MyAwesomeServlet extends HttpSerlvet {
@Override
public void doGet(HttpServletRequest request, HttpServletResponse response) {
runSlowProcess();
}
}
Сервлеты 3:
@WebServlet(name="myServlet",
urlPatterns={"/mySlowProcess"},
asyncSupported=true)
public class MyAwesomeServlet extends HttpSerlvet {
@Override
public void doGet(HttpServletRequest request, HttpServletResponse response) {
AsyncContext myAsyncContext = request.startAsync(request, response);
delegateExecutionToProcessingThread(myAsyncContext);
}
}
public class MyProcessingObject {
public void doSlowProcess() {
runSlowProcess();
myAsyncContext.complete();
}
}
В интерфейсе AsyncContext
также есть методы для получения объекта запроса, объекта ответа и добавления слушателей, чтобы уведомить их о завершении процесса.
Программный вход и выход из системы (улучшения безопасности)
В сервлетах 3 в интерфейс HttpServletRequest
были добавлены два новых метода: login(username, password)
и logout()
.
Для получения дополнительных сведений см. API Java EE 6 .