Разница между сервлетом / отображением сервлета и фильтром / отображением фильтра? - PullRequest
14 голосов
/ 26 сентября 2011

В рамках изучения / изучения Struts2, JSP и сервлетов, я вижу из здесь и там , что сервлеты и отображение сервлетов могут использоваться в web.xml. Однако Struts2 также упоминает фильтры и сопоставление фильтров для web.xml.

В чем разница между обоими? Это взаимоисключающие? Когда я должен использовать что и почему? Может кто-то прояснить понятия? Спасибо.

ПОЯСНЕНИЯ

Я только что понял, что мне нужно понять, как связаны Struts2 и Servlets: http://www.coderanch.com/t/57899/Struts/Difference-between-servlet-struts

Ответы [ 3 ]

9 голосов
/ 26 сентября 2011

Фильтры сервлетов реализуют перехватывающий фильтр шаблон. Хотя сервлет является конечной целью веб-запроса, каждый запрос проходит серию фильтров. Каждый фильтр может изменить запрос перед его дальнейшей передачей или ответ после получения его от сервлета. Он может даже воздерживаться от дальнейшей передачи запроса и обрабатывать его полностью, как сервлет (не редкость). Например, фильтр кэширования может возвращать результат без вызова фактического сервлета.

7 голосов
/ 26 сентября 2011

Фильтры используются как фильтры сервлетов.Например, если вам нужно проверить безопасность определенных URL-адресов, вы можете добавить фильтр для этих страниц.Например, вы можете сказать, что /secure/pages/*.do должен быть перехвачен securityFilter.Затем метод doFilter() класса SecurityFilter (класс, который реализует интерфейс Filter) будет обрабатывать аудит безопасности, прежде чем перенаправлять его фактическому запрашивающему сервлету.

Сервлеты в значительной степени стандартны.Вы определяете сервлет и затем сообщаете контейнеру сервлета, какой тип запросов должен быть сопоставлен с этим сервлетом.

Они не являются взаимоисключающими.Они оба могут быть использованы одновременно.Думайте о фильтре как о значении слова - он «фильтрует» вещи (ведение журнала, безопасность и т. Д.) Перед переходом к следующему сервлету / действию.

3 голосов
/ 26 сентября 2011

Жизненный цикл запроса в соответствии со спецификацией сервлета проходит через цепочку фильтров, прежде чем сервлет окончательно исполняется.

Это довольно интуитивно понятно, когда вы смотрите на сигнатуру для метода doFilter в Filterinterface

doFilter(ServletRequest request, ServletResponse response, FilterChain chain) 

То есть в фильтре у вас есть доступ к запросу и ответу и цепочке.Контракт заключается в том, что вы, как разработчик, должны вызывать chain либо до, либо после операций, которые вы выполняете в фильтре, или вообще не вызывать их, если желательно не продолжать выполнение.Вызов chain.doFilter(...) вызовет выполнение следующего фильтра в цепочке фильтров с отображением, соответствующим запрошенному URL.Последним участником цепочки является сервлет, сопоставление которого соответствует запрошенному URL.

Технически вы можете делать все в фильтре, что вы можете делать в сервлете.Вы можете создать свое приложение, чтобы выполнять всю обработку и рендеринг в фильтре и иметь пустой сервлет, который ничего не делает.Основное отличие состоит в том, что если сервлет не сопоставлен с данным URL-адресом, контейнер должен ответить ошибкой 404, поэтому всегда должен быть сервлет, сопоставленный с любым URL-адресом, который вы хотите обслуживать.Вы также можете иметь только один сервлет, сопоставленный с URL, но у вас может быть любое количество фильтров.

...