MVC
要讲spring MVC首先从MVC模型讲起。MVC是Model、View、Controller的缩写,分别代表web应用程序中的三种职责:
模型:用于存储数据以及处理用户请求中的业务逻辑
视图:向控制器提交数据,显示模型中的数据
控制器:根据视图提出的请求判断将请求和数据交给哪个模型进行处理,将处理后的有关结果交给哪个视图更新显示
Spring MVC的工作原理
1)用户通过浏览器向服务器发送请求,请求会被Spring MVC的前端控制器DispatcherServlet所拦截;
2)DispatcherServlet拦截到请求后,会调用HandlerMapping处理器映射器;
3)处理器映射器根据请求URL找到具体的处理器,生成处理器对象以及处理器拦截器一并返回给DispatcherServlet;
4)DispatcherServlet会通过返回信息选择合适的HandlerAdapter(处理器适配器)
5)DispatcherServlet会调用并执行Handler(处理器),这里的处理器指的就是程序中编写的Controller类,也称为后端控制器;
6)Controller执行完后,会返回一个ModelAndView对象,该对象中会包含视图名或包含模型和视图名;
7)HandlerAdaPter将ModelAndView对象返回给DispatcherServlet;
8)DispatcherServlet会根据ModelAndView对象选择一个合适的ViewReslover(视图解析器)
Spring MVC重要组件说明:
1、前端控制器DispatcherServlet
作用:Spring MVC 的入口函数。接收请求,响应结果,相当于转发器,中央处理器。有了 DispatcherServlet 减少了其它组件之间的耦合度。用户请求到达前端控制器,它就相当于mvc模式中的c,DispatcherServlet是整个流程控制的中心,由它调用其它组件处理用户的请求,DispatcherServlet的存在降低了组件之间的耦合性。
2、处理器映射器HandlerMapping
作用:根据请求的url查找Handler。HandlerMapping负责根据用户请求找到Handler即处理器(Controller),SpringMVC提供了不同的映射器实现不同的映射方式,例如:配置文件方式,实现接口方式,注解方式等。
3、处理器适配器HandlerAdapter
作用:按照特定规则(HandlerAdapter要求的规则)去执行Handler 通过HandlerAdapter对处理器进行执行,这是适配器模式的应用,通过扩展适配器可以对更多类型的处理器进行执行。
4、处理器Handler
注意:编写Handler时按照HandlerAdapter的要求去做,这样适配器才可以去正确执行Handler,Handler 是继DispatcherServlet前端控制器的后端控制器,在DispatcherServlet的控制下Handler对具体的用户请求进行处理。 由于Handler涉及到具体的用户业务请求,所以一般情况需要工程师根据业务需求开发Handler。
5、视图解析器View resolver
作用:进行视图解析,根据逻辑视图名解析成真正的视图(view) View Resolver负责将处理结果生成View视图,View Resolver首先根据逻辑视图名解析成物理视图名即具体的页面地址,再生成View视图对象,最后对View进行渲染将处理结果通过页面展示给用户。 springmvc框架提供了很多的View视图类型,包括:jstlView、freemarkerView、pdfView等。 一般情况下需要通过页面标签或页面模版技术将模型数据通过页面展示给用户,需要由工程师根据业务需求开发具体的页面。
6、视图View
View是一个接口,实现类支持不同的View类型(jsp、freemarker、pdf…)
重定向和转发的区别
1)重定向是将用户从当前处理请求定向到另一个视图或者处理请求,以前的请求中存放的信息全部失效,并进入一个新的request作用域;转发是将用户对当前处理的请求转发到另一个视图或者处理请求,以前的request中存放的信息不会失效。
2)转发是服务器行为,重定向是客户端行为
拦截器
Spring MVC中的拦截器(Interceptor)用于拦截用户请求并作相应的处理。例如,通过拦截器可以进行权限验证、记录请求信息的日志,判断用户是否登录等。
可通过两种方式实现:
1)通过实现HandlerInterceptor接口,或者继承HandlerInterceptor接口的实现类(如HandlerInterceptorAdapter)来定义
2)通过实现webRequestInterceptor接口,或者继承webRequestInterceptor接口的实现类来定义。