Spring MVC是Spring Framework的一部分,是一个基于Java的Web应用程序开发框架。它提供了一种模型-视图-控制器(Model-View-Controller,MVC)的架构模式来构建灵活、可扩展和松耦合的Web应用程序。
在Spring MVC中,应用程序被划分为以下几个主要组件:
-
模型(Model):模型表示应用程序的数据和业务逻辑。它可以是POJO(Plain Old Java Object)类、或者是与数据库交互的领域对象,负责封装和处理数据。
-
视图(View):视图负责展示模型数据给用户,并接收用户的输入。它可以使用JSP(JavaServer Pages)、Thymeleaf、HTML等模板技术来呈现最终的用户界面。
-
控制器(Controller):控制器是MVC的核心,负责接收用户的请求并进行处理。它根据请求的处理逻辑选择相应的模型和视图,并将处理结果返回给用户。
Spring MVC框架提供了一系列的组件和功能,用于帮助开发人员构建Web应用程序:
-
DispatcherServlet(调度器):作为核心控制器,负责接收所有的HTTP请求并将其分派给相应的处理器进行处理。
-
HandlerMapping(处理器映射器):根据请求的URL路径或其他条件,将请求映射到适当的处理器。
-
Handler(处理器):执行实际的业务逻辑,处理请求,并返回模型数据和视图信息。
-
ViewResolver(视图解析器):根据视图名称解析出具体的视图对象。
-
View(视图):负责展示模型数据,并最终生成响应结果。
Spring MVC还提供了处理数据绑定、表单验证、异常处理、国际化等常见Web开发任务的支持。它与Spring Framework的其他模块(如Spring Data、Spring Security等)无缝集成,为开发者提供了一种完整的、一致的编程模型。
下面是一个基于 Spring MVC 的详细案例,包括 Java 配置文件的编写:
1.创建一个 Maven 项目,添加以下依赖,并导入相关的库文件:
<dependencies>
<!-- Spring MVC -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-webmvc</artifactId>
<version>5.3.9</version>
</dependency>
<!-- JSP 支持 -->
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>jstl</artifactId>
<version>1.2</version>
</dependency>
<!-- Servlet API -->
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>javax.servlet-api</artifactId>
<version>4.0.1</version>
<scope>provided</scope>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.apache.tomcat.maven</groupId>
<artifactId>tomcat7-maven-plugin</artifactId>
<version>2.1</version>
<configuration>
<port>8080</port>
<path>/</path>
</configuration>
</plugin>
</plugins>
</build>
2. 创建一个配置类 AppConfig.java,用于替代传统的 XML 配置文件:
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.EnableWebMvc;
@Configuration
@EnableWebMvc
@ComponentScan(basePackages = "com.example")
public class AppConfig {
}
3.创建一个控制器类 HelloController.java,处理请求并返回相应的视图:
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
@Controller
public class HelloController {
@RequestMapping(value = "/hello", method = RequestMethod.GET)
public String hello(Model model) {
String message = "Hello, World!";
model.addAttribute("message", message);
return "hello";
}
}
4.创建一个 JSP 视图 hello.jsp,用于展示消息内容:
<!DOCTYPE html>
<html>
<head>
<title>Hello</title>
</head>
<body>
<h1>${message}</h1>
</body>
</html>
5.创建一个启动类 AppInitializer.java,初始化 Spring MVC 配置:
import org.springframework.web.context.WebApplicationContext;
import org.springframework.web.context.support.AnnotationConfigWebApplicationContext;
import org.springframework.web.servlet.support.AbstractDispatcherServletInitializer;
public class ServletContainersInitConfig extends AbstractDispatcherServletInitializer {
//加载mvc容器的配置
@Override
protected WebApplicationContext createServletApplicationContext() {
AnnotationConfigWebApplicationContext ctx = new
AnnotationConfigWebApplicationContext();
ctx.register(SpringMvcConfig.class);
return ctx;
}
//设置那些请求归属mvc处理
@Override
protected String[] getServletMappings() {
return new String[]{"/"};
}
//加载springmvc容器配置
@Override
protected WebApplicationContext createRootApplicationContext() {
return null;
}
}
通过以上步骤,创建了一个简单的 Spring MVC 示例。当访问应用程序的根路径或 /hello 路径时,将调用 HelloController 中的 hello() 方法,然后返回 hello.jsp 视图,显示 "Hello, World!" 消息。
启动服务器初始化过程
- 服务器启动,执行ServletContainersInitConfig类,初始化web容器
- 执行createServletApplicationContext方法,创建了WebApplicationContext对象
- 加载SpringMvcConfig对应的bean
- 执行@ComponentScan
- 加载UserController,每个@RequestMapping的名称对应一个具体的方法
- 执行getServletMappings方法,定义所有的请求都通过SpringMVC
单次请求过程
- 发送请求localhost/save
- web容器发现所有请求都经过SpringMVC,将请求交给SpringMVC处理
- 解析请求路径/save
- 由/save匹配执行对应的方法save()
- 执行save()
- 检测到有@ResponseBody直接将save()方法的返回值作为响应求体返回给请求方
SpringMVC入门程序开发总结 (1+N)
一次性工作:
- 创建工程,设置服务器,加载工程
- 导入坐标
- 创建web容器启动类,加载SpringMVC配置,并设置SpringMVC请求拦截路径
- SpringMvC核心配置类(设置配置类,扫描controller包,加载Controller控制器bean)
多次工作:
- 定义处理请求的控制器类
- 定义处理请求的控制器方法,并配置映射路径 (@RequestMapping) 与返json数据 (@ResponseBody)