官术网_书友最值得收藏!

  • Spring實戰(第6版)
  • (美)克雷格·沃斯
  • 977字
  • 2022-12-20 19:14:52

到目前為止,我們已經為Taco Cloud應用編寫了3個控制器。這3個控制器盡管服務于應用程序的不同功能,但基本上遵循相同的編程模型:

它們都使用了@Controller注解,表明它們是控制器類,并且應該被Spring的組件掃描功能自動發現并初始化為Spring應用上下文中的bean;

除HomeController之外的控制器都在類級別使用了@RequestMapping注解,據此定義該控制器所處理的基本請求模式;

它們都有一個或多個帶@GetMapping或@PostMapping注解的方法,這些注解指明了該由哪個方法來處理某種類型的請求。

我們所編寫的大部分控制器都將遵循這個模式。但是,如果一個控制器非常簡單,不需要填充模型或處理輸入(在我們的場景中,也就是HomeController),那么還有另外一種方式來定義控制器。請參考程序清單2.16學習如何聲明視圖控制器——只將請求轉發到視圖而不做其他事情的控制器。

程序清單2.16 聲明視圖控制器

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對象,我們可以使用它注冊一個或多個視圖控制器。在這里,我們調用registry的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所能支持的眾多視圖方案。

主站蜘蛛池模板: 英德市| 云霄县| 翼城县| 桃源县| 长沙县| 陵川县| 长顺县| 新宁县| 扶绥县| 藁城市| 莆田市| 绵竹市| 大名县| 巨鹿县| 麦盖提县| 秀山| 彭山县| 察雅县| 灵川县| 双鸭山市| 昌江| 方城县| 察隅县| 崇明县| 微山县| 米脂县| 香港 | 志丹县| 廊坊市| 安仁县| 大渡口区| 翼城县| 盐城市| 溧水县| 河西区| 兰西县| 嘉峪关市| 夏河县| 禄丰县| 福州市| 合作市|