J2EE 中的第二个 url 模式不会加载资源

Resources won't load with the second url pattern in J2EE

我有一个 奇怪的 问题,我有一个 servlet 映射到 /home/home/next 加上网络注解如下:

@WebServlet(urlPatterns= {"/home", "/home/next"})
public class IndexServlet extends HttpServlet {

它的 doGet 方法发送了一个 index.jsp,其中包含以下内容:

<body>
    <p>Hello world!</p>
    <img src="resources/logo.png" alt="logo">
</body>

文件层次结构如下:

这就是问题所在,当我访问

localhost:8080/_08/home (_08 is the projects name)

一切都在预料之中,一切正常。 但是,如果我要访问

localhost:8080/_08/home/next

我得到了预期的结果 jsp,但是图像无法加载,我得到的是损坏的图像图标。

我不明白为什么会这样,我尝试添加一个 url 模式,如下所示:

@WebServlet(urlPatterns= {"/home", "/home/next", "/foo", "/foo/bar"})
public class IndexServlet extends HttpServlet {

我得到相同的结果,/foo 有效,但 /foo/bar 无效,它也赢了'加载图像。 我正在使用 Tomcat v10.0 和 Eclipse JEE IDE.

提前谢谢大家。

一位同事给了我答案,原来我已经偶然发现了它,但不是在这种情况下。 不在 href 的开头添加 '/' 将查找相对于它所在位置的路径。例如在 localhost:8080/_08/home 它在 localhost:8080/_08/ 中寻找图像,这解释了它为什么起作用,因为这就是图像所在的位置,它位于 /_08/resources/logo.png(WebApp 是 _08),但是当我转到 localhost:8080/_08/home/next 它在 localhost:8080/_08/home/ 中寻找它。 在开头添加一个 '/' 指定该路径是从 WebApp 的根目录开始的,因此将 jsp 编辑为此可以解决问题:

<img src="/_08/resources/logo.png" alt="logo">

然而,这是一个基于应用程序的解决方案,应该使用的是:

<img src="${pageContext.request.contextPath}/resources/logo.png" alt="logo">

returns 您的 WebApp 的 root 目录。 锚链接也会出现同样的问题,同样的解决方案。