原文: https://javatutorial.net/implementing-spring-mvc-controllers

本教程描述了实现 Spring MVC 控制器的不同方法,并提供了示例。

在我以前的教程,使用 STS 创建简单的 Spring Web App 中,我向您展示了如何构建引入控制器的 Spring Boot App。 本教程是对上一个教程的扩展。

在开始实现之前,让我们快速概述一下控制器如何参与 MVC 工作流程。

实现 Spring MVC 控制器 - 图1

Spring MVC 架构工作流程

  1. 来自客户端的传入请求由调度器 Servlet 解释
  2. 调度器 Servlet 通过解析请求属性并使对象对处理程序可用来进行初始处理。
  3. 确定并调用适当的处理程序以进一步处理请求。 确定适当控制器上的适当方法
  4. 控制器处理请求并返回ModelAndView的实例
  5. 调度器 Servlet 进一步处理ModelAndView的实例,以将响应发送给客户端

在 Spring Boot 应用程序中启用 JSP

如果要启用 JSP,则必须执行以下操作:

pom.xml文件中添加以下依赖项:

  1. <dependency>
  2. <groupId>org.apache.tomcat.embed</groupId>
  3. <artifactId>tomcat-embed-jasper</artifactId>
  4. </dependency>
  5. <dependency>
  6. <groupId>javax.servlet</groupId>
  7. <artifactId>jstl</artifactId>
  8. </dependency>

src/main/resources/application.properties中添加这两行

  1. spring.mvc.view.prefix=/WEB-INF/jsp/
  2. spring.mvc.view.suffix=.jsp

创建文件夹src/main/resources/META-INF/resources/WEB-INF/jsp/并将 JSP 文件放入其中

实现 Spring 控制器返回 JSP 页面

以下示例演示如何在 Spring Controller方法中返回 JSP 页面。 请注意@Controller注释和@RequestMapping注释的用法。 如果我们想返回一个 JSP 页面,我们将不使用@ResponseBody注释(如第二个示例所示)。

  1. package net.javatutorial.tutorials;
  2. import org.springframework.boot.SpringApplication;
  3. import org.springframework.boot.autoconfigure.SpringBootApplication;
  4. import org.springframework.stereotype.Controller;
  5. import org.springframework.web.bind.annotation.RequestMapping;
  6. @Controller
  7. @SpringBootApplication
  8. public class ControllerExampleJSP {
  9. @RequestMapping("/hellojsp")
  10. String helloJSP() {
  11. return("index");
  12. }
  13. public static void main(String[] args) {
  14. SpringApplication.run(ControllerExampleJSP.class, args);
  15. }
  16. }

@RequestMapping注释将网址http://localhost:8080/hellojsp插入到控制器的方法helloJSP()中。 此方法返回index.jsp的解析内容

实现 Spring MVC 控制器 - 图2

使用 Spring 控制器渲染 JSP 页面

ResponseBody实现控制器

与前面的示例不同,此示例将返回由方法而不是 JSP 页面生成的String。 我们唯一需要更改的就是将@ResponseBody注解添加到我们的控制器方法中

  1. package net.javatutorial.tutorials;
  2. import org.springframework.boot.SpringApplication;
  3. import org.springframework.boot.autoconfigure.SpringBootApplication;
  4. import org.springframework.stereotype.Controller;
  5. import org.springframework.web.bind.annotation.RequestMapping;
  6. import org.springframework.web.bind.annotation.ResponseBody;
  7. @Controller
  8. @SpringBootApplication
  9. public class ControllerResponseBodyExample {
  10. @RequestMapping("/helloresponsebody")
  11. @ResponseBody
  12. String helloResponseBody() {
  13. return("Hello World. This is produced by a method annotated with ResponseBody");
  14. }
  15. public static void main(String[] args) {
  16. SpringApplication.run(ControllerResponseBodyExample.class, args);
  17. }
  18. }

在浏览器中调用http://localhost:8080/helloresponsebody将产生以下输出:

实现 Spring MVC 控制器 - 图3

使用 Spring ControllerResponseBody进行输出

实现 Spring RestController

@RestController注释用作方便注释,以表示诸如@Controller@ResponseBody之类的注释。 在类级别使用时,控制器可以处理 REST API 请求。

  1. package net.javatutorial.tutorials;
  2. import org.springframework.boot.SpringApplication;
  3. import org.springframework.boot.autoconfigure.SpringBootApplication;
  4. import org.springframework.web.bind.annotation.RequestMapping;
  5. import org.springframework.web.bind.annotation.RestController;
  6. @RestController
  7. @SpringBootApplication
  8. public class RestControllerExample {
  9. @RequestMapping("/hellorest")
  10. String helloRest() {
  11. return("Hello World. This is produced by the rest conntroller method");
  12. }
  13. public static void main(String[] args) {
  14. SpringApplication.run(RestControllerExample.class, args);
  15. }
  16. }

在浏览器中调用http://localhost:8080/hellorest将产生以下输出:

实现 Spring MVC 控制器 - 图4

使用 Spring RestController输出

在方法和类级别使用@RequestMapping注释

Spring 4.3 引入了诸如@GetMapping@PostMapping@PutMapping等注解,以指定常见 HTTP 方法类型(如 GET,POST 和 PUT)的映射。 这些注释增强了代码的可读性。

以下示例演示了如何在方法和类级别上使用映射注释。

  1. package net.javatutorial.tutorials;
  2. import org.springframework.boot.SpringApplication;
  3. import org.springframework.boot.autoconfigure.SpringBootApplication;
  4. import org.springframework.web.bind.annotation.GetMapping;
  5. import org.springframework.web.bind.annotation.RequestMapping;
  6. import org.springframework.web.bind.annotation.RestController;
  7. @RestController
  8. @RequestMapping("/user/*")
  9. @SpringBootApplication
  10. public class MethodAndClassLevelAnnotations {
  11. @RequestMapping
  12. String login() {
  13. return("Login method called");
  14. }
  15. @GetMapping("/logout")
  16. String logout() {
  17. return("Logout method called");
  18. }
  19. public static void main(String[] args) {
  20. SpringApplication.run(MethodAndClassLevelAnnotations.class, args);
  21. }
  22. }

向以下网址http://localhost:8080/user/发出请求,将调用login()方法。 注意,注释login()方法的@RequestMapping没有参数。

在类级别使用的@RequestMapping("/user/*")注释用作兜底方法,以使用/*表示的不同路径来处理所有请求。

请求http://localhost:8080/user/logout将调用logout()方法。 @GetMapping注释是一个组合的注释,用作@RequestMapping(method = RequestMethod.GET)

您可以在我们的 GitHub 存储库中找到本教程中的代码示例。