Ответ 1
ОБНОВЛЕНИЕ
Так же, как обновление и более явное, это основные различия между сервлетами 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(Pluggability)
- В сервлетах 2.5 есть только один монолитный web.xml файл.
- В сервлетах 3 каждая "загружаемая" банка может иметь web-fragment.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()
.
Подробнее см. API Java EE 6.