我是Spring框架和Spring Boot的新手 我已经实现了一个非常简单的RESTful Spring Boot Web应用程序 您可以在另一个问题中看到几乎完整的源代码:Spring Boot: How to externalize JDBC datasource configuration?
app如何服务外部静态HTML,css js文件?
例如,目录结构可能如下:
MyApp\
MyApp.jar (this is the Spring Boot app that services the static files below)
static\
index.htm
images\
logo.jpg
js\
main.js
sub.js
css\
app.css
part\
main.htm
sub.htm
我已经阅读了构建包含静态HTML文件的.WAR文件的方法,但由于它需要重建和重新部署WAR文件,即使在单个HTML文件修改时,该方法也是不可接受的。
一个确切而具体的答案是可取的,因为我对Spring的了解非常有限。
答案 0 :(得分:6)
我从another of your questions看到你真正想要的是能够从默认值更改应用程序中静态资源的路径。撇开为什么要这样做的问题,有几个可能的答案。
@Bean
类型的普通Spring MVC WebMvcConfigurerAdapter
,并使用addResourceHandlers()
方法添加静态资源的其他路径(请参阅WebMvcAutoConfiguration
默认值)。 ConfigurableEmbeddedServletContainerFactory
功能来设置servlet上下文根路径。 @Bean
的{{1}}定义,以您希望的方式设置servlet容器。如果您使用现有的具体实现之一,则会扩展您已找到的EmbeddedServletContainerFactory
类,因此它们甚至可以为名为Abstract*
的属性设置setter。您还可以使用documentRoot
类型的@Bean
进行大量常见操作。答案 1 :(得分:3)
如果你指定' -cp就足够了。'命令中的选项' java -jar blabla.jar'并且在当前目录中是静态的'目录
答案 2 :(得分:0)
看看this Dave Syer的答案实施。
您可以设置文档根目录,该目录将由Web上下文用于使用ConfigurableEmbeddedServletContainer.setDocumentRoot(File documentRoot)
提供静态文件。
工作示例:
cars = Car.objects.all()
fords = cars.filter(make="Ford")[:3]
现在,您可以使用command line和个人资料({% for ford in fords %}
{{ ford.price }}
{% endfor %}
)自定义您的应用:
package com.example.config;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.boot.context.embedded.ConfigurableEmbeddedServletContainer;
import org.springframework.boot.context.embedded.EmbeddedServletContainerCustomizer;
import org.springframework.boot.web.servlet.ServletContextInitializer;
import org.springframework.context.annotation.Configuration;
import org.springframework.core.env.Environment;
import org.springframework.util.StringUtils;
import javax.servlet.ServletContext;
import javax.servlet.ServletException;
import java.io.File;
import java.nio.file.Paths;
@Configuration
public class WebConfigurer implements ServletContextInitializer, EmbeddedServletContainerCustomizer {
private final Logger log = LoggerFactory.getLogger(WebConfigurer.class);
private final Environment env;
private static final String STATIC_ASSETS_FOLDER_PARAM = "static-assets-folder";
private final String staticAssetsFolderPath;
public WebConfigurer(Environment env, @Value("${" + STATIC_ASSETS_FOLDER_PARAM + ":}") String staticAssetsFolderPath) {
this.env = env;
this.staticAssetsFolderPath = staticAssetsFolderPath;
}
@Override
public void onStartup(ServletContext servletContext) throws ServletException {
if (env.getActiveProfiles().length > 0) {
log.info("Web application configuration, profiles: {}", (Object[]) env.getActiveProfiles());
}
log.info(STATIC_ASSETS_FOLDER_PARAM + ": '{}'", staticAssetsFolderPath);
}
private void customizeDocumentRoot(ConfigurableEmbeddedServletContainer container) {
if (!StringUtils.isEmpty(staticAssetsFolderPath)) {
File docRoot;
if (staticAssetsFolderPath.startsWith(File.separator)) {
docRoot = new File(staticAssetsFolderPath);
} else {
final String workPath = Paths.get(".").toUri().normalize().getPath();
docRoot = new File(workPath + staticAssetsFolderPath);
}
if (docRoot.exists() && docRoot.isDirectory()) {
log.info("Custom location is used for static assets, document root folder: {}",
docRoot.getAbsolutePath());
container.setDocumentRoot(docRoot);
} else {
log.warn("Custom document root folder {} doesn't exist, custom location for static assets was not used.",
docRoot.getAbsolutePath());
}
}
}
@Override
public void customize(ConfigurableEmbeddedServletContainer container) {
customizeDocumentRoot(container);
}
}