Я прокручиваю код J2EE, который соответствует сервлету 2.5, и мне интересно, в чем основные различия между 2.5 и 3. Указатели на официальные документы Sun и личный опыт приветствуются больше всего.
Если я пока не должен беспокоиться о 3, просто скажи об этом. Благодарность!
java
servlets
jakarta-ee
Макс А.
источник
источник
Ответы:
ОБНОВИТЬ
В качестве обновления и, чтобы быть более точным, это основные различия между сервлетами 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 (возможность расширения)
Динамическая регистрация сервлетов, фильтров и слушателей во время инициализации контекста (возможность подключения)
В сервлетах 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 .
источник
@ServletFilter
→@WebFilter
и@WebServletContextListener
→@WebListener
в официальных спецификациях AFAICT.Сервлет 3.0 еще не выпущен, но похоже, что он очень близок. Наиболее важные изменения в версии 3.0: возможность подключения, простота разработки, асинхронный сервлет, безопасность. Я не могу сказать, важны ли они для вас.
Наиболее важным из них, вероятно, является поддержка асинхронных сервлетов. Вот статья, в которой это подробно описано. Полную спецификацию можно скачать здесь .
источник
Как сказал Дон, основными направлениями улучшений и дополнений являются:
Ознакомьтесь с презентацией Javaone 2008 « Java Servlet 3.0 API: что нового и интересного » для получения подробной информации.
источник
Эта ссылка предоставит достаточно информации о Сервлете 3
Сервлет 3 поддерживает аннотацию для устранения
web.xml
@WebServlet @WebServletContextListener @ServletFilter @InitParam
источник