我尝试单独映射图像和其他URL,但在ServletPath中调用没有斜杠,它显示图像。当ServletPath包含斜杠时,它不允许显示图像。
JSP:
<img src="images/tiger.jpg"/>
Servlet:
String servletPath = request.getServletPath();
request.getRequestDispatcher("/jspPage.jsp").forward(request, response);
Web.xml中
<servlet-mapping>
<servlet-name>default</servlet-name>
<url-pattern>*.jpg</url-pattern>
</servlet-mapping>
<servlet>
<servlet-name>ControllerServlet</servlet-name>
<servlet-class>tut.controller.ControllerServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>ControllerServlet</servlet-name>
<url-pattern>/</url-pattern>
</servlet-mapping>
结果:
http://localhost:8888/ServletFilter/url1 ---------------- image visible
http://localhost:8888/ServletFilter/url1/ ---------------- image not visible
http://localhost:8888/ServletFilter/url1/ex ---------------- image not visible
http://localhost:8888/ServletFilter/url1/ex/ ---------------- image not visible
答案 0 :(得分:1)
当浏览器看到以下HTML
时<img src="images/tiger.jpg"/>
它向URL发送请求,该URL是通过获取src
属性中的路径并相对于当前URL解析它而构建的。因此,如果您之前已向
http://localhost:8888/ServletFilter/url1
(它呈现包含img
标记的HTML),然后图像的网址将是
http://localhost:8888/ServletFilter/images/tiger.png
同样,如果您将请求发送到
http://localhost:8888/ServletFilter/url1/ex
图片的网址为
http://localhost:8888/ServletFilter/url1/images/tiger.png
如果在src
路径前加/
前缀,则相对于主机名构建URL。
<img src="/images/tiger.jpg"/>
请求将被发送到
http://localhost:8888/images/tiger.png
这不是你想要的,但你可以利用它。 JSTL和EL都提供了一种使用Web应用程序的上下文路径构建绝对(相对于主机)URL的方法。
<c:url value="/images/tiger.png" var="path" />
<img src="${path}"/>
或
<img src="${pageContext.request.contextPath}/images/tiger.png" />
这将解析为
/ServletFilter/tiger.png
假设ServletFilter
是您的Web应用程序的上下文路径的值。
这是一些额外的阅读:
答案 1 :(得分:0)
最简单的解决方案是更改servlet的映射:
<servlet-name>ControllerServlet</servlet-name>
<url-pattern>/myservlet</url-pattern>
这将允许您使您的servlet脱离静态上下文处理的业务。
您尝试执行的操作似乎是将Tomcat配置为提供静态内容。虽然这通常不是一个好主意,但由于性能影响,在开发环境中您仍然可能希望这样做。如果是这种情况,这里有一个提供详细信息的好博客。它还将允许您的servlet停止静态内容处理。
http://th1rty7.blogspot.com/2009/05/tomcat-is-often-considered-to-be-too.html