【问题标题】:Should a web framework be a Filter or a Servlet?Web 框架应该是过滤器还是 Servlet?
【发布时间】:2011-07-03 20:43:21
【问题描述】:

让网络框架处理来自单点入口的请求是一个已解决的问题。但是,该单一入口点应该是过滤器还是 Servlet?为什么 Web 应用程序开发人员会更喜欢其中一个?为什么框架开发人员会更喜欢其中一个?

【问题讨论】:

    标签: java servlets jakarta-ee servlet-filters


    【解决方案1】:

    让我们看看现有框架是如何做到的:

    那是最流行的框架。还有更多,但大多数都使用 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。

    另见:

    【讨论】:

    • +1;虽然,Struts2 使用了过滤器 ;-) struts.apache.org/2.2.1.1/docs/webxml.html;另外,您是说如果您想拥有/* URL 模式,最好使用过滤器?例如,如果你想拥有 RESTful 路径。
    • 啊,是的,Struts2 的做法有点不同,抱歉我的错误,我不使用 Struts :) 至于漂亮的 URL,您可以使用 URL 重写过滤器,如 Tuckey's 用于请求基于 MVC 框架或特定于框架的框架,例如用于 JSF 的 PrettyFaces
    • @BalusC - 这几乎是我遇到forum.springsource.org/showthread.php?t=9877 的问题,那么像 Spring 这样的框架如何解决不转发回自身的问题?
    • 还在这里查看stackoverflow.com/questions/2506994/…,您说过滤器更好!我现在很困惑。 :)
    • @green:我不确定该基准与 Web 框架应该使用 servlet 还是过滤器的具体问题有何关系。你似乎只是在到处乱发垃圾邮件。
    【解决方案2】:

    Web 应用程序开发人员不应该真正关心它是过滤器还是 servlet。开发人员应该只关心框架如何使他们的开发更容易。

    现在,我什至更进一步说,Web 框架甚至不必基于 J2EE 规范(根据 Play Framework),其中的规则已经完全重写以使 web Java 程序员更容易开发应用程序。

    【讨论】:

    • 你真的没有回答我的问题。我没有询问生产力,甚至没有询问框架应该做什么。我的问题也暗示了 Java EE 的使用,尽管您不使用它的建议很有趣。
    【解决方案3】:

    根据个人经验过滤。我得出这个结论是因为在过滤器中我可以决定是否需要处理请求。如果我不需要处理它,那么我可以让链做下一个过滤器。在 servlet 中,如果您决定不继续处理,那么您必须转发,我发现它并没有那么好。

    【讨论】:

    • 您是说让 Web 框架成为 Servlet 并编写自己的过滤器来决定是否不希望 Servlet 处理请求还不够?
    • 我说的是过滤器或servlet。不是都。使用 servlet 如果路径不存在,我们发现它不会轻易抛出 404。但是,在查看 BalusC 的答案之后,我们可能忽略了一些东西。 :)
    • 我记得现在是什么问题。如果页面不存在并且您转发到“/missingpage.jsp”,它只会再次返回到 servlet,这会导致递归和 stackoverflow。我想知道 Spring 和其他框架是如何解决这个问题的?
    • 即使我尝试转发到确实存在的页面,它仍然会返回到 servlet,因为我做了 /*
    【解决方案4】:

    过滤器绝对是最佳选择。 Web 框架将作为 Web 应用程序在应用程序服务器中运行。应用程序服务器将更好地处理一些资源,即图像和其他静态文件,而 Web 框架应该处理对动态资源的调用。如果您创建一个过滤器,可以将静态资源的所有请求转发到应用程序服务器(或另一个过滤器),这将更容易实现。

    【讨论】:

      【解决方案5】:

      检查this 基准。您会发现 Play!framework(基于 Netty)+ Japid 模板引擎几乎接近静态内容托管(即使并发用户增加)。

      【讨论】:

      • 这跟我的问题有什么关系?
      • 对不起,我的误解。尽管您在问“为什么开发人员应该更喜欢一个框架而不是另一个”
      猜你喜欢
      • 2014-06-19
      • 1970-01-01
      • 2011-02-27
      • 2014-07-05
      • 2023-03-05
      • 1970-01-01
      • 2019-02-20
      • 1970-01-01
      • 2010-10-16
      相关资源
      最近更新 更多