Каковы различия между сервлетами 2.5 и 3?

Я запускаю J2EE-код, который придерживается Servlet 2.5, и мне интересно, какие основные отличия между 2.5 и 3. Наиболее ценятся указатели на официальные документы Sun и личные впечатления.

Если я пока не буду относиться к себе с 3, просто скажите это. Спасибо!

Ответ 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.

Ответ 2

Servlet 3.0 еще не выпущен, но он выглядит очень близко. Наиболее важными изменениями в 3.0 являются: Возможность подключения, Простота разработки, Async Servlet, Безопасность. Независимо от того, важны ли они для вас, я не могу сказать.

Наиболее значимыми из них, вероятно, являются поддержка асинхронных сервлетов. Здесь статья, которая описывает это подробно. Полная спецификация может быть загружена здесь.

Ответ 3

Как упоминал Дон, основными областями усовершенствований и дополнений являются:

  • Взаимозаменяемость (модуляция web.xml)
  • Простота разработки (аннотации, дженерики, согласование по конфигурации)
  • Поддержка сервлета Async (для программирования стиля комет, асинхронного веб-прокси, асинхронных веб-сервисов).
  • Улучшения безопасности (программный вход/выход из системы)
  • Другие (HttpOnly Cookie, отслеживание сеансов, EJB в файле WAR)

Ознакомьтесь с презентацией Javaone 2008 Java Servlet 3.0 API: что нового и интересного" для деталей.