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