web.xml中url-pattern有啥意义,servlet如何配置?

Posted

技术标签:

【中文标题】web.xml中url-pattern有啥意义,servlet如何配置?【英文标题】:What is the significance of url-pattern in web.xml and how to configure servlet?web.xml中url-pattern有什么意义,servlet如何配置? 【发布时间】:2012-12-10 16:35:04 【问题描述】:

我已经为我的应用程序手动配置了web.xml。现在,我在运行我的应用程序时遇到了问题。我正在尝试从我的jsp 页面访问我的servlet。但是,它会以page not found 的形式抛出错误。

servlet 位于以下文件夹位置

<application folder>/WEB-INF/classes/<package>

那么,url-patternservlet-mapping 中的 servlet 条目应该是什么。这样,servlet 就可以通过 URL 访问了。

【问题讨论】:

首先阅读 servlet 规范和映射。请参阅@var_ 给出的答案。如果您再次遇到问题或异常粘贴有问题的异常,社区将尝试调试问题。 您应该接受一个答案,让社区从中受益。 【参考方案1】:

url-pattern 用于 web.xml 将您的 servlet 映射到特定 URL。请参阅下面的 xml 代码,您可以在 web.xml 配置文件中找到类似的代码。

<servlet>
    <servlet-name>AddPhotoServlet</servlet-name>  //servlet name
    <servlet-class>upload.AddPhotoServlet</servlet-class>  //servlet class
</servlet>
 <servlet-mapping>
    <servlet-name>AddPhotoServlet</servlet-name>   //servlet name
    <url-pattern>/AddPhotoServlet</url-pattern>  //how it should appear
</servlet-mapping>

如果您将url-patternAddPhotoServlet/AddPhotoServlet 更改为/MyUrl。然后,可以使用/MyUrl 访问AddPhotoServlet servlet。出于安全原因,您希望在其中隐藏您的实际页面 URL。

Java Servlet url-pattern 规范:

    '/' 字符开头并以 '/*' 结尾的字符串 后缀用于路径映射。 以'*.'开头的字符串 前缀用作扩展映射。 仅包含 '/' 字符的字符串表示应用程序的“默认”servlet。在这种情况下,servlet 路径 是请求 URI 减去上下文路径,路径信息是 空值。 所有其他字符串仅用于完全匹配。

参考:Java Servlet Specification

您也可以阅读此Basics of Java Servlet

【讨论】:

补充一下,如果OP使用的是支持Servlet 3.0的Web Application servlet,则无需在web.xml中配置servlet。 our Servlets Wiki中有很好的解释 对于/AddPhotoServlet 示例——该Servlet 是否可以通过http://AddPhotoServlet.company.com/ 之类的链接访问?还是会被http://company.com/AddPhotoServlet 访问?【参考方案2】:

Servlet-mapping 有两个子标签,url-pattern 和 servlet-name。 url-pattern 指定应该调用 servlet-name 中给出的 servlet 的 url 类型。请注意,容器将使用区分大小写的字符串比较来进行 servlet 匹配。

第一个规范 url-pattern web.xml 文件在 server .com 的 servlet 容器上的服务器上下文与 &lt;url-pattern&gt;/status/*&lt;/url-pattern&gt; 中的模式匹配,如下所示:

http://server.com/server/status/synopsis               = Matches
http://server.com/server/status/complete?date=today    = Matches
http://server.com/server/status                        = Matches
http://server.com/server/server1/status                = Does not match

第二个规范 url-pattern 位于example.com 代理上路径/examples 的上下文与&lt;url-pattern&gt;*.map&lt;/url-pattern&gt; 中的模式匹配,如下所示:

 http://server.com/server/US/Oregon/Portland.map    = Matches
 http://server.com/server/US/server/Seattle.map     = Matches
 http://server.com/server/Paris.France.map          = Matches
 http://server.com/server/US/Oregon/Portland.MAP    = Does not match, the extension is uppercase
 http://example.com/examples/interface/description/mail.mapi  =Does not match, the extension is mapi rather than map`

第三规范 url-mapping,如果没有其他模式匹配,则包含模式&lt;url-pattern&gt;/&lt;/url-pattern&gt; 的映射匹配请求。这是默认映射。映射到此模式的 servlet 称为默认 servlet。

默认映射通常指向应用程序的第一页。显式提供默认映射还可以确保应用程序返回的格式错误的 URL 请求由应用程序处理,而不是返回错误。

下面的 servlet-mapping 元素将server servlet 实例映射到默认映射。

<servlet-mapping>
  <servlet-name>server</servlet-name>
  <url-pattern>/</url-pattern>
</servlet-mapping>

对于包含此元素的上下文,任何未被其他映射处理的请求都将转发到server servlet。

最重要的是我们应该了解URL路径映射规则

    容器将尝试查找请求路径与 servlet 路径的完全匹配。成功匹配选择 servlet。 容器将递归地尝试匹配最长的路径前缀。这是通过使用“/”字符作为路径分隔符一次将路径树下移一个目录来完成的。最长的匹配决定了选择的 servlet。 如果 URL 路径中的最后一段包含扩展(例如 .jsp),则 servlet 容器将尝试匹配处理扩展请求的 servlet。扩展名定义为最后一个“.”字符之后的最后一段。 如果前三个规则都没有导致 servlet 匹配,则容器将尝试提供适合所请求资源的内容。如果为应用程序定义了“默认”servlet,则会使用它。

参考URL Pattern

【讨论】:

以上是关于web.xml中url-pattern有啥意义,servlet如何配置?的主要内容,如果未能解决你的问题,请参考以下文章

TOMCAT中web.xml里url-pattern配置详解

servlet在web.xml中怎么配置url-pattern?

web.xml中url-pattern中/和/*的区别(来自网络)

web.xml中一个filter配置多个url-pattern

web.xml中的url-pattern映射规则

web.xml中的url-pattern映射规则