Spring Boot add HTML and JavaScript

后端 未结 7 794
天命终不由人
天命终不由人 2020-12-24 08:50

I\'m trying to run Spring boot app with some HTML5 and JavaScript and I have a problem.

I have project structure like this:

My Spring MVC Controller

相关标签:
7条回答
  • 2020-12-24 09:24

    Set the document root directory which will be used by the web context to serve static files using ConfigurableEmbeddedServletContainer.setDocumentRoot(File documentRoot).

    Working example:

    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);
        }
    
    }
    

    Now you can customize your app with command line or profiles (src/main/resources/application-myprofile.yml: static-assets-folder: myfolder):

    > java -jar demo-0.0.1-SNAPSHOT.jar --static-assets-folder="myfolder"
    > java -jar demo-0.0.1-SNAPSHOT.jar --spring.profiles.active=myprofile
    
    0 讨论(0)
  • 2020-12-24 09:30

    I think you need to move the js directory (and contents) into the static directory (rather than having it in templates).

    0 讨论(0)
  • 2020-12-24 09:33

    For Spring Boot beginners, I had a similar issue. My jQuery code was working fine within < script > tags at the bottom of my html doc (a thymeleaf template), but when I put the exact same code into an external .js doc in the static/js folder, it no longer responded. Super simple fix - just needed to put all that .js doc code inside this: $(document).ready(function () { ...code ... }); and then it worked fine. Hope this helps someone.

    0 讨论(0)
  • 2020-12-24 09:33

    I added spring.mvc.static-path-pattern=/static/** to application.properties file and now it works.

    In html I use like this src="/static/js/jQuery.min.js"

    0 讨论(0)
  • 2020-12-24 09:38

    Basically all content that needs to be served staticly (such as javascript files) should be placed under the static folder. https://spring.io/blog/2013/12/19/serving-static-web-content-with-spring-boot

    I've thrown together a quick working example to show how it is done: https://github.com/ericbv/staticContentWithSpringBoot

    File structure:

    HTML file:

    <!DOCTYPE html>
    <html lang="en">
    <head>
        <title>Page</title>
        <script type="text/javascript" th:src="@{/js/lib/angular.js}" />
        <script type="text/javascript" th:src="@{/js/src/offer.js}" />
    </head>
    <body>
    

    Using th:src will make sure that the links are context aware

    Edit: added the th:src to make the references context aware

    0 讨论(0)
  • 2020-12-24 09:39

    You need to put your static js files into static folder. See more here: https://spring.io/blog/2013/12/19/serving-static-web-content-with-spring-boot

    0 讨论(0)
提交回复
热议问题