Каковы различия между сервлетом 2.5 и 3? - PullRequest
87 голосов
/ 28 октября 2009

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

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

Ответы [ 4 ]

140 голосов
/ 12 августа 2013

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 .

21 голосов
/ 28 октября 2009

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

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

13 голосов
/ 28 октября 2009

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

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

Подробнее см. Презентацию Javaone 2008 " API Java Servlet 3.0: что нового и интересного ".

1 голос
/ 07 января 2016

По этой ссылке будет достаточно информации о Сервлете 3

Сервлет 3 поддерживает аннотацию для исключения web.xml

@WebServlet
@WebServletContextListener
@ServletFilter
@InitParam
...