Spring MVC 如何决定 homeController 和 jsp 之间的冲突



我正在将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>

最新更新