目录
【AbstractDispatcherServletInitializer类】
【SpringMVC】
【概述】
SpringMVC是一种基于Java实现MVC模型的轻量级Web框架
【优点】
- 使用简单,开发便捷(相比于Servlet)
- 灵活性强
【开发流程】
- 创建web工程(Maven结构)
- 设置tomcat服务器,加载web工程(tomcat插件)
- 导入坐标(SpringMVC+Servlet)
- 定义处理请求的功能类(UserController)
- 设置请求映射(配置映射关系)
- 将SpringMVC设定加载到Tomcat容器中
【使用】
1、导入SpringMVC坐标与Servlet坐标
<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、初始化SpringMVC环境(同Spring环境)
@Configuration
public class SpringMvcConfig {
}
3、创建SpringMVC控制器,设定请求方法的返回值为字符串类型,并返回自定义json数据
@Controller
public class UserController {
@RequestMapping("/save")
@ResponseBody
public String save(){
System.out.println("user save...");
return "{'info':'SpringMVC'}";
}
}
4、设定SpringMVC加载对应的bean
@Configuration
@ComponentScan("com.itheima.controller")
public class SpringMvcConfig {
}
5、初始化Servlet容器,加载SpringMVC环境,并设置SpringMVC请求拦截的路径
public class ServletContainersInitConfig extends AbstractDispatcherServletInitializer {
//加载SpringMVC对应的容器对象
@Override
protected WebApplicationContext createServletApplicationContext() {
AnnotationConfigWebApplicationContext ctx=new AnnotationConfigWebApplicationContext();
ctx.register(SpringMvcConfig.class);
return ctx;
}
//设置SpringMVC所管理的请求
@Override
protected String[] getServletMappings() {
return new String[]{"/"};
}
//加载Spring对应的容器对象
@Override
protected WebApplicationContext createRootApplicationContext() {
return null;
}
}
【注解】
【@Controller】
- 名称:@Controller
- 类型:类注解
- 作用:设定SpringMVC的核心控制器bean
例:
@Controller
public class UserController {
}
【@RequestMapping】
- 名称:@RequestMapping
- 类型:方法注解
- 作用:设置当前控制器方法请求访问路径
例:
@RequestMapping("/save")
public void save(){
System.out.println("user save ...");
}
【相关属性】
value(默认):请求访问路径
【@ResponseBody】
- 名称:@ResponseBody
- 类型:方法注解
- 作用:设置当前控制器方法响应内容为当前返回值,无需解析
例:
@Controller
public class UserController {
@RequestMapping("/save")
@ResponseBody
public String save(){
System.out.println("user save...");
return "{'info':'SpringMVC'}";
}
}
【AbstractDispatcherServletInitializer类】
【概述】
SpringMVC提供的快速初始化Web3.0容器的抽象类
【三个接口方法可实现】
1、createServletApplicationContext()方法
【作用】
创建Servlet容器时,加载SpringMVC对应的bean并放入WebApplicationContext对象范围中,而WebApplicationContext的作用范围为ServletContext范围,即整个web容器范围
例:
protected WebApplicationContext createServletApplicationContext() {
AnnotationConfigWebApplicationContext ctx=new AnnotationConfigWebApplicationContext();
ctx.register(SpringMvcConfig.class);
return ctx;
}
2、getServletMappings()方法
【作用】
设定SpringMVC对应的请求映射路径,设置为/表示拦截所有请求,任意请求都将转入到SpringMVC进行处理
例:
protected String[] getServletMappings() {
return new String[]{"/"};
}
3、createRootApplicationContext()方法
【作用】
如果创建Servlet容器时需要加载非SpringMVC对应的bean,使用当前方法进行,使用方式同createServletApplicationContext()
例:
protected WebApplicationContext createRootApplicationContext() {
return null;
}
【Controller加载控制】
Spring相关bean加载控制
- 方式一:Spring加载的bean设定扫描范围为com.itheima,排除掉controller包内的bean
- 方式二:Spring加载的bean设定扫描范围为精准范围,例如service包、dao包等
- 方式三:不区分Spring与SpringMVC的环境,加载到同一个环境中
【@ComponentScan】
- 名称:@ComponentScan
- 类型:类注解
例:
@Configuration
@ComponentScan(value = "com.itheima",
excludeFilters = @ComponentScan.Filter(
type = FilterType.ANNOTATION,
classes = Controller.class
)
)
public class SpringConfig {
}
【属性】
- excludeFilters:排除扫描路径中加载的bean,需要指定类别(type)与具体项(classes)
- includeFilters:加载指定的bean,需要指定类别(type)与具体项(classes)
【bean的加载格式】
public class ServletContainersInitConfig extends AbstractDispatcherServletInitializer {
@Override
protected WebApplicationContext createServletApplicationContext() {
AnnotationConfigWebApplicationContext ctx=new AnnotationConfigWebApplicationContext();
ctx.register(SpringMvcConfig.class);
return ctx;
}
@Override
protected WebApplicationContext createRootApplicationContext() {
AnnotationConfigWebApplicationContext ctx=new AnnotationConfigWebApplicationContext();
ctx.register(SpringConfig.class);
return ctx;
}
@Override
protected String[] getServletMappings() {
return new String[]{"/"};
}
}
简化:
public class ServletContainersInitConfig extends AbstractAnnotationConfigDispatcherServletInitializer{
protected Class<?>[] getServletConfigClasses() {
return new Class[]{SpringMvcConfig.class};
}
protected String[] getServletMappings() {
return new String[]{"/"};
}
protected Class<?>[] getRootConfigClasses() {
return new Class[]{SpringConfig.class};
}
}
【Postman】
【概述】
Postman是一款功能强大的网页调试与发送网页HTTP请求的Chrome插件
【作用】
常用于进行接口测试
【请求与响应】
【请求映射路径】
【@RequestMapping】
- 名称:@RequestMapping
- 类型:方法注解 类注解
- 作用:设置当前控制器方法请求访问路径,如果设置在类上统一设置当前控制器方法请求访问路径前缀
- 属性:value(默认):请求访问路径或访问路径前缀
例:
@Controller
@RequestMapping("/user")
public class UserController {
@RequestMapping("/save")
@ResponseBody
public String save(){
System.out.println("user save...");
return "{'module':'user save'}";
}
@RequestMapping("/delete")
@ResponseBody
public String delete(){
System.out.println("user delete...");
return "{'module':'user delete'}";
}
}
【请求方式】
【Get请求】
普通参数:url地址传参,地址参数名与形参变量名相同,定义形参即可接收参数
【Post请求】
普通参数:form表单post请求传参,表单参数名与形参变量名相同,定义形参即可接收参数
【Post请求中文乱码处理】
为web容器添加过滤器并指定字符集,Spring-web包中提供了专用的字符过滤器
// 配字符编码过滤器
@Override
protected Filter[] getServletFilters() {
CharacterEncodingFilter filter = new CharacterEncodingFilter();
filter.setEncoding("utf-8");
return new Filter[]{filter};
}
【注意】
多个过滤器写法:{filter1,filter2,...}
【接收】
Get和Post请求的接收参数方法一致
//普通参数
@RequestMapping("/commonParam")
@ResponseBody
public String commonParam(String name, int age) {
System.out.println("普通参数传递 name==>" + name);
System.out.println("普通参数传递 age==>" + age);
return "{'module':'common param'}";
}
【请求参数】
【种类】
【普通参数】
url地址传参,地址参数名与形参变量名相同,定义形参即可接收参数,若请求参数名与形参变量名不同,使用@RequestParam绑定参数关系
//普通参数不同名
@RequestMapping("/commonParamDifferentName")
@ResponseBody
public String commonParamDifferentName(@RequestParam("name") String username, int age) {
System.out.println("普通参数传递 name==>" + username);
System.out.println("普通参数传递 age==>" + age);
return "{'module':'common param different name'}";
}
【@RequestParam】
- 类型:形参注解
- 位置:SpringMVC控制器方法形参定义前面
- 作用:绑定请求参数与处理器方法形参间的关系
- 参数:
- required:是否为必传参数
- defaultValue:参数默认值
【POJO参数】
请求参数名与形参对象属性名相同,定义POJO类型形参即可接收参数
//pojo参数
@RequestMapping("/pojoParam")
@ResponseBody
public String pojoParam(User user) {
System.out.println("pojo参数传递 user==>" + user);
return "{'module':'pojo param'}";
}
【嵌套pojo参数:POJO对象中包含POJO对象】
请求参数名与形参对象属性名相同,按照对象层次结构关系即可接收嵌套POJO属性参数
//pojo嵌套参数
@RequestMapping("/pojoContainPojoParam")
@ResponseBody
public String pojoContainPojoParam(User user) {
System.out.println("pojo嵌套pojo参数传递 user==>" + user);
return "{'module':'pojo contain pojo param'}";
}
【数组参数】
请求参数名与形参对象属性名相同且请求参数为多个,定义数组类型形参即可接收参数
//数组参数
@RequestMapping("/arrayParam")
@ResponseBody
public String arrayParam(String[] likes){
System.out.println("数组参数传递 likes ==> "+ Arrays.toString(likes));
return "{'module':'array param'}";
}
【集合保存普通参数】
请求参数名与形参集合对象名相同且请求参数为多个,@RequestParam绑定参数关系
//集合参数
@RequestMapping("/listParam")
@ResponseBody
public String listParam(@RequestParam List<String> likes) {
System.out.println("集合参数传递 likes ==> " + likes);
return "{'module':'list param'}";
}
【json数组】
1、添加json数据转换坐标
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
<version>2.9.0</version>
</dependency>
2、开启自动转换json数据的支持
【@EnableWebMvc】
- 类型:配置类注解
- 作用:开启SpringMVC多项辅助功能
例:
@EnableWebMvc
public class SpringMvcConfig {
}
3、设置发送json数据(请求body中添加json数据)
4、设置接收json数据
//集合参数:Json格式
@RequestMapping("/listParamForJson")
@ResponseBody
public String listParamForJson(@RequestBody List<String> likes) {
System.out.println("list common(json)参数传递 likes ==> " + likes);
return "{'module':'list common for json param'}";
}
【@RequestBody】
- 名称:@RequestBody
- 类型:形参注解
- 作用:将请求中请求体所包含的数据传递给请求参数,此注解一个处理器方法只能使用一次
【json对象(POJO)】
POJO参数:json数据与形参对象属性名相同,定义POJO类型形参即可接收参数
1、2、同【json数组】
3、设置发送json数据(请求body中添加json数据)
4、设置接收json数据
//pojo参数:Json格式
@RequestMapping("/pojoParamForJson")
@ResponseBody
public String pojoParamForJson(@RequestBody User user) {
System.out.println("pojo(json)参数传递 user==>" + user);
return "{'module':'pojo for json param'}";
}
【json数组(POJO)】
POJO集合参数:json数组数据与集合泛型属性名相同,定义List类型形参即可接收参数
1、2、同【json数组】
3、设置发送json数据(请求body中添加json数据)
4、设置接收json数据
//集合pojo参数:Json格式
@RequestMapping("/listPojoParamForJson")
@ResponseBody
public String listPojoParamForJson(@RequestBody List<User> list) {
System.out.println("list pojo(json)参数传递 list ==> " + list);
return "{'module':'list pojo for json param'}";
}
【注意】
@RequestBody与@RequestParam区别
- @RequestParam用于接收url地址传参,表单传参【application/x-www-form-urlencoded】
- @RequestBody用于接收json数据【application/json】
【日期类型参数】
日期类型数据基于系统不同格式也不尽相同
- 2088-08-18
- 2088/08/18
- 08/18/2088
接收形参时,根据不同的日期格式设置不同的接收方式
//日期参数
@RequestMapping("/dataParam")
@ResponseBody
public String dataParam(Date date, @DateTimeFormat(pattern = "yyyy-MM-dd") Date date1, @DateTimeFormat(pattern = "yyyy/MM/dd HH:mm:ss") Date date2) {
System.out.println("参数传递 date ==> " + date);
System.out.println("参数传递 date(yyyy-MM-dd) ==> " + date1);
System.out.println("参数传递 date(yyyy/MM/dd HH:mm:ss) ==> " + date2);
return "{'module':'data param'}";
}
【@DateTimeFormat】
- 名称:@DateTimeFormat
- 类型:形参注解
- 作用:设定日期时间型数据格式
- 属性:pattern:日期时间格式字符串
例:
@RequestMapping("/dataParam")
@ResponseBody
public String dataParam(Date date){
System.out.println("参数传递 date ==> "+date);
return "{'module':'data param'}";
}
【类型转换器:Converter接口】
public interface Converter<S, T> {
@Nullable
T convert(S var1);
}
【功能】
- 请求参数年龄数据(String→Integer)
- json数据转对象(json → POJO)
- 日期格式转换(String → Date)
【注意】
@EnableWebMvc功能之一:根据类型匹配对应的类型转换器
使用类型转换器时要开启@EnablWebMvc
【响应】
【@ResponseBody】
- 名称:@ResponseBody
- 类型:方法注解
- 作用:设置当前控制器返回值作为响应体
例:
@RequestMapping("/save")
@ResponseBody
public String save(){
System.out.println("save...");
return "{'info':'springmvc'}";
}
【类型转换器:HttpMessageConverter接口】
public interface HttpMessageConverter<T> {
boolean canRead(Class<?> clazz, @Nullable MediaType mediaType);
boolean canWrite(Class<?> clazz, @Nullable MediaType mediaType);
List<MediaType> getSupportedMediaTypes();
T read(Class<? extends T> clazz, HttpInputMessage inputMessage)
throws IOException, HttpMessageNotReadableException;
void write(T t, @Nullable MediaType contentType, HttpOutputMessage outputMessage)
throws IOException, HttpMessageNotWritableException;
}
【响应页面】
http://localhost:8080/toJumpPage
//响应页面/跳转页面
@RequestMapping("/toJumpPage")
public String toJumpPage(){
System.out.println("跳转页面");
return "page.jsp";
}
【响应文本数据】
//响应文本数据
@RequestMapping("/toText")
@ResponseBody
public String toText(){
System.out.println("返回纯文本数据");
return "response text";
}
【响应Json数据(对象转json)】
//响应POJO对象
@RequestMapping("/toJsonPOJO")
@ResponseBody
public User toJsonPOJO(){
System.out.println("返回json对象数据");
User user=new User();
user.setName("zhangsan");
user.setAge(15);
return user;
}
【响应Json数据(对象集合转json数组)】
//响应POJO对象
@RequestMapping("/toJsonList")
@ResponseBody
public List<User> toJsonList(){
System.out.println("返回json对象数据");
User user1=new User();
user1.setName("zhangsan");
user1.setAge(15);
User user2=new User();
user2.setName("lisi");
user2.setAge(12);
List<User> userList=new ArrayList<>();
userList.add(user1);
userList.add(user2);
return userList;
}