如何在spring boot中从一个安静的控制器返回一个html页面?

时间:2016-08-01 13:57:41

标签: java html spring spring-boot controller

我想从控制器返回一个简单的html页面,但我只得到文件的名称而不是其内容。为什么呢?

这是我的控制器代码:

@RestController
public class HomeController {

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

这是我的项目结构:

[enter image description here

18 个答案:

答案 0 :(得分:20)

使用@RestController时这样:

@RestController
public class HomeController {

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

这与普通控制器中的相同:

@Controller
public class HomeController {

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

使用@ResponseBody返回return "login";作为String对象。您返回的任何对象都将作为JSON附加在HTTP正文中作为payload

这就是您在回复中获得login的原因。

答案 1 :(得分:4)

在我将此依赖项添加到pom文件中之前,来自Kukkuz的答案对我不起作用:

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

来自指南here

并按照here所述更新注册表资源。

然后开始正常工作。如果以后有人遇到相同的问题,但遵循第一个答案不能解决您的问题,请在使用@Kukkuz答案中的代码之后,按照其他两个步骤操作,看看是否有帮助。

答案 2 :(得分:3)

您可以尝试使用ModelAndView

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

答案 3 :(得分:2)

@RestController替换为@Controller

答案 4 :(得分:2)

@Restcontroller替换为@controller@Restcontroller仅返回内容而非html和jsp页面。

答案 5 :(得分:2)

我做了三件事:

  • 将 HTML 页面放在 {project.basedir}/resources/static/myPage.html;
  • 将@RestController 切换为@Controller;
  • 这是我的控制器:
@RequestMapping(method = RequestMethod.GET, value = "/")
public String aName() {
    return "myPage.html";
}

不需要特别的依赖

答案 6 :(得分:2)

按照以下步骤

  1. 必须将html文件放入resources / templates /
  2. 将@RestController替换为@Controller
  3. 如果使用任何视图解析器,请删除。
  4. 您的控制器方法应返回无扩展名的视图文件名,例如 retunrn "index"
  5. 包括以下依赖项。

    <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>`
    

答案 7 :(得分:1)

您应该使用login.html。并将RestController替换为Controller

答案 8 :(得分:1)

我不使用Thymeleaf,它对我有用的唯一方法是使用@Controller 在课程和

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

答案 9 :(得分:1)

我知道这很老,但也许可以帮助某人。为此,请在RestController中返回实际HTML代码的String,然后浏览器将知道要显示的内容。

答案 10 :(得分:1)

@Controller
public class HomeController {

    @RequestMapping(method = RequestMethod.GET, value = "/")
    public ModelAndView welcome() {
        ModelAndView modelAndView = new ModelAndView();
        modelAndView.setViewName("login.html");
        return modelAndView;
    }
}

这将返回Login.html文件。 Login.html应该在静态文件夹中。

注意:未添加百里香依赖性

@RestController
public class HomeController {

    @RequestMapping(method = RequestMethod.GET, value = "/")
    public String welcome() {
        return "login";
    }
}

这将返回字符串登录名

答案 11 :(得分:0)

在用 @RestController 注释的类中用 @GetMapping 注释的方法可以通过两种方式返回视图(JSP、HTML 等)

@GetMapping("/dummy")
public String renderDummyWebPage() {
    return "dummy.jsp";
}

然而,这种方法有两个限制

  1. 该 JSP 页面必须存在于 src/main/webapp 目录中,否则如果视图存在于子目录中,则必须相应地修改返回类型。例如,如果 JSP 页面存在于 src/main/webapp/views 目录中 - 它应该将 views/dummy.jsp 作为字符串返回。


为了克服这两个限制,您可以改为返回 ModelAndView。

@GetMapping("/dummy")
public ModelAndView renderDummyWebPage() {
    ModelAndView modelAndView = new ModelAndView();
    modelAndView.setViewName("dummy");
    return modelAndView;
}

我希望这个答案会有所帮助,谢谢。

答案 12 :(得分:0)

@kukkuz 几乎回答了“为什么?”这个问题。对于那些仍在研究“如何”的人,积累其他人的回答。

使用 RestController:

@RestController
public class MyRestController {
    @RequestMapping("/")
    public ModelAndView welcome() {
        ModelAndView modelAndView = new ModelAndView();
        modelAndView.setViewName("login.html");
        return modelAndView;
    }  
}
  • 注意视图名称是:'login.html'(完整文件名)。
  • 文件所在的位置也很重要,默认情况下 login.html 必须在 resources/static 或 resources/public 中

您可以为默认后缀设置应用程序参数,例如:

 spring.mvc.view.suffix=.html

在这种情况下,视图名称必须没有像“登录”这样的扩展名。

可以使用一些建议的百里香叶。 意味着你的 pom.xml 依赖项是这样的:

<dependency>
  <groupId>org.springframework.boot</groupId>
  <artifactId>spring-boot-starter-thymeleaf</artifactId>
  <version>2.4.4</version>
</dependency>

在这种情况下,默认情况下 login.html 必须位于:resources/templates 文件夹中,调用类似,唯一的区别是视图名称,因为 .html 被 tymeleaf 用作默认值。< /p>

//  fails by default
//  NO fail if spring mvc view suffix is set in properties e.g.: spring.mvc.view.suffix=.html
//  NO fail if thymeleaf is added, and there is a file login.html in a resources/templates folder.
@RequestMapping("/loginTest")
public ModelAndView loginTest () {
    ModelAndView modelAndView = new ModelAndView();
    modelAndView.setViewName("login");
    return modelAndView;
}

使用控制器:

@Controller
public class MyController {

  //gets html from a default 'resources/public' or 'resources/static' folder
  @RequestMapping(path="/welcome")
  public String getWelcomePage(){
      return "login.html";
  }

  //gets html from a default 'resources/public' or 'resources/static' folder
  @RequestMapping("/welcome1")
  public ModelAndView getWelcomePageAsModel() {
      ModelAndView modelAndView = new ModelAndView();
      modelAndView.setViewName("login.html");
      return modelAndView;
  }

  //  fails with 404 resource not found by default
  //  NO fail, if spring mvc view suffix is set in properties e.g.: spring.mvc.view.suffix=.html
  //  NO fail, if thymeleaf is added, and there is a file login.html in a resources/templates folder
  @RequestMapping(path="/welcome2")
  public String thisFails(){
      return "login";
  }
}

答案 13 :(得分:0)

@Controller
public class WebController {
@GetMapping("/")

public String homePage() {
    return "index";
  }
}

答案 14 :(得分:0)

您可以通过两种方式解决此问题:

第一种方法::如果您希望继续使用REST,则必须使用ModelAndView对象来呈现HTML页面。 Happy Nguyen发布了一个示例,我在这里再次发布:

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

第二种方法::如果天气不重要,则可以继续使用REST,因此可以将@RestController更改为@Controller,并确保已使用REST。添加了 Thymeleaf 模板引擎。

答案 15 :(得分:0)

最正确和现代的形式是使用IoC将依赖项放入终结点方法中,例如 thymeleaf Model实例...

 @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 
      }
 }

请参见完整示例:https://spring.io/guides/gs/serving-web-content/

答案 16 :(得分:0)

您只获得名称,因为您只返回名称return "login";。它是@RestController并且此控制器返回数据而不是视图;因此,您只获得从方法返回的内容。

如果要显示具有此名称的视图,则需要使用Spring MVC see this example

答案 17 :(得分:-1)

你回到String

 return "login";

实际上是整个内容您发送回浏览器的内容。

如果您想要发回文件的内容,可以采用以下方式:

  1. 打开文件
  2. 将内容读入字符串
  3. 返回值
  4. 您可以使用此answer on the question Spring boot service to download a file