it-swarm.com.de

Wie bringe ich eine HTML-Seite von einem Controller im Spring Boot zurück?

Ich möchte eine einfache HTML-Seite vom Controller zurückgeben, bekomme aber nur den Namen der Datei und nicht deren Inhalt. Warum?

Dies ist mein Controller-Code:

@RestController
public class HomeController {

    @RequestMapping("/")
    public String welcome() {
        return "login";
    }
}

Dies ist meine Projektstruktur:

[enter image description here

10
Gustavo

Bei Verwendung von @RestController wie folgt:

@RestController
public class HomeController {

    @RequestMapping("/")
    public String welcome() {
        return "login";
    }
}

Dies ist das Gleiche wie Sie es bei einem normalen Controller tun:

@Controller
public class HomeController {

    @RequestMapping("/")
    @ResponseBody
    public String welcome() {
        return "login";
    }
}

Die Verwendung von @ResponseBody gibt return "login"; als String-Objekt zurück. Jedes Objekt, das Sie zurückgeben, wird im HTTP-Body als payload als JSON angehängt.

Aus diesem Grund erhalten Sie in der Antwort nur login.

16
kukkuz

Befolgen Sie die folgenden Schritte

  1. Die HTML-Dateien müssen in resources/templates/abgelegt werden.
  2. Ersetzen Sie den @RestController durch @Controller
  3. Entfernen Sie, wenn Sie View Resolver verwenden.
  4. Ihre Controller-Methode sollte den Dateinamen der Ansicht ohne Erweiterung wie retunrn "index" Zurückgeben.
  5. Berücksichtigen Sie die folgenden Abhängigkeiten.

    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-web</artifactId>
    </dependency>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-thymeleaf</artifactId>
    </dependency>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-devtools</artifactId>
    </dependency>`
    
5
Chandan Kumar

Die Antwort von Kukkuz hat für mich nicht funktioniert, bis ich diese Abhängigkeit in die POM-Datei eingefügt habe:

<!-- Spring boot Thymeleaf -->
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-thymeleaf</artifactId>
</dependency>

Aus dem Führer hier .

Sowie Aktualisierung der Registrierungsressourcen wie beschrieben hier

Dann hat es gut funktioniert. Wenn jemand in der Zukunft auf dasselbe Problem stößt und nach der ersten Antwort Ihr Problem nicht löst, befolgen Sie diese zwei weiteren Schritte, nachdem Sie den Code in @ Kukkuz 'Antwort verwendet haben, und prüfen Sie, ob dies einen Unterschied macht.

4
Silmarilos

Ersetzen Sie @RestController durch @Controller.

2
Noshin

Sie können versuchen, ModelAndView zu verwenden:

@RequestMapping("/")
public ModelAndView index () {
    ModelAndView modelAndView = new ModelAndView();
    modelAndView.setViewName("index");
    return modelAndView;
}
2
Happy Nguyen

@Restcontroller durch @ Controller ersetzen. @ Restcontroller gibt nur Inhalte zurück, nicht HTML- und JSP-Seiten. 

1
Prasad Reddy

Das String, das Sie hier zurückgeben:

 return "login";

Ist eigentlich der gesamte Inhalt , den Sie an den Browser zurücksenden.

Wenn Sie den Inhalt einer Datei zurücksenden möchten, ist eine Möglichkeit:

  1. Datei öffnen
  2. Inhalt in String einlesen
  3. Liefert den Wert

Sie können damit fortfahren Beantworten Sie die Frage Spring Boot Service, um eine Datei herunterzuladen

0
ppeterka

Die korrekteste und modernste Form ist, IoC zu verwenden, um Abhängigkeiten in die Endpunktmethode einzufügen, wie zum Beispiel die thymeleafModel-Instanz ...

 @Controller 
 public class GreetingController {
        @GetMapping("/greeting") 
        public String greeting(
            @RequestParam(name="name", required=false, defaultValue="World") String name, Model model) {
             model.addAttribute("name", name); 
             return "greeting"; 
             // returns the already proccessed model from src/main/resources/templates/greeting.html 
      }
 }

Das vollständige Beispiel finden Sie unter: https://spring.io/guides/gs/serving-web-content/

Sie erhalten nur den Namen, weil Sie nur den Namen return "login"; zurückgeben. Es ist @RestController und dieser Controller gibt Daten statt einer Ansicht zurück. Aus diesem Grund erhalten Sie nur Inhalte, die Sie von method zurückgeben.

Wenn Sie view mit diesem Namen anzeigen möchten, müssen Sie Spring MVC verwenden, siehe dieses Beispiel .

0

Sie sollten login.html verwenden. Und ersetzen Sie RestController durch Controller

0

Ich verwende Thymeleaf nicht und die einzige Möglichkeit, mit der es für mich funktionierte, war @Controllerin der Klasse und 

@RequestMapping(method = RequestMethod.GET, value = "/")
public String index() {
    return "index.html";
}
0
Johnny Willer