【发布时间】:2011-07-03 20:43:21
【问题描述】:
让网络框架处理来自单点入口的请求是一个已解决的问题。但是,该单一入口点应该是过滤器还是 Servlet?为什么 Web 应用程序开发人员会更喜欢其中一个?为什么框架开发人员会更喜欢其中一个?
【问题讨论】:
标签: java servlets jakarta-ee servlet-filters
让网络框架处理来自单点入口的请求是一个已解决的问题。但是,该单一入口点应该是过滤器还是 Servlet?为什么 Web 应用程序开发人员会更喜欢其中一个?为什么框架开发人员会更喜欢其中一个?
【问题讨论】:
标签: java servlets jakarta-ee servlet-filters
让我们看看现有框架是如何做到的:
那是最流行的框架。还有更多,但大多数都使用 Servlet。
如果不是所有的 servlet 都应该映射到后缀 URL 模式上,例如 *.jsf (JSF)、*.html (Spring)、*.do (Struts) 等。这使开发人员能够轻松地忽略不感兴趣的资源。因此,Filter 能够做到这一点的优势就消失了。只有 Wicket 过去需要映射到额外的路径 /app/*,并且在 Wicket 1.3 中将 Servlet 更改为 Filter 是通过唯一的参数完成的,您可以将其映射到 /*。然而,这增加了额外的配置样板,以便能够忽略静态资源。我个人不明白他们为什么不只使用后缀映射。
所有 Web 框架都依赖于 HTTP 请求。在 Servlet 中,它已经可以直接在标准方法中使用(通常只使用 service() 方法)。在过滤器中,您需要将其转换回来(尽管这不一定很昂贵)。
此外,Sun/Oracle 基于以下理由对过滤器和 Servlet 进行了明显区分:当您希望在特定条件下过滤请求/响应时,请使用过滤器。当您想要控制请求/响应和/或创建响应时,请使用 Servlet。
【讨论】:
/* URL 模式,最好使用过滤器?例如,如果你想拥有 RESTful 路径。
Web 应用程序开发人员不应该真正关心它是过滤器还是 servlet。开发人员应该只关心框架如何使他们的开发更容易。
现在,我什至更进一步说,Web 框架甚至不必基于 J2EE 规范(根据 Play Framework),其中的规则已经完全重写以使 web Java 程序员更容易开发应用程序。
【讨论】:
根据个人经验过滤。我得出这个结论是因为在过滤器中我可以决定是否需要处理请求。如果我不需要处理它,那么我可以让链做下一个过滤器。在 servlet 中,如果您决定不继续处理,那么您必须转发,我发现它并没有那么好。
【讨论】:
过滤器绝对是最佳选择。 Web 框架将作为 Web 应用程序在应用程序服务器中运行。应用程序服务器将更好地处理一些资源,即图像和其他静态文件,而 Web 框架应该处理对动态资源的调用。如果您创建一个过滤器,可以将静态资源的所有请求转发到应用程序服务器(或另一个过滤器),这将更容易实现。
【讨论】:
检查this 基准。您会发现 Play!framework(基于 Netty)+ Japid 模板引擎几乎接近静态内容托管(即使并发用户增加)。
【讨论】: