Spring MVC没有选择html文件中提到的静态资源

时间:2018-02-27 15:42:03

标签: java spring angular

我正在开发一个简单的Spring MVC(v4.1.2)和Angular4 app。

基本上这个应用程序通过从角度客户端发出http请求来执行CRUD操作。

以下组合完美无缺: Angular app使用" ng serv" Spring MVC war部署在应用服务器中。

现在,我正在尝试将客户端和服务器组合到一个项目中。有了这个,我应该能够生成一个包含客户端和服务器端代码的war文件。

为此,

  • 将角度应用的dist复制到..src/main/webapp/enter image description here
  • 重写了org.springframework.web.servlet.config.annotation.WebMvcConfigurerAdapter

    的以下方法
    @Configuration
    @EnableWebMvc
    public class ServletContextConfiguration extends WebMvcConfigurerAdapter {
    
    @Override
    public void configureContentNegotiation(ContentNegotiationConfigurer configurer) {
        configurer.favorParameter(false).favorPathExtension(true).ignoreAcceptHeader(false)
                .defaultContentType(MediaType.TEXT_HTML).mediaType("xml", MediaType.APPLICATION_XML)
                .mediaType("json", MediaType.APPLICATION_JSON).mediaType("html", MediaType.TEXT_HTML);
    }
    
    @Override
    public void configureDefaultServletHandling(DefaultServletHandlerConfigurer configurer) {
        configurer.enable();
    }
    
    @Override
    public void addResourceHandlers(ResourceHandlerRegistry registry) {
        registry.addResourceHandler("/**").addResourceLocations("/dist/");
    }
    

    }

  • 更改了 web.xml ,如下所示:

    <web-app xmlns="http://java.sun.com/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://java.sun.com/xml/ns/javaee 
          http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd"
    version="3.0">
    
    <display-name>Archetype Created Web Application</display-name>
    
    <servlet>
        <servlet-name>springDispatcher</servlet-name>
        <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
        <init-param>
            <param-name>contextConfigLocation</param-name>
            <param-value>/WEB-INF/applicationContext.xml</param-value>
        </init-param>
        <load-on-startup>1</load-on-startup>
    </servlet>
    
    <servlet-mapping>
        <servlet-name>springDispatcher</servlet-name>
        <url-pattern>/</url-pattern>
    </servlet-mapping>
    
    <welcome-file-list>
        <welcome-file>/index.html</welcome-file>
    </welcome-file-list>
    

部署并运行应用程序后,我在Web控制台中收到以下错误:

enter image description here

index.html

    <!doctype html>
    <html lang="en">
    <head>
      <meta charset="utf-8">
      <title>StoreClientApp</title>
      <base href="/">

      <meta name="viewport" content="width=device-width, initial-scale=1">
      <link rel="icon" type="image/x-icon" href="favicon.ico">
    </head>
    <body>
      <app-root></app-root>
    <script type="text/javascript" src="inline.bundle.js"></script><script 
     type="text/javascript" src="polyfills.bundle.js"></script><script 
     type="text/javascript" src="styles.bundle.js"></script><script 
     type="text/javascript" src="vendor.bundle.js"></script><script 
     type="text/javascript" src="main.bundle.js"></script></body>

    </html>

从控制台日志中可以明显看出Spring正在触发index.html中静态资源的http请求。这是预期的行为吗?什么应该是更改,以便Spring认为静态资源实际上是静态的,并从相对路径获取它们?

感谢。

3 个答案:

答案 0 :(得分:2)

http://127.0.0.1:7001/inline.bundle.js它没有contextPath,所以你需要纠正它。

http://127.0.0.1:7001/store-server/inline.bundle.js

1.静态定义

<script type="text/javascript">
    var contextPath = "/"+window.location.pathname.substring(0, window.location.pathname.indexOf("/",2));
    document.head.innerHTML = document.head.innerHTML + "<base href='" + contextPath + "' />";
</script>

2.动态定义

如果您使用纯HTML,则可以通过以下方式获取contextPath。

{{1}}

答案 1 :(得分:1)

您的上下文路径为/store-server,对静态资源的请求是根目录。您可以执行以下操作之一来修复它

  • <base href="/">更新为<base href="/store-server">
  • 在根上下文路径(/)
  • 中部署Spring war
  • 更新单个脚本/ css的路径以指向 /存储服务器/ {资源名称}

答案 2 :(得分:0)

在index.html中尝试向正在使用的脚本文件的每个URL添加正斜杠。喜欢这个

 <script type="text/javascript" src="/inline.bundle.js"></script><script 
type="text/javascript" src="/polyfills.bundle.js"></script><script
 type="text/javascript" src="/styles.bundle.js"></script><script 
type="text/javascript" src="/vendor.bundle.js"></script><script 
type="text/javascript" src="/main.bundle.js"></script></body>