Java web框架应该是过滤器还是Servlet?
让web框架处理来自单个入口点的请求是一个已解决的问题。然而,这个入口点应该是一个过滤器还是一个Servlet?为什么web应用程序开发人员更喜欢其中一个?为什么框架开发人员更喜欢一个而不是另一个?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框架甚至不必基于J2EE规范(根据),其中的规则已经完全重新编写,以使Java程序员更容易开发Web应用程序。从个人经验中筛选。我得出这个结论是因为在过滤器中,我可以决定是否需要处理请求。如果我不需要处理它,那么我可以让链做下一个过滤器。在servlet中,如果您决定不继续处理,则必须转发我发现不太有效的处理 过滤器绝对是最好的选择。web框架将作为应用程序服务器中的web应用程序运行。应用服务器将更好地处理一些资源,即图像和其他静态文件,而web框架应处理对动态资源的调用。如果您创建一个可以将所有静态资源请求转发到应用程序服务器(或其他筛选器)的筛选器,则更容易实现这一点。让我们看看现有框架是如何实现的:
- :Servlet
- :Servlet
- :Struts1中的Servlet,Struts2中的过滤器
- :1.2之前的Servlet,1.3之后的过滤器
- :过滤器和Servlet
- :Servlet
- :Servlet
*.jsf
(jsf)、*.html
(Spring)、*.do
(Struts)等。这使开发人员能够轻松忽略不感兴趣的资源。因此,过滤器能够做到这一点的优势消失了。过去只有Wicket需要映射到一个额外的路径/app/*
,而在Wicket 1.3中将Servlet更改为Filter是在唯一的参数下完成的,即您可以将其映射到/*
。然而,这增加了额外的配置样板,以便能够忽略静态资源。我个人不明白他们为什么不使用后缀映射
所有web框架都依赖HTTP请求。在Servlet中,它已经可以直接在标准方法中使用(通常只使用service()
方法)。在一个过滤器中,您需要将其抛出(尽管这并不一定昂贵)
此外,Sun/Oracle在过滤器和servlet之间进行了明显的区分,理由如下:当您想在某些条件下过滤请求/响应时,请使用过滤器。当您想要控制请求/响应和/或创建响应时,请使用Servlet
另见:
/*
URL模式,最好使用一个过滤器?例如,如果你想有RESTful路径。啊,是的,Struts2做得有点不同,对不起,我不使用Struts:)至于漂亮的URL,您可以使用URL重写筛选器,如用于基于请求的MVC框架的筛选器,或用于JSF的特定于框架的筛选器。@BalusC-这几乎就是我遇到的问题,那么像Spring这样的框架如何避免转发回自身呢?还请看这里您说的筛选器更好的地方!我现在很困惑@格林:我不确定这个基准与web框架应该使用servlet还是过滤器这一具体问题有什么关系。你似乎只是在到处乱发。你是说让web框架成为一个Servlet并编写自己的过滤器来决定是否不希望Servlet处理请求是不够的吗?我是说要么是过滤器要么是Servlet。不是两者都有。使用servlet,如果路径不存在,我们发现它不会轻易抛出404。然而,在看了巴卢斯的答案之后,我们可能忽略了一些东西我记得现在的问题是什么。如果一个页面不存在,并且您的转发到“/missingpage.jsp”,它只会再次返回servlet,这会导致递归和堆栈溢出。我想知道Spring和其他框架是如何处理这个问题的?即使我尝试转发到确实存在的页面,它仍然会返回到servlet,因为我这样做了/*这与我的问题有什么关系?对不起,我的误解。但是,您的问题是“为什么开发人员更喜欢一个框架而不是另一个?”