tomcat关于配置servlet的url-pattern的问题思路详解

tomcat关于配置servlet的url-pattern的问题思路详解,第1张

tomcat关于配置servlet的url-pattern的问题思路详解

本文主要介绍tomcat关于配置servlet的url模式的详细说明。本文通过示例代码向您详细介绍,对您的学习或工作有一定的参考价值。有需要的朋友可以参考一下。

Servlet是tomcat配置web.xml时的一个重要问题这里我们将讨论servlet中的几个痛点。

  • servleturl模式的匹配问题
  • url模式中/和/*之间的差异
  • url模式的优先级
  • 根/的匹配问题
  • 1servletURL-pattern的匹配问题

    url-pattern有三种匹配模式,即路径匹配、精确匹配和后缀匹配。

    1.1精确匹配

    <url模式>配置的项目必须与url完全匹配。

    示例:point_down:

    <servlet-mapping> <servlet-name>MyServlet</servlet-name> <url-pattern>/kata/detail.html</url-pattern> <url-pattern>/demo.html</url-pattern> <url-pattern>/table</url-pattern> </servlet-mapping>

    当在浏览器中输入以下URL时,它们将与servlet匹配

    http://10.43.11.143/myapp/kata/detail.html

    http://10.43.11.143/myapp/table

    注意:

    http://10.43.11.143/myapp/table/是非法的url,不会被识别为http://10.43.11.143/myapp/table

    此外,上述url后面可以跟有任何查询条件,这些条件将被匹配,例如

    http://10.43.11.143/myapp/table?hello请求将与MyServlet匹配。

    1.2路径匹配

    以“/”开头并以“/*”结尾的字符串用于路径匹配。

    示例:point_down:

    <servlet-mapping> <servlet-name>MyServlet</servlet-name> <url-pattern>*.jsp</url-pattern> <url-pattern>*.action</url-pattern> </servlet-mapping>

    从路径/user/开始,下面的路径可以是任意的。例如,将匹配以下url。

    http://localhost:8080/appdemo/user/users.html

    http://localhost:8080/appdemo/user/adduser.action

    http://localhost:8080/appdemo/user/updateuser.actionl

    1.3后缀匹配

    以“*”开头的字符串用于后缀匹配。

    示例:point_down:

    <servlet-mapping> <servlet-name>MyServlet</servlet-name> <url-pattern>*.jsp</url-pattern> <url-pattern>*.action</url-pattern> </servlet-mapping>

    那么任何带有jsp或action扩展的url请求都将被匹配,比如下面的url。

    http://localhost:8080/appdemo/user/users.JSP

    http://localhost:8080/appdemo/tohome.action

    注意:不能同时设置路径和后缀匹配。

    注意:不能同时设置路径和扩展名匹配。比如下面这三条就是违法的。如果设置,启动tomcat服务器将报告一个错误。

    <url模式>/kata/*。jsp</URL-pattern>;

    <url模式>/*.jsp</URL-pattern>;

    <url模式>他*。jsp</URL-pattern>;

    举几个例子:point_down:,如果不明白,请看本文第三章。

    2URL模式中/和/*之间的差异

    <url模式>/<;/URL-pattern>;

    <url模式>/*<;/URL-pattern>;

    就说/*,/*比较好理解。它是一种路径匹配。就范围而言,它是最宽的路径匹配。所有要求都符合其要求。从准确率来说,是准确率最低的路径匹配(注意!我说的是路径匹配)。路径匹配的优先级从长到短(详见本文第三章),所以是准确率最低的路径匹配。很多博客都说它的特点是匹配*.jsp,那不是废话吗?/*本身就是路径匹配,当然也可以匹配*.jsp。

    另外,/,是匹配优先级最低的匹配。当一个url和所有的url模式匹配都不合适时,这个url会去/匹配,没有*的限制。jsp根本。大家产生(客观上也有)/不会匹配*的原因。jsp,但是/*会匹配*。jsp是*的配置。jsp在Tomcat/conf/web.xml中是单独配置的请参考本文第三章

    3URL模式的优先级

    当一个url可以匹配多个servlet的匹配规则时,遵循“精确路径>:最长路径>:“匹配后缀”的优先级匹配对应的servlet。

    示例:例如,servletA的url-pattern是/test,servletB的url-pattern是/*。此时,如果我访问的url是http://localhost/test,容器会先进行精确路径匹配。如果发现/test与servletA完全匹配,那么它会调用servletA,而不去管servletB。

    2:比如servletA的url-pattern是/test/,而servletB的url-pattern是/test/a/。在访问http://localhost/test/a时,容器会选择路径最长的servlet进行匹配,这里是servletB。

    示例:例如,servletA的url-pattern:*。 *** 作,servletB的url-pattern是/*。此时,如果我访问的URL是http://localhost/test.action,那么容器会优先进行路径匹配而不是扩展名匹配,从而调用servletB。

    那么一个问题就产生了。为什么/*匹配*。jsp,但是/不匹配*。jsp?

    原因很简单。tomcat/conf/web.xml中将有以下配置

    <servlet-mapping> <servlet-name>default</servlet-name> <url-pattern>/</url-pattern> </servlet-mapping> <!--ThemappingsfortheJSPservlet--> <servlet-mapping> <servlet-name>jsp</servlet-name> <url-pattern>*.jsp</url-pattern> <url-pattern>*.jspx</url-pattern> </servlet-mapping>

    :point_up_2:你可以清楚地看到*。jsp匹配的是名为jsp的servlet的后缀,而/*是路径匹配,优先于后缀匹配,所以可以匹配后缀为jsp的文件。而/是最低级别的匹配,低于后缀匹配,所以jsp文件不会被url-pattern/匹配。

    4路径/匹配问题

    您应该注意到,当url-pattern为/*时,访问http://localhost:8080/Hui404会有问题,但是访问http://localhost:8080/index.html没有问题(当然,前提是;)。当url-pattern为/时,http://localhost:8080/将自动转发到http://localhost:8080/index.html,而不是404。原因是什么?

    首先我们要明确一点,一个URL的根,即/(比如http://localhost:8080/),到底是什么意思?实验之后,发现/很特别。它将与/*的url模式匹配,但不会与/的url模式匹配。

    在tomcat中,默认情况下/由defaultservlet匹配,但其优先级低于路径匹配,所以当一个servlet的url-pattern为/*,则/将由该servlet匹配,因此不会由defaultservlet匹配。

    在tomcat源代码中可以找到以下片段来支持我的观点:point_down:

    <!-====================默认欢迎文件列表=====================->;
    <;!-当请求URI引用一个目录时,默认servlet看起来->;
    <;!-对于目录中“欢迎文件”,如果存在,则发送到->
    <;!-显示相应的资源URI。->;
    <;!-如果没有欢迎文件,默认servlet要么提供->;
    <;!-目录列表(参见默认servlet配置,了解如何->;
    <;!-customize)或返回404状态,这取决于->;
    <;!-列表设置。->;
    <;!->;
    <;!-如果您在自己的应用程序的web.xml中定义了欢迎文件->;
    <;!-部署描述符,列表*替换*配置列表->;
    <;!-这里,所以请确保包含您希望的任何默认值->;
    <;!-在您的应用中使用。

    :point_up_2:以上是关于欢迎文件列表,即/path默认会转发到欢迎文件列表中指定的网页,即初始页面。以上我翻译一部分,具体可以谷歌翻译。翻译:point_right:

    翻译:point_down:

    当请求URI指向一个目录时,默认的servlet在该目录中查找“欢迎文件”,如果它存在,就在相应的资源URI中查找并显示它。如果没有欢迎文件,默认servlet将提供一个目录列表(参见如何在默认servlet配置中定制)或返回一个404状态,这取决于列表设置的值。

    /将被重定向到欢迎页面的原因是存在欢迎文件列表。欢迎文件列表产生效果的前提是/必须有defaultservlet匹配。当一个servlet的url-pattern是/*,/将被这个servlet匹配,所以它不会被defaultservlet匹配。所以只有当自定义servlet的url-pattern为/,http://localhost:8080/才会自动转发到http://localhost:8080/index.html而不是404。

    摘要

    关于tomcat对配置servlets的url模式问题的详细解释,本文就到这里。有关tomcat的servlets配置的更多信息,请搜索我们以前的文章或继续浏览下面的相关文章。希望大家以后能多多支持我们!

    欢迎分享,转载请注明来源:内存溢出

    原文地址: http://outofmemory.cn/zz/774490.html

    (0)
    打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
    上一篇 2022-05-03
    下一篇 2022-05-03

    发表评论

    登录后才能评论

    评论列表(0条)

    保存