【问题标题】:Static files are served in Spring MVC with tomcat 7 in Windows, but not on Linux静态文件在 Spring MVC 中与 Windows 中的 tomcat 7 一起提供,但在 Linux 上不提供
【发布时间】:2015-05-04 13:59:12
【问题描述】:

近 3 周以来,我一直在网上搜索并研究如何解决此问题,但我找不到在本地 Windows 中使用 tomcat 7 在 Spring MVC 中提供静态文件的原因,但不在我们在 Linux(Ubuntu)上的服务器中。下面我描述了我的项目文件结构和所有相关文件:

web.xml:

<context-param>
    <param-name>contextConfigLocation</param-name>
    <param-value>/WEB-INF/config/root-context.xml</param-value>
</context-param>

<listener>
    <listener-class>com.bakuparkingaz.util.BakuParkingServletContext</listener-class>
</listener>

<servlet>
    <servlet-name>loginServlet</servlet-name>
    <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
    <init-param>
        <param-name>contextConfigLocation</param-name>
        <param-value>/WEB-INF/config/servlet-context.xml</param-value>
    </init-param>
    <load-on-startup>1</load-on-startup>
</servlet>

<servlet-mapping>
    <servlet-name>loginServlet</servlet-name>
    <url-pattern>/*</url-pattern>
</servlet-mapping>
<welcome-file-list>
    <welcome-file>index.html</welcome-file>
</welcome-file-list>    

app-context.xml:

<tx:annotation-driven />
<context:component-scan base-package="com.bakuparkingaz"/>
<context:property-placeholder location="classpath:db.properties" />
<mvc:resources mapping="/resources/**" location="/resources/"/>

<bean class="org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor" />

AdminController.java:

@Controller
public class AdminController {
/.
    @RequestMapping(value = "/admin")
    public String admin() {

        return "resources/admin/index.html";
    }
}

所以现在当我调用http://localhost:8080/admin 时,我得到了漂亮样式的页面,但在服务器上http://8.8.8.8/project/admin(我已将我的war 文件作为project.war 部署到tomcats webapp 文件夹)会导致一个丑陋的无样式html 页面。为什么我的静态文件无法在 linux 服务器上提供服务?

更新admin/index.html:

<!DOCTYPE html>
<html lang="en">
<head>

  <base href="/resources/admin/">

  <meta charset="utf-8">
  <title>BP Admin</title>
  <meta name="description" content="">
  <meta name="author" content="">

  <meta name="viewport" content="width=device-width, initial-scale=1">

  <link href="//fonts.googleapis.com/css?family=Raleway:400,300,600" rel="stylesheet" type="text/css">

  <link rel="stylesheet" href="css/normalize.css">
  <link rel="stylesheet" href="css/skeleton.css">
  <link rel="stylesheet" href="css/semantic.min.css">
  <link rel="stylesheet" href="css/my.css">
  <link rel="stylesheet" href="//cdn.datatables.net/1.10.4/css/jquery.dataTables.min.css">

  <link rel="icon" type="image/png" href="images/favicon.png">

</head>
<body>

  <div class="ui left vertical labeled icon menu sidebar" id="left-menu">

  <a class="item">
      <i class="home icon"></i>
      Home
  </a>
  </div>

  <div class="footer">
    <div class="text center"><p>Copyright (c) 2015 - BakuParking</p> </div>
  </div>
</div>

<script type="text/javascript" charset="utf8" src="//code.jquery.com/jquery-2.1.3.min.js"></script>
<script src="//cdn.datatables.net/1.10.4/js/jquery.dataTables.min.js" charset="utf-8"></script>
<script src="js/semantic.min.js"></script>
<script src="js/my.js"></script>

</body>
</html>

【问题讨论】:

  • 上下文路径不同,也许您可​​以尝试在 index.html 的 中添加 <base> 标签。
  • 谢谢,我现在正在按照你的建议做,但我认为这只是为了简单起见,我认为它不会解决问题。

标签: java spring spring-mvc tomcat


【解决方案1】:

在 localhost 上,您的应用位于根上下文中。在 8.8.8.8 上,您的应用位于上下文 /project。见http://docs.oracle.com/javaee/7/api/javax/servlet/ServletContext.html#getContextPath()

尝试在&lt;base&gt; 标签中使用绝对值,这将取决于环境:

对于本地主机:

<base href="http://localhost:8080/" />

对于 8.8.8.8:

<base href="http://8.8.8.8/project/" />

然后,对两种环境使用以下相对路径:

<link rel="stylesheet" href="/resources/admin/css/normalize.css" />
<script src="/resources/admin/js/semantic.min.js"></script>

您将在this answer 中看到动态设置&lt;base&gt; 标记的方法。

【讨论】:

  • “上下文路径不同” - 一开始我不明白这个说法,但这实际上是正确的答案。那是多么愚蠢的错误。谢谢,我已经解决了这个问题!
猜你喜欢
  • 2013-06-02
  • 1970-01-01
  • 1970-01-01
  • 2014-05-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-03-15
  • 2019-02-13
相关资源
最近更新 更多