SpringMVC
2022-06-13 14:45:42 10 举报
SpringMVC的学习笔记
作者其他创作
大纲/内容
8.Restful(资源状态转移)
http协议中4个操作动作
GET 用来获取资源
getUserById?id=1 user/1-->get请求方式
getUserById?id=1 user/1-->get请求方式
POST 用来新建资源
saveUser user-->post请求方式
saveUser user-->post请求方式
PUT 用来更新资源
deleteUser?id=1 user/1-->delete请求方式
deleteUser?id=1 user/1-->delete请求方式
DELETE用来删除资源
updateUser user-->put请求方式
updateUser user-->put请求方式
REST 风格提倡 URL 地址使用统一的风格设计,不使用问号键值对方
式携带请求参数,而是将要发送给服务器的数据作为 URL 地址的一部分
式携带请求参数,而是将要发送给服务器的数据作为 URL 地址的一部分
过滤器(在web.xml文件注册)
CharacterEncodingFilter 编码过滤器
HiddenHttpMethodFilter(将 POST 请求转换为 DELETE 或 PUT 请求)
使用条件:
a>当前请求的请求方式必须为post
b>当前请求必须传输请求参数_method
a>当前请求的请求方式必须为post
b>当前请求必须传输请求参数_method
注意:必须先注册CharacterEncodingFilter,再注册HiddenHttpMethodFilter
9.HttpMessageConverter
(报文信息转换器)
提供两个注解和两个类型
(报文信息转换器)
提供两个注解和两个类型
(1)概念
请求报文——>Java对象
Java对象——>响应报文
请求报文——>Java对象
Java对象——>响应报文
(2)① @RequestBody可以获取请求体
(用在标识形参)
(用在标识形参)
@RequestMapping("/testRequestBody")
public String testRequestBody(@RequestBody String requestBody){
System.out.println("requestBody:"+requestBody);
return "success";
} //控制器方法设置形参,请求体给当前注解形参赋值,即给requestBody赋值
public String testRequestBody(@RequestBody String requestBody){
System.out.println("requestBody:"+requestBody);
return "success";
} //控制器方法设置形参,请求体给当前注解形参赋值,即给requestBody赋值
(2) ②RequestEntity封装请求报文的一种类型
(用在标识形参类型)
(用在标识形参类型)
@RequestMapping("/testRequestEntity")
public String testRequestEntity(RequestEntity<String> requestEntity){
System.out.println("requestHeader:"+requestEntity.getHeaders());
System.out.println("requestBody:"+requestEntity.getBody()); return "success";
}
//通过getHeaders()获取请求头信息,通过getBody()获取请求体信息
public String testRequestEntity(RequestEntity<String> requestEntity){
System.out.println("requestHeader:"+requestEntity.getHeaders());
System.out.println("requestBody:"+requestEntity.getBody()); return "success";
}
//通过getHeaders()获取请求头信息,通过getBody()获取请求体信息
(2) ③@ResponseBody
(用在标识控制器方法)
(用在标识控制器方法)
用于标识一个控制器方法,可以将该方法的返回值直接作为响应报文的响应体响应到浏览器
@RequestMapping("/testResponseBody")
@ResponseBody public String testResponseBody(){
return "success";
}
@RequestMapping("/testResponseBody")
@ResponseBody public String testResponseBody(){
return "success";
}
(2) ④ResponseEntity
(自定义响应报文)
(自定义响应报文)
用于控制器方法的返回值类型,该控制器方法的返回值就是响应到浏览器的响应报文
@RestController复合注解
相当于为类添加了
@Controller+@ResponseBody注解
@Controller+@ResponseBody注解
(3)处理Ajax和json
10.文件上传和下载
上传:浏览器——>服务器
下载:服务器——>浏览器
上传:浏览器——>服务器
下载:服务器——>浏览器
文件下载ResponseEntity实现
SpringMVC中将上传的文件封装到MultipartFile对象
①添加依赖:commons-io 和 commons-fileupload
②SpringMVC配置文件中添加配置:
<bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver"> </bean>
①添加依赖:commons-io 和 commons-fileupload
②SpringMVC配置文件中添加配置:
<bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver"> </bean>
11.拦截器
(用于拦截控制器方法的执行)
(用于拦截控制器方法的执行)
(1)实现HandlerInterceptor,必须在SpringMVC的配置文件进行配置
(2)三个抽象方法
preHandle
控制器方法执行之前执行preHandle(),其boolean类型的返回值表示是否拦截或放行,返回true为放行,即调用控制器方法;返回false表示拦截,即不调用控制器方法
postHandle
控制器方法执行之后执行postHandle()
afterComplation
处理完视图和模型数据,渲染视图完毕之后执行afterComplation()
(3)执行顺序
a>若每个拦截器的preHandle()都返回true
此时多个拦截器的执行顺序和拦截器在SpringMVC的配置文件的配置顺序有关
此时多个拦截器的执行顺序和拦截器在SpringMVC的配置文件的配置顺序有关
b>若某个拦截器的preHandle()返回了false
preHandle()返回false和它之前的拦截器的preHandle()都会执行,postHandle()都不执行,返回false
的拦截器之前的拦截器的afterComplation()会执行
preHandle()返回false和它之前的拦截器的preHandle()都会执行,postHandle()都不执行,返回false
的拦截器之前的拦截器的afterComplation()会执行
12. 异常处理
基于配置
基于注解
@ControllerAdvice将当前类标识为异常处理的组件
@ExceptionHandler用于设置所标识方法处理的异常
13. 注解配置SpringMVC
(1) 初始化类WebInit代替web.xml 继承 AbstractAnnotationConfigDispatcherServletInitializer
重写方法:
指定spring的配置类; 指定springMVC的配置类,指定DispatcherServlet的映射规则,即url-pattern, 添加过滤器
重写方法:
指定spring的配置类; 指定springMVC的配置类,指定DispatcherServlet的映射规则,即url-pattern, 添加过滤器
(2)@Configuration
创建SpringConfig配置类SpringConfig,代替spring的配置文件
创建SpringConfig配置类SpringConfig,代替spring的配置文件
(3)创建WebConfig配置类,代替SpringMVC的配置文件
1、扫描组件 2、视图解析器 3、view-controller 4、default-servlet-handler 5、mvc注解驱动 6、文件上传解析器 7、异常处理 8、拦截器
@Configuration
@ComponentScan("com.atguigu.mvc.controller") //扫描组件
@EnableWebMvc //开启MVC注解驱动
1、扫描组件 2、视图解析器 3、view-controller 4、default-servlet-handler 5、mvc注解驱动 6、文件上传解析器 7、异常处理 8、拦截器
@Configuration
@ComponentScan("com.atguigu.mvc.controller") //扫描组件
@EnableWebMvc //开启MVC注解驱动
14. springMVC的执行流程
1. 用户点击某个请求路径,发起一个 HTTP request 请求,该请求会被提交到 DispatcherServlet(前端控制器);
2. 由 DispatcherServlet 请求一个或多个 HandlerMapping(处理器映射器),并返回一个执行链(HandlerExecutionChain)。
3. DispatcherServlet 将执行链返回的 Handler 信息发送给 HandlerAdapter(处理器适配器);
4. HandlerAdapter 根据 Handler 信息找到并执行相应的 Handler(常称为 Controller);
5. Handler 执行完毕后会返回给 HandlerAdapter 一个 ModelAndView 对象(Spring MVC的底层对象,包括 Model 数据模型和 View 视图信息);
6. HandlerAdapter 接收到 ModelAndView 对象后,将其返回给 DispatcherServlet ;
7. DispatcherServlet 接收到 ModelAndView 对象后,会请求 ViewResolver(视图解析器)对视图进行解析;
8. ViewResolver 根据 View 信息匹配到相应的视图结果,并返回给 DispatcherServlet;
9. DispatcherServlet 接收到具体的 View 视图后,进行视图渲染,将 Model 中的模型数据填充到 View 视图中的 request 域,生成最终的 View(视图);
10. 视图负责将结果显示到浏览器(客户端)
2. 由 DispatcherServlet 请求一个或多个 HandlerMapping(处理器映射器),并返回一个执行链(HandlerExecutionChain)。
3. DispatcherServlet 将执行链返回的 Handler 信息发送给 HandlerAdapter(处理器适配器);
4. HandlerAdapter 根据 Handler 信息找到并执行相应的 Handler(常称为 Controller);
5. Handler 执行完毕后会返回给 HandlerAdapter 一个 ModelAndView 对象(Spring MVC的底层对象,包括 Model 数据模型和 View 视图信息);
6. HandlerAdapter 接收到 ModelAndView 对象后,将其返回给 DispatcherServlet ;
7. DispatcherServlet 接收到 ModelAndView 对象后,会请求 ViewResolver(视图解析器)对视图进行解析;
8. ViewResolver 根据 View 信息匹配到相应的视图结果,并返回给 DispatcherServlet;
9. DispatcherServlet 接收到具体的 View 视图后,进行视图渲染,将 Model 中的模型数据填充到 View 视图中的 request 域,生成最终的 View(视图);
10. 视图负责将结果显示到浏览器(客户端)
注意:在第五步执行handler过程中,sping 会帮我们做一些额外的操作:
a) HttpMessageConveter: 将请求消息(如Json、xml等数据)转换成一个对象,将对象转换为指定的响应信息
b) 数据转换:对请求消息进行数据转换。如String转换成Integer、Double等
c) 数据格式化:对请求消息进行数据格式化。 如将字符串转换成格式化数字或格式化日期等
d) 数据验证: 验证数据的有效性(长度、格式等),验证结果存储到BindingResult或Error中
a) HttpMessageConveter: 将请求消息(如Json、xml等数据)转换成一个对象,将对象转换为指定的响应信息
b) 数据转换:对请求消息进行数据转换。如String转换成Integer、Double等
c) 数据格式化:对请求消息进行数据格式化。 如将字符串转换成格式化数字或格式化日期等
d) 数据验证: 验证数据的有效性(长度、格式等),验证结果存储到BindingResult或Error中
1.简介
(1)mvc模式
MVC的工作流程:
用户通过视图层发送请求到服务器,在服务器中请求被Controller接收,Controller调用相应的Model层处理请求,
处理完毕将结果返回到Controller,Controller再根据请求处理的结果
找到相应的View视图,渲染数据后最终响应给浏览器
用户通过视图层发送请求到服务器,在服务器中请求被Controller接收,Controller调用相应的Model层处理请求,
处理完毕将结果返回到Controller,Controller再根据请求处理的结果
找到相应的View视图,渲染数据后最终响应给浏览器
JavaBean分为两类:
一类称为实体类Bean:专门存储业务数据的,如 Student、User 等
一类称为业务处理 Bean:指 Service 或 Dao 对象,专门用于处理业务逻辑和数据访问。
一类称为实体类Bean:专门存储业务数据的,如 Student、User 等
一类称为业务处理 Bean:指 Service 或 Dao 对象,专门用于处理业务逻辑和数据访问。
(2)SpringMVC 是 Spring 为表述层开发提供的一整套完备的解决方案
(3)三层架构:表述层(表示层):包括前台页面和后台servlet
业务逻辑层
访问层
业务逻辑层
访问层
(4)特点:Spring 家族原生产品,与 IOC 容器等基础设施无缝对接
基于原生的Servlet,通过了功能强大的前端控制器DispatcherServlet,对请求和响应进行统一处理
表述层各细分领域需要解决的问题全方位覆盖,提供全面解决方案
代码清新简洁,大幅度提升开发效率
内部组件化程度高,可插拔式组件即插即用,想要什么功能配置相应组件即可
性能卓著,尤其适合现代大型、超大型互联网项目要求
基于原生的Servlet,通过了功能强大的前端控制器DispatcherServlet,对请求和响应进行统一处理
表述层各细分领域需要解决的问题全方位覆盖,提供全面解决方案
代码清新简洁,大幅度提升开发效率
内部组件化程度高,可插拔式组件即插即用,想要什么功能配置相应组件即可
性能卓著,尤其适合现代大型、超大型互联网项目要求
2.HelloWorld
创建mavn工程:添加web模块;war方式打包;引入依赖
配置web.xml
有默认和扩展两种方式
创建请求控制器:
@Controller public class HelloController { }
@Controller public class HelloController { }
创建springMVC的配置文件springMVC.xml(一般在resources目录下):配自动扫描包和视图解析器
在请求控制器中创建处理请求的方法
3.执行流程
浏览器发送请求,若请求地址符合前端控制器的url-pattern,该请求就会被前端控制器
DispatcherServlet处理。前端控制器会读取SpringMVC的核心配置文件,通过扫描组件找到控制器,
将请求地址和控制器中@RequestMapping注解的value属性值进行匹配,若匹配成功,该注解所标识的
控制器方法就是处理请求的方法。处理请求的方法需要返回一个字符串类型的视图名称,该视图名称会
被视图解析器解析,加上前缀和后缀组成视图的路径,通过Thymeleaf对视图进行渲染,最终转发到视
图所对应页面
DispatcherServlet处理。前端控制器会读取SpringMVC的核心配置文件,通过扫描组件找到控制器,
将请求地址和控制器中@RequestMapping注解的value属性值进行匹配,若匹配成功,该注解所标识的
控制器方法就是处理请求的方法。处理请求的方法需要返回一个字符串类型的视图名称,该视图名称会
被视图解析器解析,加上前缀和后缀组成视图的路径,通过Thymeleaf对视图进行渲染,最终转发到视
图所对应页面
4.RequestMapping注解
1.功能
@RequestMapping注解的作用就是将请求和处理请求的控制器方法关联
起来,建立映射关系。SpringMVC 接收到指定的请求,就会来找到在映射关系中对应的控制器方法来处理这个请求。
@RequestMapping注解的作用就是将请求和处理请求的控制器方法关联
起来,建立映射关系。SpringMVC 接收到指定的请求,就会来找到在映射关系中对应的控制器方法来处理这个请求。
2.位置
@RequestMapping标识一个类:设置映射请求的请求路径的初始信息
@RequestMapping标识一个方法:设置映射请求请求路径的具体信息
@RequestMapping标识一个类:设置映射请求的请求路径的初始信息
@RequestMapping标识一个方法:设置映射请求请求路径的具体信息
3.属性
value
通过请求地址匹配请求映射
是一个字符串类型的数组,表示该请求映射能够匹配多个请求地址所对应的请求
value属性必须设置,至少通过请求地址匹配请求映射
是一个字符串类型的数组,表示该请求映射能够匹配多个请求地址所对应的请求
value属性必须设置,至少通过请求地址匹配请求映射
支持路径中的占位符(重点)
method
配置请求方式:post 或者 get
的method属性是一个RequestMethod类型的数组,表示该请求映射能够匹配多种请求方式的请求
若请求地址满足value属性,请求方式不满足method属性,浏览器报错405
method = {RequestMethod.GET, RequestMethod.POST}
的method属性是一个RequestMethod类型的数组,表示该请求映射能够匹配多种请求方式的请求
若请求地址满足value属性,请求方式不满足method属性,浏览器报错405
method = {RequestMethod.GET, RequestMethod.POST}
派生注解
1、对于处理指定请求方式的控制器方法,SpringMVC中提供了@RequestMapping的派生注解
处理get请求的映射-->@GetMapping
处理post请求的映射-->@PostMapping
处理put请求的映射-->@PutMapping
处理delete请求的映射-->@DeleteMapping
处理get请求的映射-->@GetMapping
处理post请求的映射-->@PostMapping
处理put请求的映射-->@PutMapping
处理delete请求的映射-->@DeleteMapping
2、常用的请求方式有get,post,put,delete
params(了解)
通过请求的请求参数匹配请求映射
性是一个字符串类型的数组,可以通过四种表达式设置请求参数和请求映射的匹配关系
若当前请求满足@RequestMapping注解的value和method属性,但是不满足params属性,此时
页面报错400
性是一个字符串类型的数组,可以通过四种表达式设置请求参数和请求映射的匹配关系
若当前请求满足@RequestMapping注解的value和method属性,但是不满足params属性,此时
页面报错400
headers(了解)
通过请求的请求头信息匹配请求映射
是一个字符串类型的数组,可以通过四种表达式设置请求头信息和请求映射的匹配关系
是一个字符串类型的数组,可以通过四种表达式设置请求头信息和请求映射的匹配关系
4.持ant风格的路径
?:表示任意的单个字符
*:表示任意的0个或多个字符
**:表示任意的一层或多层目录
注意:在使用**时,只能使用/**/xxx的方式
*:表示任意的0个或多个字符
**:表示任意的一层或多层目录
注意:在使用**时,只能使用/**/xxx的方式
5.获取请求参数
(1)通过ServletAPI
将HttpServletRequest作为控制器方法的形参,此时HttpServletRequest类型的参数表示封装了当前请
求的请求报文的对象
@RequestMapping("/testParam")
public String testParam(HttpServletRequest request){
String username = request.getParameter("username");
}
求的请求报文的对象
@RequestMapping("/testParam")
public String testParam(HttpServletRequest request){
String username = request.getParameter("username");
}
(2)通过控制器方法的形参
在控制器方法的形参位置,设置和请求参数同名的形参,当浏览器发送请求,匹配到请求映射时,在
DispatcherServlet中就会将请求参数赋值给相应的形参
<a th:href="@{/testParam(username='admin',password=123456)}">测试获取请求参数-- >/testParam</a><br>
@RequestMapping("/testParam")
public String testParam(String username, String password){
System.out.println("username:"+username+",password:"+password);
return "success";
}
DispatcherServlet中就会将请求参数赋值给相应的形参
<a th:href="@{/testParam(username='admin',password=123456)}">测试获取请求参数-- >/testParam</a><br>
@RequestMapping("/testParam")
public String testParam(String username, String password){
System.out.println("username:"+username+",password:"+password);
return "success";
}
(3)@RequestParam
value:指定为形参赋值的请求参数的参数名
required:设置是否必须传输此请求参数,默认值为true
defaultValue:不管required属性值为true或false,当value所指定的请求参数没有传输或传输的值
为""时,则使用默认值为形参赋值
为""时,则使用默认值为形参赋值
(4)@RequestHeader
将请求头信息和控制器方法的形参创建映射关系
同上也有三个参数
同上也有三个参数
(5)@CookieValue
将cookie数据和控制器方法的形参创建映射关系
同上也有三个参数
同上也有三个参数
(6)通过POJO获取请求参数
<form th:action="@{/testpojo}" method="post">
@RequestMapping("/testpojo")
在控制器方法的形参位置设置一个实体类类型的形参,此时若浏览器传输的请求参数的参数名和实
体类中的属性名一致,那么请求参数就会为此属性赋值
@RequestMapping("/testpojo")
在控制器方法的形参位置设置一个实体类类型的形参,此时若浏览器传输的请求参数的参数名和实
体类中的属性名一致,那么请求参数就会为此属性赋值
解决请求参数乱码问题
编码过滤器CharacterEncodingFilter,但是
必须在web.xml中进行注册
必须在web.xml中进行注册
6.域共享数据
域对象
有jsp情况4种
有jsp情况4种
request
session 浏览器开启到关闭 钝化和活化
Application 服务器开启到关闭 范围最大
(servlet context)
(servlet context)
request域共享方法
1. 使用ServletAPI
request.setAttribute
request.setAttribute
2. 使用modelAndView
modelAndView.addObject("testScope", "hello,ModelAndView")
modelAndView.addObject("testScope", "hello,ModelAndView")
3. 使用model
model.addAttribute("testScope", "hello,Model");
model.addAttribute("testScope", "hello,Model");
4 . 使用map
map.put( )
map.put( )
5. 使用ModelMap
modelMap.addAttribute
modelMap.addAttribute
控制器方法执行后都会统一返回 ModelAndView对象
Model、ModelMap、Map的关系
本质上都是 BindingAwareModelMap 类型, 都是Model的实现类
LinkedHashMap->ModelMap->ExtendModelMap->BindingAwareModelMap
父->子 继承关系
父->子 继承关系
session域共享数据
session.setAttribute("testSessionScope", "hello,session")
向application域共享数据
ServletContext application = session.getServletContext();
application.setAttribute("testApplicationScope", "hello,application");
application.setAttribute("testApplicationScope", "hello,application");
视图控制器view-controller
7.视图渲染数据
默认视图
转发视图(InternalResourceView)
控制器方法中所设置的视图名称以"forward:"为前缀
@RequestMapping("/testForward")
@RequestMapping("/testForward")
重定向视图(RedirectView)
控制器方法中所设置的视图名称以"redirect:"为前缀
@RequestMapping("/testRedirect")
@RequestMapping("/testRedirect")
视图技术为Thymeleaf
没有任何视图前缀
ThymeleafView
ThymeleafView
视图控制器view_controller
当SpringMVC中设置任何一个view-controller时,其他控制器中的请求映射将全部失效,此时需
要在SpringMVC的核心配置文件中设置开启mvc注解驱动的标签:
<mvc:annotation-driven />
要在SpringMVC的核心配置文件中设置开启mvc注解驱动的标签:
<mvc:annotation-driven />
0 条评论
下一页