1. SpringMVC简介
- SpringMVC是一种基于Java实现MVC模型的轻量级Web框架
- 优点
- 使用简单,开发便捷(相比于Servlet)
- 灵活性强
2. 入门案例
2.1 实现步骤分析
1 创建web工程(Maven结构)
2 设置tomcat服务器,加载web工程(tomcat插件)
3 导入坐标(SpringMVC+Servlet)
4 定义处理请求的功能类(UserController)
5 编写SpringMVC配置类,加载处理请求的Bean。
6 加载SpringMVC配置,并设置SpringMVC请求拦截的路径
2.2 代码实现
2.2.1 创建web工程(Maven结构)
补全java源代码目录
2.2.2 设置tomcat服务器,加载web工程(tomcat插件
<build>
<plugins>
<plugin>
<groupId>org.apache.tomcat.maven</groupId>
<artifactId>tomcat7-maven-plugin</artifactId>
<version>2.1</version>
<configuration>
<port>80</port>
<path>/</path>
</configuration>
</plugin>
</plugins>
</build>
2.2.3 导入坐标(SpringMVC+Servlet)
- 基于Spring主版本5.2.10.RELEASE制作
- 导入spring-webmvc坐标自动依赖spring相关坐标
<dependencies>
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>javax.servlet-api</artifactId>
<version>3.1.0</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-webmvc</artifactId>
<version>5.2.10.RELEASE</version>
</dependency>
</dependencies>
2.2.4 定义处理请求的功能类(LoginController)
package com.zhang.controller;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;
//定义表现层控制器bean
@Controller
public class LoginController {
//设置映射路径为/login,即外部访问路径
@RequestMapping("/login")
@ResponseBody //设置当前操作返回结果为指定json数据(本质上是一个字符串信息)
public String login(){
System.out.println("登录成功");
return "login successfully";
}
}
注意事项:
对于SpringMVC而言,Controller方法返回值默认表示要跳转的页面,没有对应的页面就会报错。如果不想跳转页面而是响应数据,那么就需要在方法上使用@ResponseBody注解。
2.2.5 编写SpringMVC配置类,加载处理请求的Bean。
package com.zhang.config;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;
//springmvc配置类,本质上还是一个spring配置类
@Configuration
@ComponentScan("com.zhang.controller")
public class SpringMvcConfig {
}
2.2.6 加载SpringMVC配置,并设置SpringMVC请求拦截的路径
定义一个类继承AbstractDispatcherServletInitializer
package com.zhang.config;
import org.springframework.web.context.WebApplicationContext;
import org.springframework.web.context.support.AnnotationConfigWebApplicationContext;
import org.springframework.web.servlet.support.AbstractDispatcherServletInitializer;
//web容器配置类
public class ServletContainersInitConfig extends AbstractDispatcherServletInitializer {
//加载springmvc配置类,产生springmvc容器(本质还是spring容器)
protected WebApplicationContext createServletApplicationContext() {
AnnotationConfigWebApplicationContext webApplicationContext = new AnnotationConfigWebApplicationContext();
//加载指定配置类
webApplicationContext.register(SpringMvcConfig.class);
return webApplicationContext;
}
//设置由springmvc控制器处理的请求映射路径
protected String[] getServletMappings() {
return new String[]{"/"};
}
//加载spring配置类
protected WebApplicationContext createRootApplicationContext() {
return null;
}
}
运行结果
2.3 案例注解解析
2.3.1 @Controller注解
- 名称:@Controller
- 类型:类注解
- 位置:SpringMVC控制器类定义上方
- 作用:设定SpringMVC的核心控制器bean
- 范例
@Controller
public class UserController {
}
2.3.2 @RequestMapping注解
- 名称:@RequestMapping
- 类型:方法注解
- 位置:SpringMVC控制器方法定义上方
- 作用:设置当前控制器方法请求访问路径
- 范例
@RequestMapping("/save")
public void save(){
System.out.println("user save ...");
}
2.3.3 @ResponseBody注解
- 名称:@ResponseBody
- 类型:方法注解
- 位置:SpringMVC控制器方法定义上方
- 作用:设置当前控制器方法响应内容为当前返回值,无需解析
- 范例
@RequestMapping("/save")
@ResponseBody
public String save(){
System.out.println("user save ...");
return "{'info':'springmvc'}";
}
2.4 案例类解析
AbstractDispatcherServletInitializer类
-
AbstractDispatcherServletInitializer类是SpringMVC提供的快速初始化Web3.0容器的抽象类
-
AbstractDispatcherServletInitializer提供三个接口方法供用户实现
- createServletApplicationContext()方法,创建Servlet容器时,加载SpringMVC对应的bean并放入WebApplicationContext对象范围中,而WebApplicationContext的作用范围为ServletContext范围,即整个web容器范围。
//加载springmvc配置类,产生springmvc容器(本质还是spring容器) protected WebApplicationContext createServletApplicationContext() { AnnotationConfigWebApplicationContext ctx = new AnnotationConfigWebApplicationContext(); ctx.register(SpringMvcConfig.class); return ctx; }
- getServletMappings()方法,设定SpringMVC对应的请求映射路径,设置为/表示拦截所有请求,任意请求都将转入到SpringMVC进行处理。
//设置由springmvc控制器处理的请求映射路径 protected String[] getServletMappings() { return new String[]{"/"}; }
- createRootApplicationContext()方法,如果创建Servlet容器时需要加载非SpringMVC对应的bean,使用当前方法进行,使用方式同createServletApplicationContext()
//加载spring配置类 protected WebApplicationContext createRootApplicationContext() { return null; }
3. 入门案例工作流程分析
3.1 启动服务器初始化过程
- 服务器启动,执行ServletContainersInitConfig类,初始化web容器
- 执行createServletApplicationContext方法,创建了WebApplicationContext对象
- 加载SpringMvcConfig配置类
- 执行@ComponentScan加载对应的bean
- 加载LoginController,每个@RequestMapping的名称对应一个具体的方法
- 执行getServletMappings方法,定义所有的请求都通过SpringMVC
3.2 单次请求过程
- 发送请求localhost/login
- web容器发现所有请求都经过SpringMVC,将请求交给SpringMVC处理
- 解析请求路径/login
- 由/login匹配执行对应的方法login()
- 执行login()
- 检测到有@ResponseBody直接将login()方法的返回值作为响应求体返回给请求方
ing的名称对应一个具体的方法
6. 执行getServletMappings方法,定义所有的请求都通过SpringMVC
3.2 单次请求过程
- 发送请求localhost/login
- web容器发现所有请求都经过SpringMVC,将请求交给SpringMVC处理
- 解析请求路径/login
- 由/login匹配执行对应的方法login()
- 执行login()
- 检测到有@ResponseBody直接将login()方法的返回值作为响应求体返回给请求方