SpringMVC简介
SpringMVC技术与Servlet技术功能等同,均属于web层开发技术
SpringMVC是一种基于java实现MVC模型的轻量级Web框架
优点:
使用简单,开发便捷(相比于Servlet)
灵活性强
SpringMVC入门案例
1:使用SpringMVC技术需要先导入SpringMVC坐标与Servlet坐标
<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>
2:创建SpringMVC控制器类(等同于Servlet功能)
//2.定义controller
//2.1使用@Controller定义bean
@Controller
public class UserController {
//2.2设置当前操作的访问路径
@RequestMapping("/save")
//2.3设置当前操作的返回值类型
@ResponseBody
public String save(){
System.out.println("user save ...");
return "{'module':'springmvc'}";
}
}
3:初始化SpringMVC环境(同Spring环境),设定SpringMVC加载对应的bean
//3.创建springmvc的配置文件,加载controller对应的bean
@Configuration
@ComponentScan("com.lh.controller")
public class SpringMvcConfig {
}
4:初始化Servlet容器,加载SpringMVC环境,并设置SpringMVC技术处理的请求
//4.定义一个servlet容器启动的配置类,在里面加载spring的配置
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;
}
}
总结:
一次性工作:创建工程,设置服务器,加载工程
导入坐标
创建web容器启动类,加载SpringNVC配置,并设置SpringMVC请求拦截路径
SpringMVC核心配置类(设置配置类,扫描controller包,加载Controller控制器bean)
多次工作:定义处理请求的控制器类
定义处理请求的控制器方法,并配置映射路径(@RequestMapping)与返回json数据(@ResponseBody)
入门案例工作流程分析
启动服务器初始化过程:
1:服务器启动,执行ServletContainersInitConfig类,初始化web容器
2:执行createServletApplicationContext方法,创建了webApplicationContext对象
3:加载SpringMvcConfig
4:执行@ComponentScan加载对应的bean
5:加载UserController,每个@RequestMapping的名称对应一个具体的方法
6:执行getServletMappings方法,定义所有的请求都通过SpringMVC
单次请求过程:
1:发送请求localhost/save
2:web容器发现所有请求都经过SpringMVC,将请求交给SpringMVC处理
3:解析请求路径/save
4:由/save匹配执行对应的方法save()
5:执行save()
6:检测到有@ResponseBody直接将save()方法的返回值作为响应求体返回给请求方
Controller加载控制与业务bean加载控制
SpringMVC相关bean(表现层bean)
Spring控制的bean:业务bean(Service)、功能bean(DataSource等)
因为功能不同,如何避免Spring错误的加载到SpringMVC的bean——加载Spring控制的bean的时候排除掉SpringMVC控制的bean
SpringMVC相关bean加载控制:加载的对应的bean均在com.lh.controller包内
Spring相关bean加载控制:
方式一:Spring加载的bean设定扫描范围为com.lh,排除掉controller包内的bean
方式二:Spring加载的bean设定扫描范围为精准范围 ,例如service包、dao包等
方式三:不区分Spring与SpringMVC的环境,加载到同一环境中
PostMan简介
Postman是一款功能强大的网页调试与发送网页HTTP请求的Chrome插件
作用:常用于进行接口测试
请求与响应
请求
请求路径
团队多人开发,每人设置不同的请求路径,冲突问题如何解决——设置模块名作为请求路径前缀
@RequestMapping:设置当前控制器方法请求访问路径,如果设置在类上统一设置当前控制器方法请求访问路径前缀
@Controller
@RequestMapping("user")
public class UserController {
@RequestMapping("/save")
@ResponseBody
public String save(){
System.out.println("user save ...");
return "{'module':'user save'}";
}
}
请求参数
普通参数:url地址传参,地址参数名与形参变量名相同,定义参数即可接受参数
@Controller
public class UserController {
//普通参数
@RequestMapping("/commonParam")
@ResponseBody
public String commonParam(String name,int age){
System.out.println("普通参数传递 name ==> "+ name);
System.out.println("普通参数传递 age ==> "+ age);
return "{'module':'common param'}";
}
}
为web容器添加过滤器并指定字符集,Spring-web包中提供了专用的字符过滤器
//配字符编码过滤器
protected Filter[] getServletFilter(){
CharacterEncodingFilter filter = new CharacterEncodingFilter();
filter.setEncoding("UTF-8");
return new Filter[]{(Filter) filter};
}
普通参数:请求参数名与形参名不同
//普通参数:请求参数名与形参名不同
@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'}";
}
Pojo参数
//POJO参数
@RequestMapping("/pojoParam")
@ResponseBody
public String pojoParam(User user){
System.out.println("pojo参数传递 user ==> "+ user);
return "{'module':'pojo param'}";
}
嵌套Pojo参数:pojo对象中包含Pojo对象
//嵌套POJO参数
@RequestMapping("/pojoContainPojoParam")
@ResponseBody
public String pojoContainPojoParam(User user){
System.out.println("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'}";
}
集合参数
//集合参数
@RequestMapping("/listParam")
@ResponseBody
public String listParam(@RequestParam List<String> likes){
System.out.println("数组参数传递 likes ==> "+ likes);
return "{'module':'list param'}";
}
日期类型参数传递:
@DateTimeFormat:设定日期时间型数据格式
请求参数(传递json数据)
1:添加json数据转换相关坐标
2:设置发送json数据(请求body中添加json数据)
3:开启自动转换json数据的支持(@EnableWebMvc)(开启SpringMVC配置类定义上方)
4:设置接受json数据(@RequestBody)(将请求中请求体所包含的数据传递给请求参数)
@RequestBody与@RequestParam区别:
@RequestParam用于接受url地址传参,表单传参
@RequestBody用于接受json数据
响应
@ResponseBody:设置当前控制器返回值作为响应体
REST风格
REST风格简介
REST,表现形式状态转换
优点:隐藏资源的访问行为,无法通过地址得到对资源是何种操作
书写简化
按照REST风格访问资源时使用行为动作区分对资源进行了何种操作
根据REST风格对资源进行访问称为RESTful
RESTful入门案例
1:设定http请求动作(动词)
2:设定请求参数(路径变量)
例如:
@RequestMapping(value = "/users/{id}",method = RequestMethod.DELETE)
@ResponseBody
public String delete(@PathVariable Integer id){
System.out.println("user delete ..." + id);
return "{'module':'user delete'}";
}
@PathVariable用于接受路径参数,使用(参数名称)描述路径参数
RESTful快速开发
@RestController等同于@Controller与@ResponseBody两个注解组合功能
@GetMapping @PostMapping @PutMapping @DeleteMapping
基于RESTful页面数据交互
1:制作SpringMVC控制器,并通过PostMan测试接口功能
2:设置对静态资源的访问放行
3:前端页面通过异步提交访问后台控制器
SSM整合
SSM整合流程
1:创建工程
2:SSM整合
Spring:SpringConfig
MyBatis:MyBatisConfig,jdbcConfig,jdbc.properties
SpringMVC:ServletConfig,SpringMvcConfig
3:功能模块
表与实体类
dao(接口+自动代理)
service(接口+实现类)
业务层接口测试(整合JUnit)
controller
表现层接口测试(PostMan)
表现层数据封装
前端接受数据格式
前端接受数据格式——创建结果模型类,封装数据到data属性中
前端接受数据格式——封装操作结果到code属性中(设置统一数据返回结果编码)
前端接受数据格式——封装特殊消息到message(msg)属性中
设置统一数据返回结果类
public class Result{
private Object data;
private Integer code;
private String msg;
}
Result类中的字段并不是固定的,可以根据自行增减
异常处理器
出现异常现象的常见位置与常见诱因如下:
框架内部抛出的异常:因使用不合规导致
数据层抛出的异常:因外部服务器故障导致(例如:服务器访问超时)
业务层抛出的异常:因业务逻辑书写错误导致(例如:遍历业务书写操作,导致索引异常等)
表现层抛出的异常:因数据收集、校验等规则导致(例如:不匹配的数据类型间导致异常)
工具类抛出的异常:因工具类书写不严谨不够剪床导致(例如:必要释放的连接长期未释放等)
各个层级均出现异常,异常处理代码书写在哪一层——所有的异常均抛出到表现层进行处理,AOP思想
项目异常处理
1:自定义项目系统级异常
2:自定义项目业务级异常
3:自定义异常编码(持续补充)
4:触发自定义异常
5:拦截并处理异常
6:异常处理器效果对比
拦截器
拦截器概念
拦截器是一种动态拦截方法调用的机制,再SpringMVC中动态拦截控制器方法的执行
作用:
在指定方法调用前后执行预先设定的代码
阻止原始方法的执行
拦截器与过滤器区别:
归属不同:Filter数据Servlet技术,Interceptor属于SpringMVC技术
拦截内容不同:Filter对所有访问进行增强,Interceptor仅针对SpringNVC的访问进行增强
拦截器入门案例
1:声明拦截器的bean,并实现HandlerInterceptor接口(注意:扫描加载bean)
2:定义配置类,继承WebMvcConfigurationSupport,实现addInterceptor方法(注意:扫描加载配置)
3:添加拦截器并设定拦截的访问路径,路径可以通过可变参数设置多个
4:使用标准接口WebMvcConfigurer简化开发(注意:侵入式较强)