静态资源的URI中需要指定上下文路径吗?

3

我有一个简单的网络应用程序

webapp
   static
       images
            - a.gif
       pages
            - test.html
   WEB-INF
       pages
            - test.jsp

在test.html中,有一个

标签。

<img src="/static/images/a.gif"/>

问题在于图片在我更改 uri 后才显示。
<img src="/web app name/static/images/a.gif"/>

但是我正在URI加载test.html

http://server/web app name/static/pages/test.html

我在web.xml中配置了静态资源映射,如下所示。
<servlet>
    <servlet-name>springWeb</servlet-name>
    <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
    <init-param>
        <param-name>contextConfigLocation</param-name>
        <param-value>classpath:applicationContext-web.xml</param-value>
    </init-param>
    <load-on-startup>1</load-on-startup>
</servlet>

<servlet-mapping>
    <servlet-name>springWeb</servlet-name>
    <url-pattern>/</url-pattern>
</servlet-mapping>

<servlet>
    <servlet-name>resourceServlet</servlet-name>
    <servlet-class>org.springframework.js.resource.ResourceServlet</servlet-class>
    <load-on-startup>1</load-on-startup>
</servlet>

<servlet-mapping>
    <servlet-name>resourceServlet</servlet-name>
    <url-pattern>/static/*</url-pattern>
</servlet-mapping>

我有什么遗漏吗?我希望在开发阶段将这些静态资源保留在应用程序中,而不是将它们移动到HTTP服务器中。

非常感谢。

2个回答

6

为了这个原因,使用spring:url标签或JSTL c:url标签来包装HTML中的URL是一个好习惯。这些标签会自动添加上下文路径。

例如:

<img src="<spring:url value='/static/images/a.gif'/>"/>

在开发中,您可以使用上下文路径""。这样,您的URL将匹配生产环境。每个Servlet容器都有不同的做法--例如,对于Tomcat,您需要将应用程序部署到webapps/ROOT。


两个答案都很好,我更喜欢spring:url。 - jnj

2

让它更通用的一种方法是使用

<img src="<%=request.getContextPath()%>/static/images/a.gif"/>

如果您知道目录结构,也可以使用相对URL,例如

static/images/a.gif
../static/images/a.gif

由于目录结构将保持不变,根据原帖的说法,最好使用备选的static/images/a.gif。 OP面临的问题是因为添加了前导斜杠。 - asgs
1
+1,不过${pageContext.request.contextPath}更好。 - Steven Benitez

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接