Java web框架应该是过滤器还是Servlet?

Java web框架应该是过滤器还是Servlet?,java,servlets,jakarta-ee,servlet-filters,Java,Servlets,Jakarta Ee,Servlet Filters,让web框架处理来自单个入口点的请求是一个已解决的问题。然而,这个入口点应该是一个过滤器还是一个Servlet?为什么web应用程序开发人员更喜欢其中一个?为什么框架开发人员更喜欢一个而不是另一个?web应用程序开发人员不应该真正关心它是过滤器还是servlet。开发人员应该只关心框架如何使他们的开发更容易 现在,我甚至想更进一步地说,Web框架甚至不必基于J2EE规范(根据),其中的规则已经完全重新编写,以使Java程序员更容易开发Web应用程序。从个人经验中筛选。我得出这个结论是因为在过滤器

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

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


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

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

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

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

  • :Servlet
  • :Servlet
  • :Struts1中的Servlet,Struts2中的过滤器
  • :1.2之前的Servlet,1.3之后的过滤器
  • :过滤器和Servlet
  • :Servlet
  • :Servlet
这是最流行的框架。还有更多,但大多数都使用Servlet

大多数servlet(如果不是所有的话)都应该映射到后缀URL模式上,例如
*.jsf
(jsf)、
*.html
(Spring)、
*.do
(Struts)等。这使开发人员能够轻松忽略不感兴趣的资源。因此,过滤器能够做到这一点的优势消失了。过去只有Wicket需要映射到一个额外的路径
/app/*
,而在Wicket 1.3中将Servlet更改为Filter是在唯一的参数下完成的,即您可以将其映射到
/*
。然而,这增加了额外的配置样板,以便能够忽略静态资源。我个人不明白他们为什么不使用后缀映射

所有web框架都依赖HTTP请求。在Servlet中,它已经可以直接在标准方法中使用(通常只使用
service()
方法)。在一个过滤器中,您需要将其抛出(尽管这并不一定昂贵)

此外,Sun/Oracle在过滤器和servlet之间进行了明显的区分,理由如下:当您想在某些条件下过滤请求/响应时,请使用过滤器。当您想要控制请求/响应和/或创建响应时,请使用Servlet

另见:

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

你真的没有回答我的问题。我没有问生产率,甚至没有问框架应该做什么。我的问题也暗示了JavaEE的使用,尽管你不使用它的建议很有趣;虽然Struts2使用过滤器;-);另外,你是说如果你想要一个
/*
URL模式,最好使用一个过滤器?例如,如果你想有RESTful路径。啊,是的,Struts2做得有点不同,对不起,我不使用Struts:)至于漂亮的URL,您可以使用URL重写筛选器,如用于基于请求的MVC框架的筛选器,或用于JSF的特定于框架的筛选器。@BalusC-这几乎就是我遇到的问题,那么像Spring这样的框架如何避免转发回自身呢?还请看这里您说的筛选器更好的地方!我现在很困惑@格林:我不确定这个基准与web框架应该使用servlet还是过滤器这一具体问题有什么关系。你似乎只是在到处乱发。你是说让web框架成为一个Servlet并编写自己的过滤器来决定是否不希望Servlet处理请求是不够的吗?我是说要么是过滤器要么是Servlet。不是两者都有。使用servlet,如果路径不存在,我们发现它不会轻易抛出404。然而,在看了巴卢斯的答案之后,我们可能忽略了一些东西我记得现在的问题是什么。如果一个页面不存在,并且您的转发到“/missingpage.jsp”,它只会再次返回servlet,这会导致递归和堆栈溢出。我想知道Spring和其他框架是如何处理这个问题的?即使我尝试转发到确实存在的页面,它仍然会返回到servlet,因为我这样做了/*这与我的问题有什么关系?对不起,我的误解。但是,您的问题是“为什么开发人员更喜欢一个框架而不是另一个?”