什么是MVC?
MVC是一种设计模式,在这种模式下软件被分为三层,即Model(模型)、View(视图)、Controller(控制器)。
- M:Model,模型层,指工程中的JavaBean,作用是处理数据
- V:View,视图层,指工程中的html或jsp等页面,作用是与用户进行交互,展示数据
- C:Controller,控制层,指工程中的servlet,作用是接收请求和响应浏览器将软件分层的好处是,可以将对象之间的耦合度降低,便于代码的维护。
DAO层是做什么的?
dao专门用于访问数据库,具体实现技术有很多,常用的有Spring JDBC、Hibernate、JPA、MyBatis等
Spring MVC的执行流程
- 用户通过浏览器发起HttpRequest请求到前端控制器 (DispatcherServlet)。
- DispatcherServlet 将用户请求发送给处理器映射器 (HandlerMapping)。
- 处理器映射器 (HandlerMapping)会根据请求,找到负责处理该请求的处理器,并将其封装为处理器执行链 返回 (HandlerExecutionChain) 给 DispatcherServlet
- DispatcherServlet 会根据 处理器执行链 中的处理器,找到能够执行该处理器的处理器适配器(HandlerAdaptor) --注,处理器适配器有多个
- 处理器适配器 (HandlerAdaptoer) 会调用对应的具体的 Controller
- Controller 将处理结果及要跳转的视图封装到一个对象 ModelAndView 中并将其返回给处理器适配器 (HandlerAdaptor)
- HandlerAdaptor 直接将 ModelAndView 交给 DispatcherServlet ,至此,业务处理完毕
- 业务处理完毕后,我们需要将处理结果展示给用户。于是DisptcherServlet 调用 ViewResolver,将 ModelAndView 中的视图名称封装为视图对象
- ViewResolver 将封装好的视图 (View) 对象返回给 DIspatcherServlet
- DispatcherServlet 调用视图对象,让其自己 (View) 进行渲染(将模型数据填充至视图中),形成响应对象 (HttpResponse)
- 前端控制器 (DispatcherServlet) 响应 (HttpResponse) 给浏览器,展示在页面上。
用户通过视图层发送请求到服务器,在服务器中请求被Controller接收,Controller调用相应的Model层处理请求(Controller调用service处理业务逻辑,service调用DAO操作数据库,DAO将数据库处理结果返回给service,service再返回给Controller),处理完毕将结果返回到Controller,Controller再根据请求处理的结果找到相应的View视图,渲染数据后最终响应给浏览器
Spring MVC常用注解
@RequestMapping:
- 作用:处理请求地址映射,也就是说,将其中的处理器方法映射到url路径上。
- 属性:
(1)method:是让你指定请求的方法,比如常用的有get和post。
(2)value:是指请求的实际地址,如果是多个地址就用{}来指定。
(3)produces:指定返回的内容类型,当request请求头中的Accept类型中包含指定的类型才可以返回的。
(4)consumes:指定处理请求的提交内容类型,比如一些json、html、text等的类型。
(5)headers:指定request中必须包含那些的headed值时,它才会用该方法处理请求的。
(6)params:指定request中一定要有的参数值,它才会使用该方法处理请求。
@RequestParam:
- 作用:将请求参数绑定到你的控制器的方法参数上,是Spring MVC中的接收普通参数的注解。
- 属性:
(1)value是请求参数中的名称。
(2)required是请求参数是否必须提供参数,它的默认是true,意思是表示必须提供。
@RequestBody:
- 作用:如果作用在方法上,表示该方法的返回结果是直接按写入的Http responsebody中(一般在异步获取数据时使用的注解)。
- 属性:
(1)required:是否必须有请求体。它的默认值是true,在使用该注解时,值得注意的当为true时get的请求方式是报错的,如果你取值为false的话,get的请求是null。
@PathVaribale:用于绑定url中的占位符,但是spring3.0以后,url才开始支持占位符的,它是Spring MVC支持的rest风格url的一个重要的标志。
Spring MVC的拦截器
拦截器会对处理器进行拦截,以增强处理器的功能。Spring MVC中,所有的拦截器都需要实现HandlerInterceptor
接口,该接口包含如下三个方法:preHandle()
、postHandle()
、afterCompletion()
。这些方法的执行流程如下图:
通过上图可以看出,Spring MVC拦截器的执行流程如下:
- 执行preHandle方法,它会返回一个布尔值。如果为false,则结束所有流程,如果为true,则执行下一步。
- 执行处理器逻辑,它包含控制器的功能。
- 执行postHandle方法。
- 执行视图解析和视图渲染。
- 执行afterCompletion方法。
Spring MVC拦截器的开发步骤如下:
- 开发拦截器:实现handlerInterceptor接口,从三个方法中选择合适的方法,实现拦截时要执行的具体业务逻辑。
- 注册拦截器:定义配置类,并让它实现WebMvcConfigurer接口,在接口的addInterceptors方法中注册拦截器,并定义该拦截器匹配哪些请求路径。
怎么去做请求拦截?
如果是对所有的请求(如访问静态资源的请求)进行拦截,则可以使用Filter。
如果是对Controller进行拦截,则可以使用Spring MVC的拦截器。
如果是对除了Controller之外的其他Bean的请求进行拦截,则可以使用Spring AOP。
其他
cookie和session的区别
- 存储位置不同:cookie存放于客户端;session存放于服务端。
- 存储容量不同:单个cookie保存的数据<=4KB,一个站点最多保存20个cookie;而session并没有上限。
- 存储方式不同:cookie只能保存ASCII字符串,并需要通过编码当时存储为Unicode字符或者二进制数据;session中能够存储任何类型的数据,例如字符串、整数、集合等。
- 隐私策略不同:cookie对客户端是可见的,别有用心的人可以分析存放在本地的cookie并进行cookie欺骗,所以它是不安全的;session存储在服务器上,对客户端是透明的,不存在敏感信息泄露的风险。
- 生命周期不同:可以通过设置cookie的属性,达到cookie长期有效的效果;session依赖于名为JSESSIONID的cookie,而该cookie的默认过期时间为-1,只需关闭窗口该session就会失效,因此session不能长期有效。
- 服务器压力不同:cookie保存在客户端,不占用服务器资源;session保管在服务器上,每个用户都会产生一个session,如果并发量大的话,则会消耗大量的服务器内存。
- 浏览器支持不同:cookie是需要浏览器支持的,如果客户端禁用了cookie,则会话跟踪就会失效;运用session就需要使用URL重写的方式,所有用到session的URL都要进行重写,否则session会话跟踪也会失效。
- 跨域支持不同:cookie支持跨域访问,session不支持跨域访问。
cookie和session各自适合的场景
- 对于敏感数据,应存放在session里,因为cookie不安全。
- 对于普通数据,优先考虑存放在cookie里,这样会减少对服务器资源的占用。
session的工作原理
session依赖于cookie。当客户端首次访问服务器时,服务器会为其创建一个session对象,该对象具有一个唯一标识SESSIONID。并且在响应阶段,服务器会创建一个cookie,并将SESSIONID存入其中。客户端通过响应的cookie而持有SESSIONID,所以当它再次访问服务器时,会通过cookie携带这个SESSIONID。服务器获取到SESSIONID后,就可以找到与之对应的session对象,进而从这个session中获取该客户端的状态。
get请求与post请求的区别
- GET在浏览器回退时是无害的,而POST会再次提交请求。
- GET产生的URL地址可以被Bookmark,而POST不可以。
- GET请求会被浏览器主动cache,而POST不会,除非手动设置。
- GET请求只能进行url编码,而POST支持多种编码方式。
- GET请求参数会被完整保留在浏览器历史记录里,而POST中的参数不会被保留。
- GET请求在URL中传送的参数是有长度限制的,而POST没有。
- 对参数的数据类型,GET只接受ASCII字符,而POST没有限制。
- GET比POST更不安全,因为参数直接暴露在URL上,所以不能用来传递敏感信息。
- GET参数通过URL传递,POST放在Request body中。
get请求的参数能放到body里面吗?
GET请求是可以将参数放到BODY里面的,官方并没有明确禁止,但给出的建议是这样不符合规范,无法保证所有的实现都支持。这就意味着,如果你试图这样做,可能出现各种未知的问题,所以应该当避免。
post不幂等是为什么?
HTTP方法的幂等性是指一次和多次请求某一个资源应该具有同样的副作用。幂等性属于语义范畴,正如编译器只能帮助检查语法错误一样,HTTP规范也没有办法通过消息格式等语法手段来定义它。
POST所对应的URI并非创建的资源本身,而是资源的接收者。比如:POST http://www.forum.com/articles的语义是在http://www.forum.com/articles下创建一篇帖子,HTTP响应中应包含帖子的创建状态以及帖子的URI。两次相同的POST请求会在服务器端创建两份资源,它们具有不同的URI。所以,POST方法不具备幂等性。
页面报400错误是什么意思?
400状态码标识请求的语义有误,当前请求无法被服务器理解。除非进行修改,否则客户端不应该重复提交这个请求。通常情况下,是本次请求中包含有错误的参数,此时应该排查前端传递的参数。
请求数据出现乱码该怎么处理?
服务端出现请求乱码的原因是,客户端编码与服务器解码方案不一致,可以有如下几种解决办法:
- 将获得的数据按照客户端编码转成BYTE,再将BYTE按服务端编码转成字符串,这种方案对各种请求方式均有效,但是十分的麻烦。
- 在接受请求数据之前,显示声明实体内容的编码与服务器一致,这种方式只对POST请求有效。
- 修改服务器的配置文件,显示声明请求路径的编码与服务器一致,这种方式只对GET请求有效。
如何在SpringBoot框架下实现一个定时任务?
Spring给我们提供了可执行定时任务的线程池ThreadPoolTaskScheduler,该线程池提供了多个可以与执行定时任务的方法,如下图。在Spring Boot中,只需要在配置类中启用线程池注解,就可以直接使用这个线程池了。
调用接口时要记录日志,该怎么设计?
可以定义一个记录日志的组件,并通过AOP将其织入到这个接口的调用中。文章来源:https://www.toymoban.com/news/detail-413032.html
Spring Boot JPA
JPA即Java Persistence API,它是一个基于O/R映射的标准规范。也就是说它指定以了标准规则,不提供实现,软件提供商可以按照标准规范来实现,而使用者只需按照规范中定义的方式来使用,不用和软件提供商打交道。JPA主要实现有Hibernate、EclipseLink、OpenJPA等,我们使用JPA来开发,无论是采用哪一种实现方式都一样。文章来源地址https://www.toymoban.com/news/detail-413032.html
到了这里,关于【Java基础】-【SpringMVC】的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!