本文主要介绍tomcat关于配置servlet的url模式的详细说明。本文通过示例代码向您详细介绍,对您的学习或工作有一定的参考价值。有需要的朋友可以参考一下。
Servlet是tomcat配置web.xml时的一个重要问题这里我们将讨论servlet中的几个痛点。
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的根,即/(比如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配置的更多信息,请搜索我们以前的文章或继续浏览下面的相关文章。希望大家以后能多多支持我们!
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)