我们通常最终会在web.xml中为servlet中的任何Filter编写<url-pattern>/*</url-pattern>
。
<filter-mapping>
<filter-name>requestRedirectorFilter</filter-name>
<url-pattern>/action</url-pattern>
</filter-mapping>`.
现在我怀疑java是如何识别下一个servlet / jsp的?因为我们通过
提出任何要求request.getRequestDispatcher("/ABCXYZ").forward(request, (HttpServletResponse)servletResponse);
在下一个servlet / jsp上导航,默认情况下容器将在web.xml中搜索。在web.xml <url-pattern>/*</url-pattern>
已经存在我们使用的过滤器。正是这里的实际问题才开始。
如果<url-pattern>/*</url-pattern>
[对任何请求充当通用接收器]已经存在于web.xml中,那么heck容器如何知道如何跟随<url-pattern>/ABCXYZ</url-pattern>
而不是<url-pattern>/*</url-pattern>
?请在此方面分享您的观点和知识。
答案 0 :(得分:2)
Servlet匹配程序
请求可以匹配给定上下文中的多个servlet映射。 servlet容器使用简单的匹配过程来确定最佳匹配。
匹配程序有四个简单的规则。
首先,容器优先于通配符路径匹配精确路径匹配。
其次,容器更喜欢匹配最长模式。
第三,容器首选路径匹配文件类型匹配。
最后,模式<url-pattern>/</url-pattern>
始终匹配任何其他模式不匹配的请求。
例如,上下文web.xml文件可以将在线目录的主页映射到一个模式,将目录的搜索页面映射到不同的模式,如下所示:
<servlet-mapping>
<servlet-name>catalogBrowse</servlet-name>
<url-pattern>/Catalog/*</url-pattern>
</servlet-mapping>
<servlet-mapping>
<servlet-name>catalogSearch</servlet-name>
<url-pattern>/Catalog/search/*</url-pattern>
</servlet-mapping>
下图说明了上下文的匹配过程。由于容器更喜欢匹配最长模式,因此包含/Catalog/search/
的URL始终与catalogSearch的映射匹配,而不是与catalogBrowse的映射匹配。
网址格式匹配
如果您不想转到该链接,则会从以下链接中复制。
请查看URL Patterns,其中详细介绍了示例。