Spring MVC 教程

1、概览

这是一个简单的 Spring MVC 教程,介绍如何通过基于 Java 的配置和 XML 配置来建立 Spring MVC 项目。

Spring MVC 依赖:

<dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-web</artifactId>
    <version>${org.springframework.version}</version>
</dependency>
<dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-webmvc</artifactId>
    <version>${org.springframework.version}</version>
</dependency>

2、Spring MVC 是啥?

顾名思义,它是 Spring 框架中处理模型(Model)- 视图(View)- 控制器(Controller)或 MVC 模式的一个模块。它结合了 MVC 模式的所有优点和 Spring 的便利性。

Spring 使用其 DispatcherServlet 前控制器模式实现 MVC。

简而言之,DispatcherServlet 是将请求路由到预定目的地的主要控制器。Model 只是应用的数据,而视图则由各种模板引擎来表示。

3、使用 Java 配置的 Spring MVC

要通过 Java 配置类启用 Spring MVC 支持,只需添加 @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 视图。

注意,可以注册视图控制器(ViewController),使用 ViewControllerRegistry 在 URL 和视图名称之间创建直接映射。这样,两者之间就不需要任何 Controller 了。

如果想自定义扫描 Controller 类,可以使用 @ComponentScan 注解,并指定包含 Controller 的包。

@EnableWebMvc
@Configuration
@ComponentScan(basePackages = { "com.baeldung.web.controller" })
public class WebConfig implements WebMvcConfigurer {
    // ...
}

为了引导应用加载该配置,还需要一个 Initializer 类:

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

也可以使用纯 XML 配置来代替上述 Java 配置:

<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 文件来引导应用。

<servlet>
    <servlet-name>dispatcher</servlet-name>
    <servlet-class>
        org.springframework.web.servlet.DispatcherServlet
    </servlet-class>
    <init-param>
        <param-name>contextConfigLocation</param-name>
        <param-value>/WEB-INF/spring/dispatcher-config.xml</param-value>
    </init-param>
    <load-on-startup>1</load-on-startup>
</servlet>

<servlet-mapping>
    <servlet-name>dispatcher</servlet-name>
    <url-pattern>/</url-pattern>
</servlet-mapping>

5、Controller 和 View

一个基本的 Controller 示例:

@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 Boot 是对 Spring 平台的补充,它能让你轻松上手并创建独立的生产级应用。Spring Boot 的目的不是取代 Spring,而是让使用 Spring 变得更快、更简单。

6.1、Spring Boot Starter

Spring Boot 提供了便捷的 Starter 依赖,这是一种依赖描述符,可以为特定功能引入所有必要的技术。

这样做的好处是,不再需要为每个依赖项指定版本,而是让 Starter 管理依赖。

最快捷的入门方法是在 pom.xml 中添加 spring-boot-starter-parent

<parent>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-parent</artifactId>
</parent>

这样就能解决依赖管理问题。

6.2、Spring Boot 入口点

使用 Spring Boot 构建的每个应用都需定义 main 入口点。

这通常是一个 Java 类,带有 main 方法,并用 @SpringBootApplication 进行注解:

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

该注解添加了以下其他注解:

  • @Configuration 将类标记为 bean 定义的来源。
  • @EnableAutoConfiguration 会告诉框架根据 classpath 上的依赖自动添加 Bean。
  • @ComponentScan 会扫描与 Application 类相同包或其子包中的其他配置和 Bean。

有了 Spring Boot,就可以使用 Thymeleaf 或 JSP 设置前端,而无需使用第 3 节中定义的 ViewResolver。在 pom.xml 中添加 spring-boot-starter-thymeleaf 依赖后,Thymeleaf 就会启用,无需额外配置。

对于 Spring Boot 的更多信息,你可以阅读 Spring Boot 中文文档

7、总结

本文介绍了如何通过 Java 配置或者是 XML 配置来构建一个 Spring MVC 应用,还介绍了 Spring Boot 中对于 Spring MVC 的支持。


Ref:https://www.baeldung.com/spring-mvc-tutorial