我想从控制器返回一个简单的html页面,但我只得到文件的名称而不是其内容。为什么呢?
这是我的控制器代码:
@RestController
public class HomeController {
@RequestMapping("/")
public String welcome() {
return "login";
}
}
这是我的项目结构:
[
答案 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)
我做了三件事:
@RequestMapping(method = RequestMethod.GET, value = "/")
public String aName() {
return "myPage.html";
}
不需要特别的依赖。
答案 6 :(得分:2)
按照以下步骤
retunrn "index"
包括以下依赖项。
<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";
}
然而,这种方法有两个限制
该 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;
}
}
您可以为默认后缀设置应用程序参数,例如:
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
}
}
答案 16 :(得分:0)
您只获得名称,因为您只返回名称return "login";
。它是@RestController
并且此控制器返回数据而不是视图;因此,您只获得从方法返回的内容。
如果要显示具有此名称的视图,则需要使用Spring MVC see this example。
答案 17 :(得分:-1)
你回到String
:
return "login";
实际上是整个内容您发送回浏览器的内容。
如果您想要发回文件的内容,可以采用以下方式:
您可以使用此answer on the question Spring boot service to download a file