3.1什么是MVC?
MVC是一种设计模式,在这种模式下软件被分为三层:Model(模型层)、View(视图层)、Controller(控制层)。Model代表的是数据,View代表的是用户界面,Controller代表的是数据的处理逻辑,它是Model和View这两层的桥梁。将软件分层的好处是:可以将对象之间的耦合度降低,便于代码的维护。
3.2DAO层是做什么的?
Dao是Data Access Object的缩写,数据访问对象,在项目中它通常作为独立的一层,专门用户访问数据库。这一层的具体实现技术有很多种比如JDBC、Mybatis、Hibernate等,在Spring框架中无论采用哪一种技术访问数据库,它的编程模式都是统一的。
3.3介绍一下Spring MVC的执行流程?
服务器分为表现层/业务层/数据层,其中Spring MVC是工作在表现层,作用是接收/解析用户发送的请求,调用对应的业务类,根据业务类返回的结果,来封装model,并调用view进行视图渲染,并将渲染后的View返回给请求者。
(1)整个过程始于客户端发出的一个http请求,Web应用服务器接收到这个请求。如果匹配DispatchServlet的请求映射路径,Web容器就将该请求转交给DispatcherServlet请求。
(2)DispatcherServlet接收到这个请求后,根据请求的信息(包括URL、HTTP方法、请求头、请求参数、cookie等)以及HandlerMapping的配置找到处理请求的处理器。可以把HandlerMapping看做是路由控制器,将Handler看做是目标主机。
(3)中央调度器根据HandlerMapping中的映射结果找到对应的处理器后,通过HandlerAdapter对其进行封装,再以统一的适配器接口对各种Handler方法进行调用。
(4)处理器完成业务逻辑的处理后,会返回一个ModelAndView给DispatcherServlet,ModelAndView包含了视图逻辑名和模型数据信息。
(5)ModelAndView包含的是逻辑视图名而不是真正的视图对象,所以DispatcherServlet借由ViewResolver完成逻辑视图名到真实视图对象的解析工作。
(6)当得到真实的视图对象View后,DispatcherServlet就使用这个View对象对ModelAndView中的模型数据进行视图渲染。
(7)最终客户端得到的响应消息可能是一个普通的HTML页面,也可能是一个JSON字符串,或者是图片PDF文档等不同的媒体形式。
如果配置了拦截器,拦截器中的preHandler()和postHandler方法分别会在处理器执行业务逻辑的前后执行,而afterCompletion()方法会在完成视图渲染工作,生成最终的视图之后执行。
3.4说说你知道到的Spring MVC的注解?
@RequestMapping:
作用:这个注解的作用就是用来处理请求地址映射的,将处理器方法映射到url路径上。
属性:
path:请求的url地址;
method:请求的method类型,比如常用的有get请求和post请求。
headers:指定请求头中必须包含那些header值的时候,它才会用该方法进行处理。
params:指定请求体一定要有的参数值,它才会调用该方法处理请求。
produces:请求返回的内容类型,当request请求头中的Accept类型中包含指定的类型才可以返回。
consumers:指定处理请求的提交内容类型,比如一些json\html\text等的类型。
@ResponseBody:
作用:表示该方法的返回结果是直接写入Http响应报文的报文体中,一般在异步获取数据时使用到的注解。
@RequestBody
作用在形参列表上,用于将前台发送过来固定格式的数据【xml 格式或者 json等】封装为对应的 JavaBean 对象,封装时使用到的一个对象是系统默认配置的 HttpMessageConverter进行解析,然后封装到形参上。
@RequestParam:
作用:是Spring MVC中接收普通参数的注解。用?来与url进行分割,变量名=多少value,如果有多个变量用&来进行分割;
属性:
name:请求参数中的名称;
defaultValue:可以指定默认参数是多少
required:请求参数中是否必须提供参数,它的默认是true,意思是必须提供;
@PathVaribale :
作用:绑定url中的模板变量值,获得请求url中的动态参数。简单来说就是从路径里面去获得变量
区别是: @RequestParam是从请求里面去获取参数,而@PathVaribale是从请求里面去获取变量,直接把路径当做变量
@RequestMapping(path = “/index”,method = RequestMethod.GET)
public String getIndexPage(Model model, Page page,@RequestParam(name = “orderMode”,defaultValue = “0”) int orderMode){
@RequestMapping(path = “/profile/{userId}”,method = RequestMethod.GET)
public String getProfilePage(@PathVariable int userId,Model model){
3.5介绍一下Spring MVC中的拦截器
拦截器会对处理器进行拦截,这样通过拦截器就可以增强处理器的功能。在Spring MVC中,所有的拦截器都需要实现HandlerInterceptor接口,该接口主要包含三个方法:preHandler()、postHandler()、afterCompletion()。
执行preHandler方法,它会返回一个布尔值,如果为false,则结束所有的流程,如果为true,会将请求放行,继续执行下一步;而postHandler()和afterCompletion()方法是没有返回值的。
开发步骤:
(1)开发拦截器:创建一个Interceptor接口,去实现HandlerInteceptor接口,从三个方法中选择需要实现的方法,实现拦截时要执行的具体业务逻辑。
(2)注册拦截器:定义配置类,并让他实现WebMvcConfigure接口,在接口的addInterceptors方法中注册拦截器,并定义该拦截器匹配哪些请求路径。
3.6怎么去做请求拦截?
(1)如果是对Controller进行拦截,可以使用SpringMvc中的Inteceptor接口;
(2)如果是对所有的请求包括对静态资源的访问进行拦截,可以使用Filter进行拦截,例如springCloud中的zuul、Gateway组件就可以实现网关层的拦截;
(3)如果是对除了Controller以外其他的bean需要进行拦截的话,可以使用springAop来实现。