【问题标题】:How does tomcat resolve resources?tomcat是如何解析资源的?
【发布时间】:2014-10-17 08:55:13
【问题描述】:

我开发网络应用程序。

Tomcat servlet 容器上的 Spring+Hibernate。

今天我在另一台 PC 上部署应用程序,发现 css 没有加载。

在 jsp 中我使用相对路径(示例)

<link href="/resources/css/ui-lightness/jquery-ui-1.10.0.custom.min.css" rel="stylesheet">

浏览器发送的相应请求:

http://localhost:8080/resources/css/ui-lightness/jquery-ui-1.10.0.custom.min.css

并且此请求返回 404 http 错误。


换另一个jsp:

<link href="/resources/css/bootstrap.min.css" rel="stylesheet">

浏览器发送:

http://localhost:8080/terminal-company/resources/css/bootstrap.min.css

因此您可以看到,从第一个 jsp 项目名称不会添加到 URL

为什么?以及如何解决?要求我详细说明我应该添加到相关答案中。

项目结构:

web.xml的spring相关部分:

<servlet>
        <servlet-name>appServlet</servlet-name>
        <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
        <init-param>
         <param-name>contextConfigLocation</param-name>
         <param-value>/WEB-INF/spring/webContext.xml</param-value>
        </init-param>
        <load-on-startup>1</load-on-startup>
    </servlet>

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

【问题讨论】:

  • 你能告诉我们项目的文件夹结构吗?
  • href="/resources/css/ui-lightness/jquery-ui-1.10.0.custom.min.css" 那不是相对资源,它以/开头...
  • 您是否在使用 spring 时在 web.xml 中进行了更改
  • 能否请您显示 web.xml
  • @Naveen 主题已更新

标签: java jsp tomcat servlets


【解决方案1】:

如果您的目标是能够使用绝对路径,而不关心(也不知道)webapp 的上下文路径(在第二个示例中为/terminal-company),那么使用the JSTL&lt;c:url&gt; 标签生成所有您的网址:

<link href="<c:url value='/resources/css/bootstrap.min.css'/>" rel="stylesheet">

第二个示例将向/resources/css/bootstrap.min.css 发送请求,而不是向/terminal-company/resources/css/bootstrap.min.css 发送请求,除非生成的HTML 页面中有&lt;base&gt; 标记。

编辑:您最初的问题并没有说您使用的是 spring,并将 / 映射到调度程序 servlet。因此,Spring 负责服务资源。 The documentation 解释了如何配置它。但这并没有改变上述答案:要独立于上下文路径,请使用 c:url。

【讨论】:

  • 我的目标是独立于上下文路径。这方面的最佳做法是什么?
  • 除非生成的 HTML 页面中有 标签。我在哪里可以找到它?
  • 最佳做法是使用 c:url 标签,如我的回答中所述。要查找基本标记,请在任意编辑器中打开生成的 html 页面,然后搜索 &lt;base
【解决方案2】:

您忘记在 web.xml 中为您的 css 文件添加 servlet 映射。

<servlet-mapping>
<servlet-name>default</servlet-name>
<url-pattern>*.css</url-pattern>
</servlet-mapping>

这同样适用于你所有的 js,png。

我想这会起作用,因为我也有同样的问题。

【讨论】:

    【解决方案3】:

    我在 localhost 上遇到过同样的行为。只需添加默认的 servlet,它将提供静态资源,如 css、js、图像等。 映射必须放在“/”urlpattern 之前,因为“/”将匹配“/js”。

    <servlet>
        <servlet-name>default</servlet-name>
        <servlet-class>
            org.apache.catalina.servlets.DefaultServlet
        </servlet-class>
        <init-param>
            <param-name>debug</param-name>
            <param-value>0</param-value>
        </init-param>
        <init-param>
            <param-name>listings</param-name>
            <param-value>true</param-value>
        </init-param>
        <load-on-startup>1</load-on-startup>
    </servlet>
    
    <servlet-mapping>
        <servlet-name>default</servlet-name>
        <url-pattern>/css/*</url-pattern>
    </servlet-mapping>
    <servlet-mapping>
        <servlet-name>default</servlet-name>
        <url-pattern>/images/*</url-pattern>
    </servlet-mapping>
    <servlet-mapping>
        <servlet-name>default</servlet-name>
        <url-pattern>/js/*</url-pattern>
    </servlet-mapping>
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-09-22
      • 1970-01-01
      • 1970-01-01
      • 2019-03-06
      • 2012-01-30
      • 2013-10-24
      相关资源
      最近更新 更多