我正在开发一个简单的Spring MVC(v4.1.2)和Angular4 app。
基本上这个应用程序通过从角度客户端发出http请求来执行CRUD操作。
以下组合完美无缺: Angular app使用" ng serv" Spring MVC war部署在应用服务器中。
现在,我正在尝试将客户端和服务器组合到一个项目中。有了这个,我应该能够生成一个包含客户端和服务器端代码的war文件。
为此,
dist
复制到..src/main/webapp/
。
重写了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控制台中收到以下错误:
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认为静态资源实际上是静态的,并从相对路径获取它们?
感谢。
答案 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">
答案 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>