0

所以,我正在尝试编写一个可以处理 url 映射的 servlet,例如:

domain/context/servlet/resource_id

之前,当我指定 url 模式时,我只是在做:

/myServlet

但是,对于我想要完成的事情,我正在做...

/myServlet/*

我遇到的问题

既然我正在使用/myServlet/*映射,我一直在为我的静态文件(css/js/etc)使用相对路径(所以,只是相对于我的 WebContent 文件夹的文件位置),现在对所有静态文件的请求都是由 myServlet 处理。因此,基本上,静态资源现在正在解决:

域/上下文/myServlet/relative_path_I_provide

域/上下文/relative_path_I_provide

我确信我可以自己解决这个问题,只需为资源构建绝对路径,而不是依赖相对路径;但我只是想知道,为什么当我使用/myServlet/*url 模式而不是 url 模式时,静态资源的解析路径会发生变化/myServlet

编辑:

我的文件夹结构就像

WebContent
   |
   |
   |-- debug
         |
         |-- css
              |
              |-- file.css

我将它们添加到链接标签中,例如:

<link href="debug/css/file.css" rel="stylesheet" type="text/css">
4

2 回答 2

2

好的,这就解释了。您正在使用没有路径信息的相对 URL,这意味着浏览器将其解析到与包含这些 URL 的资源相同的目录。当您的 servlet 映射到 时/myServlet,它并没有作为“目录”出现在路径中,即它是被引用的最终资源。

因此,您的 servlet URL 的格式为domain/context/myServlet,因此这些相对 URL 也将解析为domain/context/.

但是现在,通过表单的映射/myServlet/*,servlet 在 URL 中显示为一个目录,这意味着当您转到 时,相对 URL 被解析到与isdomain/context/myServlet/resource_id相同的目录。resource_iddomain/context/servlet/

看到这个了解更多

修复可能是以下之一:

  1. 使用相对于应用程序根目录的相对 URL,即以 . 开头的相对 URL /。但是,这将要求您在代码中放入应用程序的上下文路径,这意味着您永远不能简单地使用不同的名称部署它而无需更改所有内容。简而言之,不要这样做。

  2. 使用具有路径信息的相对 URL,其形式../将导致 URL 解析到上一级目录。如果有人决定将资源映射到表单的 URL,这也很脆弱并且会中断domain/context/myServlet/secondLevel/resource_id

  3. 创建相对于应用程序上下文路径的相对 URL。您可以通过将href值设置为来做到这一点request.getContextPath + "/css/files/file.css"。这会将上下文路径添加到每个链接的开头,href因此对于 request for domain/context/myServlet/resource_id,这将成为/context/css/files/file.css您所期望的并解决。

于 2011-05-02T00:26:09.390 回答
0

在 url 模式更改之前和之后,您的实际 URL 是否发生了变化?即你现在是在调用http://domain/context/myServlet/something而不是http://domain/context/myServlet

如果答案是肯定的,那么它解释了为什么静态文件现在解析为http://domain/context/myServlet/static_file
(出于同样的原因,所有内容都相对于早期 URL 中的上下文进行解析)

于 2011-05-01T23:20:17.193 回答