Разница между отображением сервлетов/сервлетов и фильтрами/фильтрами?

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

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

РАЗЪЯСНЕНИЕ

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

Ответы

Ответ 1

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

Ответ 2

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

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

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

Ответ 3

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

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

doFilter(ServletRequest request, ServletResponse response, FilterChain chain) 

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

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