ОНОВЛЕННЯ
Подібно до оновлення і, якщо бути більш явним, це основні відмінності між сервлетами 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 кожна «завантажувана» банка може мати web-fragment.xml у своєму каталозі META-INF із зазначенням сервлетів, фільтрів тощо. Це дозволяє бібліотекам та фреймворкам визначати власні сервлети чи інші об’єкти.
Динамічна реєстрація сервлетів, фільтрів та прослуховувачів під час ініціалізації контексту (підключення)
У сервлетах 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();
// 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 .