UPDATE
В качестве обновления и, если быть более точным, это основные различия между сервлетами 2.5 и 3 (я не пытаюсь быть исчерпывающим, я просто упоминаю самые интересные части):
Аннотации для объявления сервлетов, фильтров и слушателей (простота разработки)
В сервлетах 2.5, чтобы объявить сервлет с одним параметром init, необходимо добавить его в 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 каждый «загружаемый» jar может иметь web-frag.xml в своем каталоге META-INF , определяющем сервлеты, фильтры и т. Д. Это позволяет библиотекам и фреймворки для указания своих собственных сервлетов или других объектов.
Динамическая регистрация сервлетов, фильтров и прослушивателей во время инициализации контекста (Pluggability)
В сервлетах 3 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();
// no async support, thread will be free when runSlowProcess() and
// doGet finish
// ...
}
}
Сервлеты 3:
@WebServlet(name="myServlet",
urlPatterns={"/mySlowProcess"},
asyncSupported=true) // asyncSupported MUST be specified for
// servlets that support asynchronous
// processing
public class MyAwesomeServlet extends HttpSerlvet {
@Override
public void doGet(HttpServletRequest request, HttpServletResponse response) {
// an AsyncContext is created, now the response will be completed
// not when doGet finalizes its execution, but when
// myAsyncContext.complete() is called.
AsyncContext myAsyncContext = request.startAsync(request, response);
// ...
// myAsyncContext is passed to another thread
delegateExecutionToProcessingThread(myAsyncContext);
// done, now this thread is free to serve another request
}
}
// ... and somewhere in another part of the code:
public class MyProcessingObject {
public void doSlowProcess() {
// ...
runSlowProcess();
myAsyncContext.complete(); // request is now completed.
// ...
}
}
Интерфейс AsyncContext
также имеет методы для получения объекта запроса, объекта ответа и добавления прослушивателей, чтобы уведомить их о завершении процесса.
Программный вход и выход (улучшения безопасности)
В сервлетах 3, в интерфейс HttpServletRequest
добавлено два новых метода: login(username, password)
и logout()
.
Для получения более подробной информации, ознакомьтесь с Java EE 6 API .