В чем разница между Servlet 2.5 и 3?

92

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

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

Макс А.
источник
2
+1 Просто жду ответов :)
ATorras

Ответы:

150

ОБНОВИТЬ

В качестве обновления и, чтобы быть более точным, это основные различия между сервлетами 2.5 и 3 (я не пытаюсь быть исчерпывающим, я просто упоминаю наиболее интересные части):

Аннотации для объявления сервлетов, фильтров и слушателей (простота разработки)

В сервлетах 2.5, чтобы объявить сервлет с одним параметром инициализации, вам нужно добавить это в 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 каждая «загружаемая» банка может иметь в своем каталоге META-INF файл web-fragment.xml, определяющий сервлеты, фильтры и т. Д. Это позволяет библиотекам и фреймворкам определять свои собственные сервлеты или другие объекты.

Динамическая регистрация сервлетов, фильтров и слушателей во время инициализации контекста (возможность подключения)

В сервлетах 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.
Lapo
21

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

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

Dónal
источник
Черт возьми, это здорово. Асинхронный материал выглядит потрясающе, спасибо за информацию. Я только что закончил кодировать что-то очень похожее на это.
Макс А.
@adi, он был выпущен в декабре 2009 г. ( jcp.org/aboutJava/communityprocess/final/jsr315 )
mauhiz
4
ОБНОВЛЕНИЕ Спецификация сервлета 3.1 выпущена в 2013-05. Узнай, что нового .
Basil Bourque
13

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

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

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

Паскаль Тивент
источник