概述
传统开发中的控制层:
接收请求参数 request.getParameter
封装实体 new 实体类调用其set方法
访问业务层
接收访问结果
指派页面 通过request和response对象进行页面跳转
将共有行为进行抽取成DispatcherServlet【SpringMVC内部集成】,通过Spring-MVC.xml配置文件去配置。
Spring:
获取请求参数:形参与请求名一致或对象的属性与请求名一致即可自动获取封装,不一致时可用@RequestParam(“请求名”)获取请求的参数
指派页面:内部可通过配置视图解析器中前后缀的方式,简化视图名,可以直接返回字符串或者ModelAndView对象
SpringMVC可以让一个简单的Java类成为处理请求的控制器,无需实现任何借口,支持RESTful编程风格
执行原理
DispatcherServlet不执行具体操作,负责的是相应调度
1DispatcherServlet接收到请求后,调用HandlerMapping执行请求解析,返回给DS一个处理器执行链
2.拿到处理器执行链后,DS本身并不执行,找HandlerAdaptor帮助进行执行,由HandlerAdaptor调用执行Handler,返回给DS一个ModelAndView
3.解析视图时,会去调用ViewResolve进行解析,返回一个View,最后进行渲染视图
注意:ModelAndView中的View是一个字符串类型的视图名,经过ViewResolver解析后,返回真正的View对象
SpirngMVC中容器加载存在的两个问题
存在问题1;
每个servlet中,都需要加载相应的配置文件
弊端:配置文件加载多次,容器创建多个
解决办法:将其放在filter中,将创建容器的代码放在filter中。将容器对象存放在最大的域中【ServletContext域】
直接找对象拿,不通过属性名更省心
ServletContextLinstener中监测到web应用程序启动
Spring【SpringMVC内部集成】提供了ContextLoaderListener 导入其对应的坐标即可
存在问题2:应用配置文件名写死,解决方法:
1.使用全局初始化参数
<context-param>
<param-mame>xxx </param>
<param-value>classpath: xxx.xml <param-value>
</context-param>
获取app时,通过WebAppliacationContextUtils的静态方法,获取应用上下文对象
数据注入思想
方法谁调用谁负责传入实参(MVC框架调用)常用的对象都进行了封装
静态资源匹配
1.DispatcherServlet内部是缺省的,所有的web请求都会通过DispatcherServlet,会将静态资源当作,requesmapping中去匹配,找不到时,便会报错
解决办法:开启静态资源访问权限
<mvc:resources mapping = "/js/** location = "/js/">
可以有多个
解决办法2:交由默认的处理器进行处理
<mvc: default-servlet-handler>
中文乱码问题
1.tomcat8.5 get请求乱码问题已解决(之前需要再tomcat目录下修改相关配置)
2.post乱码问题
post乱码问题的两个解决办法:
办法1:request对象设置
办法2:配置全局过滤filter,内部设置编码格式
Spring框架已提供:CharacterEncodingFilter
映射地址改为 /*
@RequestMapping
请求url和请求的方法之间建立映射关系 可以用在类和方法上
注意:可以改变请求的方法类型,和限制必须携代哪些请求参数,内部可以设置输出字符串的编码方式
@ResponseBody
告知SpringMVC框架进行的是字符串的会写,而不是进行页面的跳转
注解补充
@RequestBody主要*用来接收前端传递给后端的json字符串中的数据的(请求体中的数据)。由于GET方式没有请求体,所以使用@RequestBody接受数据的时候,前端不能用GET方式提交数据,而是用POST方式提交。
2、在后端的同一个接口中,@RequestBody和@ResquestParam()可以同时使用,@RequestBody最多只能有一个,而@ResquestParam()可以有多个。
3、@RequestBody 接收的是***请求体***里面的数据;而@RequestParam接收的是***key-value***里面的参数。
4.用法 @RequestBody 或@ResponseParanm("name名")
页面跳转
1.直接返回字符串 【和内部资源视图解析器拼接时,进行返回,拼接是字符串内部进行拼接】
2.通过ModelAndView对象返回
通过ModelAndView的方法设置属性名,里面同直接返回字符串一样,会进行拼接
数据响应
1.直接返回字符串
需要添加@ResponseBody告知框架,不要进行页面跳转,进行字符串的输出 重点!!!!!
需要指定格式
用到json转换工具
导包
jackson-core
jackson-databind
jackson-annnotations
new ObjectMapper
调用其write
默认属性
value属性是默认属性,只有这一个可以省略不写
注解驱动
内部集成了jackson json转换工具
导入mvc命名空间后添加注解驱动如下
<mvc:annotation-driven>
监听器、过滤器、拦截器
监听器:当事件发生时,执行相关操作,比如服务器一启动,加载Spring核心容器
过滤器:访问目标资源前,做干预操作,如post请求中文乱码问题,配置在web.xml中的filter
拦截器:类似于Servlet开发中的Filter,用于对处理器进行预处理和后处理
拦截器决定是否进行放行操作,拦截器是AOP思想的体现
filter和Interceptor区别:
1.Filter是Servlet规范中的一部分,任何Java Web工程都可以使用 在url-pattern配置/* 后,对所有要访问的资源拦截
2.Inteceptor:是SpringMVC框架自己的,只有使用了SpringMVC框架的工程才可以使用,配置/** 后,可以对所有资源进行拦截
使用方法
过滤器:实现filter接口,将实现类配置在web.xml中即可
拦截器:实现HandlerInteceptor接口,将实现类配置在Spring-mvc中
拦截器中的内部方法
preHandler :返回false,后续Controller不再执行
postHandler 目标方法执行完毕之后执行,在视图对象返回前进行
afterCompletion : 视图对象返回之后,在流程执行完毕后执行,做收尾工作
异常处理
传统开发:
使用try-catch的方式,补获和处理异常
异常处理和业务之间的代码耦合度高
catch中的代码相似度高
解决方法:
抽取,将异常向上抛出,由调用者负责相关处理,最终的调用者为DispatcherServlet
相关注意事项
return返回的资源加/ 表示从根目录访问
只有在一个Sevlet请求中才可以获取ServletContext对象
所有的url请求到web端都是字符串
Resutful风格
架构风格、设计风格
url+请求方式
GET 获取资源
POST 新建资源
PUT 更新资源
DELETE 删除文章来源:https://www.toymoban.com/news/detail-602566.html
前端请求在项目中的执行链路
url请求-》tomcat服务器-》应用程序->tomcat调用SpringMVC的service方法——》获取到业务方法后,利用反射执行方法文章来源地址https://www.toymoban.com/news/detail-602566.html
到了这里,关于SpringMVC相关知识点的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!