Spring MVC 如何决定 homecontroller 和 jsp 之间的冲突?
How does Spring MVC decide on conflict between homecontroller and jsp?
我正在将 Spring MVC app 转换为 Spring Boot。
Spring 应用有一个家庭控制器:
@RestController
public class HomeController {...
...
@RequestMapping("/login")
public String login(Principal p) {
return "login";
}
}
应该只显示单词 'login'。然而,这似乎被忽略了,因为它在 src/webapp/WEB-INF/views 下还有一个 login.jsp,它做的更多,这是 运行.
时显示的内容
当我将 simple-web-app 剪切并粘贴到 Boot 应用程序时,我只得到 'login' 这个词。
对于更复杂的 jsp 输出,Spring 如何神奇地忽略单词 'login'?我如何在 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
在Spring 框架中,如果要将字符串写入响应主体,则需要使用关键字@ResponseBody
。来自 documentation
@ResponseBody annotation and, therefore, writes directly to the response body versus view resolution and rendering with an HTML template.
或者,在您的情况下,@RestController
注释是
A convenience annotation that is itself annotated with @Controller and @ResponseBody.
如果您不使用此关键字,则 Spring 将搜索具有给定路径的文件。为此,它使用 viewResolver
。参见 16.5 Views and resolving them
这是一个示例,您可以在其中看到 属性 允许 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>
@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 Service(在控制器中定义的 Rest-API 端点)。
顺便说一句,here 您可以找到更多关于如何进行的信息,不幸的是,还有一些不将 JSP 与 Spring 引导容器和嵌入式容器一起使用的原因,而是使用不同的模板引擎。
希望对您有所帮助!
编辑:这个问题的另一个答案提到了视图解析器——这确实不重要!但它是 Spring Boot 和 JSP 的特例。为了正确起见,this article 我刚刚发现可能会有所帮助!
我正在将 Spring MVC app 转换为 Spring Boot。 Spring 应用有一个家庭控制器:
@RestController
public class HomeController {...
...
@RequestMapping("/login")
public String login(Principal p) {
return "login";
}
}
应该只显示单词 'login'。然而,这似乎被忽略了,因为它在 src/webapp/WEB-INF/views 下还有一个 login.jsp,它做的更多,这是 运行.
时显示的内容当我将 simple-web-app 剪切并粘贴到 Boot 应用程序时,我只得到 'login' 这个词。
对于更复杂的 jsp 输出,Spring 如何神奇地忽略单词 'login'?我如何在 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
在Spring 框架中,如果要将字符串写入响应主体,则需要使用关键字@ResponseBody
。来自 documentation
@ResponseBody annotation and, therefore, writes directly to the response body versus view resolution and rendering with an HTML template.
或者,在您的情况下,@RestController
注释是
A convenience annotation that is itself annotated with @Controller and @ResponseBody.
如果您不使用此关键字,则 Spring 将搜索具有给定路径的文件。为此,它使用 viewResolver
。参见 16.5 Views and resolving them
这是一个示例,您可以在其中看到 属性 允许 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>
@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 Service(在控制器中定义的 Rest-API 端点)。
顺便说一句,here 您可以找到更多关于如何进行的信息,不幸的是,还有一些不将 JSP 与 Spring 引导容器和嵌入式容器一起使用的原因,而是使用不同的模板引擎。
希望对您有所帮助!
编辑:这个问题的另一个答案提到了视图解析器——这确实不重要!但它是 Spring Boot 和 JSP 的特例。为了正确起见,this article 我刚刚发现可能会有所帮助!