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?
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 /
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/**
.
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
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( ...) {