2.4使用视图控制器

2.4使用视图控制器

到目前为止,已经为Taco Cloud应用程序编写了三个控制器。尽管每个控制器在应用程序的功能上都有不同的用途,但它们几乎都遵循相同的编程模型:

  • 它们都用@Controller进行了注释,以表明它们是控制器类,应该由Spring组件扫描自动发现,并在Spring应用程序上下文中作为bean进行实例化。
  • 除了HomeController之外,所有的控制器都在类级别上使用@RequestMapping进行注释,以定义控制器将处理的基本请求模式。
  • 它们都有一个或多个方法,这些方法都用@GetMapping@PostMapping进行了注释,以提供关于哪些方法应该处理哪些请求的细节。

即将编写的大多数控制器都将遵循这种模式。但是,如果一个控制器足够简单,不填充模型或流程输入(就像HomeController一样,那么还有另一种定义控制器的方法。请查看下一个程序清单,了解如何声明视图控制器 —— 一个只将请求转发给视图的控制器。程序清单2.15声明视图控制器。

package tacos.web;

import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.ViewControllerRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;

@Configuration
public class WebConfig implements WebMvcConfigurer {

    @Override
    public void addViewControllers(ViewControllerRegistry registry) {
        registry.addViewController("/").setViewName("home");
    }
}

关于@WebConfig最值得注意的是它实现了WebMvcConfigurer接口。WebMvcConfigurer定义了几个配置Spring MVC的方法。尽管它是一个接口,但它提供了所有方法的默认实现,因此只需覆盖所需的方法。在本例中,覆盖了addViewControllers()方法。

addViewControllers()方法提供了一个ViewControllerRegistry,可以使用它来注册一个或多个视图控制器。在这里,在注册表上调用addViewController(),传入 “/”,这是视图控制器处理GET请求的路径。该方法返回一个ViewControllerRegistration对象,在该对象上立即调用setViewName()来指定home作为应该转发 “/” 请求的视图。

就像这样,已经能够用配置类中的几行代码替换HomeController。现在可以删除HomeController,应用程序的行为应该与以前一样。惟一需要做的其他更改是重新访问第1章中的HomeControllerTest,从@WebMvcTest注释中删除对HomeController的引用,这样测试类就可以无错误地编译了。

这里,已经创建了一个新的WebConfig配置类来存放视图控制器声明。但是任何配置类都可以实现WebMvcConfigurer并覆盖addViewController()方法。例如,可以将相同的视图控制器声明添加到引导TacoCloudApplication类中,如下所示:

@SpringBootApplication
public class TacoCloudApplication implements WebMvcConfigurer {

    public static void main(String[] args) {
        SpringApplication.run(TacoCloudApplication.class, args);
    }

    @Override
    public void addViewControllers(ViewControllerRegistry registry) {
        registry.addViewController("/").setViewName("home");
    }
}

通过扩展现有的配置类,可以避免创建新的配置类,从而降低项目工件数量。但是我倾向于为每种配置(web、数据、安全性等等)创建一个新的配置类,保持应用程序引导配置的简洁。

说到视图控制器,更一般地说,是控制器将请求转发给的视图,到目前为止,已经为所有视图使用了Thymeleaf。我非常喜欢Thymeleaf,但也许你更喜欢应用程序视图的不同模板模型。让我们看看Spring支持的许多视图选项。

上一页
下一页