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>
文件层次结构如下:
- src/main/
- java/
- IndexServlet.java
- 网络应用程序/
- WEB-INF/
- index.jsp
- 资源/
- logo.png
这就是问题所在,当我访问
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 目录。
锚链接也会出现同样的问题,同样的解决方案。
我有一个 奇怪的 问题,我有一个 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>
文件层次结构如下:
- src/main/
- java/
- IndexServlet.java
- 网络应用程序/
- WEB-INF/
- index.jsp
- 资源/
- logo.png
- WEB-INF/
- java/
这就是问题所在,当我访问
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 目录。 锚链接也会出现同样的问题,同样的解决方案。