Contents

Spring MVC教程

1.概述

这是一个简单的Spring MVC 教程,展示了如何使用基于 Java 的配置和 XML 配置来设置 Spring MVC 项目。 Spring MVC 项目的 Maven 依赖项 一文中有详细描述。

2.什么是Spring MVC?

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

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

简而言之,DispatcherServlet充当将请求路由到预期目的地的主控制器。模型只不过是我们应用程序的数据,视图由各种模板引擎 中的任何一个表示。

稍后我们将在示例中查看 JSP。

3. Spring MVC 使用 Java 配置

要通过 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*视图。

这里非常重要的是,我们可以注册视图控制器, 使用ViewControllerRegistry在 URL 和视图名称之间创建直接映射。这样,两者之间就不需要任何 Controller 了。

如果我们还想定义和扫描控制器类,我们可以在包含控制器的包中添加*@ComponentScan*注解:

@EnableWebMvc
@Configuration
@ComponentScan(basePackages = { "com.blogdemo.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.blogdemo");
        sc.addListener(new ContextLoaderListener(root));
        ServletRegistration.Dynamic appServlet = 
          sc.addServlet("mvc", new DispatcherServlet(new GenericWebApplicationContext()));
        appServlet.setLoadOnStartup(1);
        appServlet.addMapping("/");
    }
}

请注意,对于 Spring 5 之前的版本,我们必须使用WebMvcConfigurerAdapter类而不是接口。

4. Spring MVC 使用XML配置

除了上面的 Java 配置,我们还可以使用纯 XML 配置:

<context:component-scan base-package="com.blogdemo.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 MVC

Spring Boot 是 Spring 平台的一个补充,它使得开始和创建独立的生产级应用程序变得非常容易。Boot 的目的不是要取代 Spring,而是要使它的使用更快更容易。

6.1. Spring Boot 启动器

新框架提供了方便的启动依赖项,这些依赖项描述符可以为特定功能引入所有必要的技术。 这些的优点是我们不再需要为每个依赖项指定一个版本,而是允许启动器为我们管理依赖项。 最快的入门方法是添加spring-boot-starter-parent pom.xml

<parent>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-parent</artifactId>
    <version>2.6.1</version>
</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 设置前端,而无需使用第 3 节中定义的 ViewResolver。通过将spring-boot-starter-thymeleaf依赖项添加到我们的 pom.xml,Thymeleaf 被启用,并且不需要额外的配置。

最后,如果您希望开始使用 Spring Boot,请在此处查看我们的参考介绍