作为探索/学习Struts2,JSP和Servlets的一部分,我从here和there看到,servlet和servlet-mapping可以在web.xml
中使用。但是,Struts2也提到了web.xml
的过滤器和过滤器映射。
两者有什么区别?这些是互相排斥的吗?我何时应该使用哪个以及为什么?有人可以澄清这些概念吗?感谢。
澄清
我只是理解我需要了解Struts2和Servlet是如何相关的:http://www.coderanch.com/t/57899/Struts/Difference-between-servlet-struts
答案 0 :(得分:9)
Servlet过滤器实现intercepting filter模式。虽然servlet是Web请求的最终目标,但每个请求都会通过一系列过滤器。每个过滤器都可以在进一步传递之前修改请求,或者在从servlet接收回请之后进行响应。它甚至可以避免进一步传递请求并像servlet一样完全处理它(并非罕见)。例如,缓存过滤器可以在不调用实际servlet的情况下返回结果。
答案 1 :(得分:7)
像Servlet过滤器一样使用过滤器。例如,如果您需要对某些URL进行安全检查,则可以为这些页面添加过滤器。例如,您可以说/secure/pages/*.do
需要被securityFilter拦截。然后,SecurityFilter类的doFilter()
方法(实现Filter接口的类)将在将其转发到实际请求的servlet之前处理安全审核。
Servlet几乎是标准的东西。您定义一个servlet,然后让servlet容器知道需要将哪种类型的请求映射到该servlet。
它们不是相互排斥的。它们都可以同时使用。想想过滤器就像单词的意思一样 - 它在进行下一个servlet /动作之前“过滤”事物(日志记录,安全性等)。
答案 2 :(得分:3)
根据servlet规范的请求生命周期在最终由servlet执行之前经过一系列过滤器。
当您在Filter
界面中查看doFilter方法的签名时,这非常直观
doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
也就是说,在过滤器中,您可以访问请求和响应以及链。合同是作为实现者,您应该在过滤器中执行操作之前或之后调用chain
,或者如果不希望继续执行,则根本不调用chain.doFilter(...)
。调用{{1}}将导致过滤器链中的下一个过滤器具有与所请求的URL匹配的映射。链的最后一个成员是servlet,其映射与请求的URL匹配。
从技术上讲,您可以在servlet中执行过滤器中的所有操作。您可以构建应用程序以在筛选器中执行所有处理和呈现,并使用一个不执行任何操作的空白servlet。主要区别在于,如果没有针对给定URL映射的servlet,则容器必须响应404错误,因此必须始终为要提供的任何URL映射servlet。您也可以只有一个servlet映射到一个URL,但您可以有任意数量的过滤器。