我正在将Spring MVC应用程序转换为Spring Boot。Spring 应用程序有一个家庭控制器:
@RestController
public class HomeController {...
...
@RequestMapping("/login")
public String login(Principal p) {
return "login";
}
}
它应该只显示"登录"一词。然而,这似乎被忽略了,因为它还有一个登录名.jsp在src/webapp/WEB-INF/views下,它做了更多的事情,这就是运行时显示的内容。
当我将简单的Web应用程序剪切并粘贴到启动应用程序中时,我只会得到"登录"一词。
Spring 如何神奇地忽略更复杂的 jsp 输出的"登录"一词?我如何在 Boot 中模仿它?
PS我尝试添加:
<dependency>
<groupId>org.apache.tomcat.embed</groupId>
<artifactId>tomcat-embed-jasper</artifactId>
<scope>provided</scope>
</dependency>
spring.mvc.view.prefix=/views/
spring.mvc.view.suffix=.jsp
@RestController
不用于返回渲染JSP
s。这就是为什么 Spring Boot 只是用字符串 login
来响应。尝试将其更改为以下内容:
@Controller
public class HomeController {
@RequestMapping("/login")
public String login(Principal p) {
//do something with your Principal if you want...
return "login";
}
}
如果您正确配置了其他所有内容,Spring 将查找一个名为 login
(您的JSP
)的模板并将其用作视图。
@RestController
是一个 Spring 注释,用于构建 RESTful Web 服务(在控制器中定义的 Rest-API 端点)。
顺便说一下,在这里你可以找到一些关于如何继续的更多信息,不幸的是,还有一些原因不使用带有Spring Boot和嵌入式容器的JSP,而是使用不同的模板引擎。
希望这有帮助!
编辑:这个问题的另一个答案提到了视图解析器 - 这确实不是不重要的!但这是Spring Boot和JSP的一个特例。为了正确处理它,我刚刚找到的这篇文章可能会有所帮助!
在 Spring 框架中,如果要将字符串写入响应正文,则将使用关键字 @ResponseBody
。从文档
@ResponseBody注释,因此直接写入响应正文,而不是使用 HTML 模板呈现视图分辨率和呈现。
或者,在您的情况下,@RestController
注释
一种方便的注释,它本身带有 @Controller 和 @ResponseBody 注释。
如果你不使用此关键字,那么 Spring 将搜索具有给定路径的文件。为此,它使用viewResolver
.请参阅 16.5 视图并解析它们
下面是一个示例,您可以在其中看到允许 Spring 解析文件真实路径的属性:
<bean id="viewResolver"
class="org.springframework.web.servlet.view.UrlBasedViewResolver">
<property name="viewClass" value="org.springframework.web.servlet.view.JstlView"/>
<property name="prefix" value="/WEB-INF/jsp/"/>
<property name="suffix" value=".jsp"/>
</bean>