web-dev-qa-db-fra.com

Comment puis-je servir du HTML statique à partir de Spring Boot?

J'ai couru le projet spring-boot-sample-web-static de ici , j'ai apporté cette modification au pom

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-Tomcat</artifactId>
</dependency>

Et ajouté cette classe pour servir une page en double index2.html à partir du même emplacement de dossier static:

import org.springframework.http.MediaType;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;

@Controller
public class Rester {

    @RequestMapping(value = "/Rand", produces = MediaType.APPLICATION_JSON_VALUE)
    @ResponseBody
    private RandomObj jsonEndpoint() {
        return new RandomObj();
    }

    @RequestMapping(value = "/tw")
    public String somePg() {
        return "index2";
    }
}

L'URL json fonctionne bien, mais lorsque j'essaie d'accéder à localhost: 8080/tw, une page vierge s'affiche et cette erreur se produit dans la console:

2017-02-22 15:37:22.076 ERROR 21494 --- [nio-8080-exec-9] o.s.boot.web.support.ErrorPageFilter     : Cannot forward to error page for request [/tw] as the response has already been committed. As a result, the response may have the wrong status code. If your application is running on WebSphere Application Server you may be able to resolve this problem by setting com.ibm.ws.webcontainer.invokeFlushAfterService to false

Est-ce que je fais quelque chose de mal?

21
osmingo

Les fichiers statiques doivent être servis à partir des ressources, pas du contrôleur.

Spring Boot ajoutera automatiquement des ressources Web statiques situées dans l’un des répertoires suivants:

/META-INF/resources/  
/resources/  
/static/  
/public/

réfs:
https://spring.io/blog/2013/12/19/serving-static-web-content-with-spring-boothttps: // spring .io/guides/gs/portion-web-content /

34
csenga

Au démarrage du printemps, les répertoires /META-INF/resources/, /resources/, static/ Et public/ Sont disponibles pour servir du contenu statique.

Vous pouvez donc créer un répertoire static/ Ou public/ Sous le répertoire resources/ Et y placer votre contenu statique. Et ils seront accessibles par: http://localhost:8080/your-file.ext. (en supposant que server.port vaut 8080)

Vous pouvez personnaliser ces répertoires en utilisant spring.resources.static-locations Dans le répertoire application.properties.

Par exemple:

spring.resources.static-locations=classpath:/custom/

Vous pouvez maintenant utiliser le dossier custom/ Sous resources/ Pour servir des fichiers statiques.

Mise à jour:

Ceci est également possible avec Java config:

@Configuration
public class StaticConfig implements WebMvcConfigurer {

    @Override
    public void addResourceHandlers(ResourceHandlerRegistry registry) {
        registry.addResourceHandler("/static/**").addResourceLocations("classpath:/custom/");
    }
}

Cette configuration associe le contenu du répertoire custom à l'URL http://localhost:8080/static/**.

16
Hamid Mohayeji

Vous pouvez rapidement servir du contenu statique dans Java, application Spring-Boot via thymeleaf (ref: source )

Je suppose que vous avez déjà ajouté le plugin Spring Boot apply plugin: 'org.springframework.boot' et le nécessaire buildscript

Alors allez-y et AJOUTEZ thymeleaf à votre build.gradle ==>

dependencies {
    compile('org.springframework.boot:spring-boot-starter-web')
    compile("org.springframework.boot:spring-boot-starter-thymeleaf")
    testCompile('org.springframework.boot:spring-boot-starter-test')
}

Supposons que vous avez ajouté home.html à src/main/resources Pour servir ce fichier, vous devez créer un contrôleur.

package com.ajinkya.th.controller;

  import org.springframework.stereotype.Controller;
  import org.springframework.web.bind.annotation.RequestMapping;

  @Controller
  public class HomePageController {

      @RequestMapping("/")
      public String homePage() {
        return "home";
      }

  }

C'est ça ! Maintenant, redémarrez votre serveur Gradle. ./gradlew bootRun

0
STEEL

Comme cela a été écrit auparavant, certains dossiers (/ META-INF/resources /,/resources /,/static /,/public /) servent par défaut au contenu statique, une erreur de configuration du conroller peut empêcher ce comportement.

Il est fréquent que les utilisateurs définissent l'URL de base d'un contrôleur dans le @RestController annotation, au lieu du @RequestMapping annotation sur le dessus des contrôleurs.

C'est faux:

@RestController("/api/base")
public class MyController {

    @PostMapping
    public String myPostMethod( ...) {

L'exemple ci-dessus vous empêchera d'ouvrir le fichier index.html. Le printemps attend une méthode POST à la racine, car le myPostMethod est mappé sur le chemin "/".

Vous devez utiliser ceci à la place:

@RestController
@RequestMapping("/api/base")
public class MyController {

    @PostMapping
    public String myPostMethod( ...) {
0
SaWo