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

53

我已经手动配置了我的应用程序的web.xml文件。现在,在运行我的应用程序时遇到了问题。我正在尝试从我的jsp页面访问我的servlet。但是,它抛出错误,显示页面未找到

这些servlet位于以下文件夹位置下:

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

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


首先阅读Servlet规范和映射。参考@var_给出的答案。如果您再次遇到问题或异常,请将异常粘贴在问题中,社区将尝试调试该问题。 - Rais Alam
2
你应该接受一个答案,让社区从中受益。 - Mani
2个回答

73
"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>

如果您将 AddPhotoServleturl-pattern/AddPhotoServlet 更改为 /MyUrl,那么可以通过使用 /MyUrl 访问 AddPhotoServlet Servlet。这对于安全原因很有用,因为您想要隐藏实际页面的URL。

Java Servlet url-pattern 规范:

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

参考资料:Java Servlet 规范

您可以阅读此 Java Servlet基础知识

4
补充一下,如果OP正在使用支持Servlet 3.0的Web应用程序servlet,则无需在web.xml中配置servlet。在我们的Servlets Wiki中有一个很好的解释(http://stackoverflow.com/tags/servlets/info)。 - Luiggi Mendoza
1
对于/AddPhotoServlet示例,该Servlet是通过类似于http://AddPhotoServlet.company.com/的链接访问还是通过http://company.com/AddPhotoServlet访问? - Don Cheadle

39

servlet-mapping有两个子标签,url-pattern和servlet-name。url-pattern指定了调用给定servlet的urls类型。请注意,容器将对servlet匹配使用区分大小写的字符串比较。

在web.xml文件中第一次指定url-pattern的规范适用于位于server.com的servlet容器上的服务器上下文,其匹配模式如下:<url-pattern>/status/*</url-pattern>

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的上下文将匹配<url-pattern>*.map</url-pattern>中的模式,如下所示:

 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的第三个规范:包含模式<url-pattern>/</url-pattern>的映射将与请求匹配,如果没有其他模式匹配,则使用此默认映射。映射到此模式的servlet称为默认servlet。

通常将默认映射定向到应用程序的第一个页面。明确提供默认映射还可确保处理应用程序中的格式错误的URL请求,而不是返回错误。

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

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

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

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

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

参考URL模式


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接