Які відмінності між Сервлетом 2.5 та 3?


92

Я прокачую код J2EE, який відповідає Сервлету 2.5, і мені цікаво, в чому полягають основні відмінності між 2.5 і 3. Вказівки на офіційні документи Sun та особистий досвід є найбільш вдячними.

Якщо я поки що не маю стосунку з 3, просто скажи так. Дякую!


2
+1 Просто чекаю відповідей :)
ATorras

Відповіді:


149

ОНОВЛЕННЯ

Подібно до оновлення і, якщо бути більш явним, це основні відмінності між сервлетами 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 .


3
Варто згадати, що Servlet 3.0 був випущений ще в грудні 2009 року. Питання та відповідь, прийнята на даний момент, передували цим.
eis

1
@ServletFilter@WebFilterта @WebServletContextListener@WebListenerв офіційних специфікаціях AFAICT.
лапо

21

Сервлет 3.0 ще не вийшов, але, схоже, він дуже близько. Найважливішими змінами в 3.0 є: підключення, простота розробки, асинхронний сервлет, безпека. Чи важливі вони для вас чи ні, мені неможливо сказати.

Найбільш значущим з них є, мабуть, підтримка асинхронних сервлетів. Ось стаття, яка детально описує це. Повну специфікацію можна завантажити тут .


Святе лайно, це здорово. Асинхронний матеріал виглядає чудово, дякую за інформацію. Я щойно закінчив кодування чогось дуже подібного до цього.
Макс А.

@adi це було випущено в грудні 2009 р. ( jcp.org/aboutJava/communityprocess/final/jsr315 )
mauhiz

4
ОНОВЛЕННЯ Servlet 3.1 специфікація випущена 2013-05. Подивіться, що нового .
Василь Бурк

13

Як згадував Дон, основними напрямками вдосконалень та доповнень є:

  • Підключення (модулярізація web.xml)
  • Простота розробки (анотації, дженерики, домовленість щодо конфігурації)
  • Підтримка асинхронного сервлету (для програмування в стилі комети, асинхронного веб-проксі, асинхронних веб-служб)
  • Покращення безпеки (програмний вхід / вихід)
  • Інші (файли cookie HttpOnly, відстеження сеансів, EJB у файлі WAR)

Перегляньте презентацію Javaone 2008 " API Java Servlet 3.0: Що нового та захоплюючого ", щоб отримати докладні відомості.


Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.