51工具盒子

依楼听风雨
笑看云卷云舒,淡观潮起潮落

Spring MVC 教程

1、概览 {#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 是啥? {#2spring-mvc-是啥}

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

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

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

3、使用 Java 配置的 Spring MVC {#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 {#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 {#5controller-和-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 {#6spring-boot}

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

6.1、Spring Boot Starter {#61spring-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 入口点 {#62spring-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、总结 {#7总结}

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


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

赞(3)
未经允许不得转载:工具盒子 » Spring MVC 教程