1. 概述
這是一個簡單的 Spring MVC 教程,展示瞭如何設置 Spring MVC 項目,包括使用 Java 方式的配置以及 XML 配置。
Spring MVC 項目的 Maven 依賴項在 Spring MVC 依賴項 文章中進行了詳細描述。
2. Spring MVC 簡介
正如其名稱所示,它是由 Spring 框架提供的模塊,處理 Model-View-Controller (MVC) 模式。 它將 MVC 模式的所有優點與 Spring 的便利性相結合。
Spring 使用 Front Controller 模式通過其 DispatcherServlet 實現 MVC。
簡而言之,DispatcherServlet 作為主要的控制器,負責將請求路由到其目的地。 Model 僅僅是應用程序的數據,而 View 由各種模板引擎表示。
稍後我們將探討 JSPs。
3. 使用 Java 配置進行 Spring MVC 支持
為了通過 Java 配置類啓用 Spring MVC 支持,只需添加 <em @EnableWebMvc 註解:
@EnableWebMvc
@Configuration
public class WebConfig {
/// ...
}這將設置我們 MVC 項目所需的基本支持,例如註冊控制器和映射、類型轉換器、驗證支持、消息轉換器和異常處理。
如果想要自定義此配置,則需要實現 WebMvcConfigurer 接口:
@EnableWebMvc
@Configuration
public class WebConfig implements WebMvcConfigurer {
@Override
public void addViewControllers(ViewControllerRegistry registry) {
registry.addViewController("/").setViewName("index");
}
@Bean
public ViewResolver viewResolver() {
InternalResourceViewResolver bean = new InternalResourceViewResolver();
bean.setViewClass(JstlView.class);
bean.setPrefix("/WEB-INF/view/");
bean.setSuffix(".jsp");
return bean;
}
}在本示例中,我們已註冊了一個 ViewResolver Bean,它將從 /WEB-INF/view 目錄返回 .jsp 視圖。
這裏非常重要的一點是,我們可以註冊 View 控制器,從而在 URL 和視圖名稱之間建立直接映射,這通過使用 ViewControllerRegistry 實現。 這樣就無需在兩者之間添加任何 Controller。
如果我們也想定義和掃描控制器類,則可以添加帶有控制器的包名的 @ComponentScan 註解:
@EnableWebMvc
@Configuration
@ComponentScan(basePackages = { "com.baeldung.web.controller" })
public class WebConfig implements WebMvcConfigurer {
// ...
}為了啓動加載此配置的應用程序,我們還需要一個初始化器類:
public class MainWebAppInitializer implements WebApplicationInitializer {
@Override
public void onStartup(final ServletContext sc) throws ServletException {
AnnotationConfigWebApplicationContext root =
new AnnotationConfigWebApplicationContext();
root.scan("com.baeldung");
sc.addListener(new ContextLoaderListener(root));
ServletRegistration.Dynamic appServlet =
sc.addServlet("mvc", new DispatcherServlet(new GenericWebApplicationContext()));
appServlet.setLoadOnStartup(1);
appServlet.addMapping("/");
}
}請注意,在 Spring 5 之前的版本中,我們必須使用 WebMvcConfigurerAdapter 類,而不是接口。
4. 使用 XML 配置的 Spring MVC
相比於上述的 Java 配置,我們也可以使用純 XML 配置:
<context:component-scan base-package="com.baeldung.web.controller" />
<mvc:annotation-driven />
<bean id="viewResolver"
class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<property name="prefix" value="/WEB-INF/view/" />
<property name="suffix" value=".jsp" />
</bean>
<mvc:view-controller path="/" view-name="index" />
</beans>如果我們要使用純 XML 配置,還需要添加一個 web.xml 文件來啓動應用程序。有關此方法的更多詳細信息,請參閲我們之前的文章。
5. 控制器和視圖
讓我們來看一個基本的控制器示例:
@Controller
public class SampleController {
@GetMapping("/sample")
public String showForm() {
return "sample";
}
}並且對應的 JSP 資源文件是 sample.jsp 文件:
<html>
<head></head>
<body>
<h1>This is the body of the sample view</h1>
</body>
</html>基於JSP的視圖文件位於項目根目錄下的 /WEB-INF 文件夾中,因此只能通過 Spring 基礎設施訪問,不能直接通過 URL 訪問。
6. 使用 Spring Boot 與 Spring MVC
Spring Boot 是 Spring 平台的一個擴展,它極大地簡化了入門並創建獨立、生產級別的應用程序。 Boot 的目標不是取代 Spring,而是使其與 Spring 的使用更加快速和便捷。
6.1. Spring Boot Starter 啓動器
新的框架提供了便捷的啓動器依賴項,這些依賴項描述符可以引入特定功能的全部必要技術。
它們具有優勢,即我們無需為每個依賴項指定版本,而是允許啓動器代表我們管理依賴項。
快速入門的方法是添加 spring-boot-starter-parent 的 pom.xml:
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
</parent>這將處理依賴管理。
6.2. Spring Boot 啓動點
每個使用 Spring Boot 構建的應用程序只需要定義啓動點。
這通常是一個帶有 main 方法的 Java 類,並使用 @SpringBootApplication 註解:
@SpringBootApplication
public class Application {
public static void main(String[] args) {
SpringApplication.run(Application.class, args);
}
}
此註釋添加了以下其他註釋:
- @Configuration 標記該類為 Bean 定義的來源。
- @EnableAutoConfiguration 告訴框架根據類路徑上的依賴自動添加 Bean。
- @ComponentScan 在與 Application 類相同的包中或其下掃描其他配置和 Bean。
使用 Spring Boot,我們可以使用 Thymeleaf 或 JSP 而無需使用 ViewResolver,如第 3 節中所述。通過將 spring-boot-starter-thymeleaf 依賴添加到我們的 pom.xml 中,Thymeleaf 將被啓用,並且不需要進行任何額外的配置。
如果您想開始使用 Spring Boot,請查看此處我們的參考介紹。
7. 結論
本文介紹瞭如何配置一個簡單且功能完善的 Spring MVC 項目,使用了 Java 配置。
請注意,示例內容(如 http://localhost:8080/spring-mvc-basics-3/sample 以及 sample.jsp 等 JSP 視圖)位於安全的 WEB-INF 文件夾中,僅供內部 Spring 使用,不應直接通過 URL 訪問。