因此,我试图编写一个servlet,它可以处理url映射,例如:
域/上下文/servlet/resource_id
以前,当我指定url模式时,我只是做了:
/myServlet
但是,对于我想要完成的事情,我正在做的.
/myServlet/*
--我遇到的问题
对于我的静态文件(css/js/etc),我一直在使用相对路径(所以,只是相对于我的WebContent文件夹的文件位置),现在我使用了/myServlet/*映射,所有静态文件的请求现在都由myServlet处理。因此,基本上,静态资源现在决定:
domain/context/myServlet/relative_path_I_provide
而不是
域/上下文/相对路径_i_提供
我确信我自己可以通过构建资源的绝对路径来解决这个问题,而不是依赖相对路径;但是我只是想知道,当我使用/myServlet/* url模式而不是/myServlet时,为什么静态资源的解析路径会改变呢?
编辑:
我的文件夹结构就像
WebContent
|
|
|-- debug
|
|-- css
|
|-- file.css我把它们添加到一个链接标签中,比如:
<link href="debug/css/file.css" rel="stylesheet" type="text/css">发布于 2011-05-02 00:26:09
好吧,这就解释了。您使用的是没有路径信息的相对URL,这意味着浏览器将其解析为与包含这些URL的资源相同的目录。当您的servlet映射到/myServlet时,它在路径中没有显示为“目录”,即它是所引用的最终资源。
因此,servlet的URL是domain/context/myServlet格式的,因此这些相对URL也将解析为domain/context/。
但是现在,通过表单/myServlet/*的映射,servlet在URL中显示为一个目录,这意味着当您转到domain/context/myServlet/resource_id时,相对URL被解析到与resource_id相同的目录,即domain/context/servlet/。
请参阅为了更多
修复可能是以下几种方法之一:
/开头的URL。但是,这将要求您在代码中为您的应用程序设置上下文路径,这意味着您永远不能简单地以不同的名称部署它而不需要更改所有内容。总之,不要这么做。../的形式使用相对URL,这将导致URL解析到一个一级上的目录。如果有人决定将资源映射到表单domain/context/myServlet/secondLevel/resource_id的URL,这也是很脆弱的。href值设置为request.getContextPath + "/css/files/file.css"来做到这一点。这将在每个链接的href开头的上下文路径上占优势,因此,对于domain/context/myServlet/resource_id的请求,这将成为/context/css/files/file.css并如您所期望的那样解决。发布于 2011-05-01 23:20:17
您的实际URL是否在url模式更改之前和之后更改?也就是说,您现在是在调用http://domain/context/myServlet/something而不是http://domain/context/myServlet吗?
如果答案是肯定的,那么它解释了为什么静态文件现在解析为http://domain/context/myServlet/static_file。
(出于同样的原因,所有内容都是相对于早期URL中的上下文进行解析的)
https://stackoverflow.com/questions/5851000
复制相似问题