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,请在此处查看我们的参考介绍 。