springmvc拦截器实现原理是什么(springmvc拦截器使用场景)

详解Spring mvc工作原理及源码分析

Model 模型层 (javaBean组件 = 领域模型(javaBean) + 业务层 + 持久层)

View 视图层( html、jsp…)

Controller 控制层(委托模型层进行数据处理)

springmvc是一个web层mvc框架,类似struts2。

springmvc是spring的部分,其实就是spring在原有基础上,又提供了web应用的mvc模块。

实现机制:

struts2是基于过滤器实现的。

springmvc是基于servlet实现的。

运行速度:

因为过滤器底层是servlet,所以springmvc的运行速度会稍微比structs2快。

struts2是多例的

springmvc单例的

参数封装:

struts2参数封装是基于属性进行封装。

springmvc是基于方法封装。颗粒度更细。

⑴ 用户发送请求至DispatcherServlet。

⑵ DispatcherServlet收到请求调用HandlerMapping查询具体的Handler。

⑶ HandlerMapping找到具体的处理器(具体配置的是哪个处理器的实现类),生成处理器对象及处理器拦截器(HandlerExcutorChain包含了Handler以及拦截器集合)返回给DispatcherServlet。

⑷ DispatcherServlet接收到HandlerMapping返回的HandlerExcutorChain后,调用HandlerAdapter请求执行具体的Handler(Controller)。

⑸ HandlerAdapter经过适配调用具体的Handler(Controller即后端控制器)。

⑹ Controller执行完成返回ModelAndView(其中包含逻辑视图和数据)给HandlerAdaptor。

⑺ HandlerAdaptor再将ModelAndView返回给DispatcherServlet。

⑻ DispatcherServlet请求视图解析器ViewReslover解析ModelAndView。

⑼ ViewReslover解析后返回具体View(物理视图)到DispatcherServlet。

⑽ DispatcherServlet请求渲染视图(即将模型数据填充至视图中) 根据View进行渲染视图。

⑾ 将渲染后的视图返回给DispatcherServlet。

⑿ DispatcherServlet将响应结果返回给用户。

(1)前端控制器DispatcherServlet(配置即可)

功能:中央处理器,接收请求,自己不做任何处理,而是将请求发送给其他组件进行处理。DispatcherServlet 是整个流程的控制中心。

(2)处理器映射器HandlerMapping(配置即可)

功能:根据DispatcherServlet发送的url请求路径查找Handler

常见的处理器映射器:BeanNameUrlHandlerMapping,SimpleUrlHandlerMapping,

ControllerClassNameHandlerMapping,DefaultAnnotationHandlerMapping(不建议使用)

(3)处理器适配器HandlerAdapter(配置即可)

功能:按照特定规则(HandlerAdapter要求的规则)去执行Handler。

通过HandlerAdapter对处理器进行执行,这是适配器模式的应用,通过扩展多个适配器对更多类型的处理器进行执行。

常见的处理器适配器:HttpRequestHandlerAdapter,SimpleControllerHandlerAdapter,AnnotationMethodHandlerAdapter

(4)处理器Handler即Controller(程序猿编写)

功能:编写Handler时按照HandlerAdapter的要求去做,这样适配器才可以去正确执行Handler。

(5)视图解析器ViewReslover(配置即可)

功能:进行视图解析,根据逻辑视图名解析成真正的视图。

ViewResolver负责将处理结果生成View视图,ViewResolver首先根据逻辑视图名解析成物理视图名即具体的页面地址,再生成View视图对象,最后对View进行渲染将处理结果通过页面展示给用户。

springmvc框架提供了多种View视图类型,如:jstlView、freemarkerView、pdfView...

(6)视图View(程序猿编写)

View是一个接口,实现类支持不同的View类型(jsp、freemarker、pdf...)

引入相关依赖:spring的基本包、springmvc需要的spring-webmvc,日志相关的slf4j-log4j12,jsp相关的jstl、servlet-api、jsp-api。

因为DispatcherServlet本身就是一个Servlet,所以需要在web.xml配置。

一、使用默认加载springmvc配置文件的方式,必须按照以下规范:

①命名规则:-servlet.xml ==== springmvc-servlet.xml

②路径规则:-servlet.xml必须放在WEB-INF下边

二、如果要不按照默认加载位置,则需要在web.xml中通过标签来指定springmvc配置文件的加载路径,如上图所示。

将自定义的 Controller 处理器配置到 spring 容器中交由 spring 容器来管理,因为这里的 springmvc.xml 配置文件中处理器映射器配置的是 BeanNameUrlHandlerMapping ,根据名字可知这个处理器映射器是根据 bean (自定义Controller) 的 name 属性值url去寻找执行类 Handler(Controller) , 所以bean的name属性值即是要和用户发送的请求路径匹配的 url 。

根据视图解析路径:WEB-INF/jsps/index.jsp

功能:根据bean(自定义Controller)的name属性的url去寻找执行类Controller。

功能:自定义的处理器(Controller)实现了Controller接口时,适配器就会执行Controller的具体方法。

SimpleControllerHandlerAdapter会自动判断自定义的处理器(Controller)是否实现了Controller接口,如果是,它将会自动调用处理器的handleRequest方法。

Controller接口中有一个方法叫handleRequest,也就是处理器方法。

因此,自定义的Controller要想被调用就必须实现Controller接口,重写Controller接口中的处理器方法。

spring mvc 框架中拦截web请求是通过什么技术?

可以是基于url

基于URL

也可以是基于Spring boot

1.拦截器介绍

Web开发中,可以用Filter(过滤器)和 HandlerInterceptor(拦截器) 来过滤web请求,都能对客户端发来的请求进行处理。

过滤器:是一个服务器端的组件,它可以截取用户端的请求和响应信息,并对这些信息过滤。

Spring MVC 中的拦截器(Interceptor)类似于 Servlet 开发中的过滤器 Filter,它主要用于拦截用户请求并作相应的处理,它也是 AOP 编程思想的体现,底层通过动态代理模式完成。听说:只有经过DispatcherServlet 的请求,才会走拦截器链,我们自定义的Servlet 请求是不会被拦截的

参考 Spring:过滤器filter、拦截器interceptor、和AOP的区别与联系

原理

Filter:过滤器是基于函数回调。

HandlerInterceptor:拦截器是基于java的反射机制,使用代理模式

作用域不同

Filter:过滤器依赖于servlet容器,只能在 servlet容器,web环境下使用。跟Spring没有关系

HandlerInterceptor:拦截器依赖于spring容器,可以在spring容器中调用,不管此时Spring处于什么环境

过滤内容

Filter:过滤器可以对几乎所有的请求起作用(可以保护资源)

HandlerInterceptor:拦截器只能对action起作用

细粒度的不同

Filter:过滤器的控制比较粗,只能在请求进来时进行处理,对请求和响应进行包装

HandlerInterceptor:拦截器提供更精细的控制,可以在controller对请求处理之前或之后被调用,也可以在渲染视图呈现给用户之后,以及request全部结束之后,都可以拦截到

中断

Filter:过滤器比较复杂,需要处理请求和响应对象来引发中断,需要额外的动作,比如将用户重定向到错误页面

HandlerInterceptor:不能通过拦截器修改request内容,但是可以通过抛出异常或者preHandle方法内返回 false 进行中断来暂停request执行 

小结

如果过滤器和拦截器同时存在:执行顺序:过滤前-拦截前-Action处理-拦截后-过滤后

替代:过滤器能做的,拦截器基本上都能做

————————————————

原文链接:

mvc和springmvc在b/s下的实现原理

    关于昨天mvc说到是框架,但是不知道你们发现没有这里说的框架和我们平时说的框架比如spring框架,sturts框架等等,感觉有什么不对劲。可以在知乎里面看一下,mvc是否是设计模式。

  这里不过多讨论,毕竟笔主目前也没有参加过什么项目,只是自己做几个不入流小系统。《设计模式》那本书,我也还没有看。所以我妄下结论。

    虽然没有学过这么多更深层次的东西,但是毕竟我们还是要继续学习,马士兵老师也说了一些,不要往一个点深究(当然有时间,想这些还是有很多好处的)。因为这样学习,进度会十分缓慢。

  借视频里面的图让我们来说一说mvc在bs系统下的运行过程

1.用户发出请求到控制器(如果有过滤器另说~废话真多23333)。

2.控制器接收到请求以后,控制器会请求模型让它去处理。

3.模型处理完数据以后,就会将请求结果响应回控制器。

4.控制器接受到模型处理后的数据,就会将数据渲染到视图里面。

5.然后将视图响应给用户。

这就是比较传统的步骤。当然如果前端用的是静态页面,用ajax请求,响应给浏览器,那怎么渲染?我就不清楚(毕竟前端学的还是不行),懂得可以在讨论区说一下,还有怎么测试ajax请求?

springmvc的运行原理

  视频截屏截不完,所以我在网上找了一张图。

这图将步骤过程描述了出来。

我在重新整理一遍过程。

1.用户发出请求,但是目的地不同虽说都是控制器,但是springmvc里面是叫前端控制器。

2.前端控制器向处理处理映射器映射器发出请求,这一步和原来的mvc有所区别。这里因为初学,个人推测是不是url里面比如login.jsp和Login.jsp都是找到LoginController。在servlet的时候是通过注解和xml文件配置实现(注意这里是个人臆测)。在这里加入处理器映射器可能又多了一些操作,看后面学习分解。

3.然后返回的是一个执行链,其中包括我们需要的handler处理器(其实就是以前的controller),拦截器1,拦截器2等等。执行链本身就是个包装类,包装了上面的一些属性。

4.前端控制器根据返回的执行链,请求handler适配器执行handler。

5.handler执行完了以后,会返回模型和视图和视图给前端控制器(这里的视图和最终显示的视图还是有区别的)。

6.前端控制器将返回来的模型和视图给视图解析器。

7.视图解析器将视图解析成真正的视图(怎么换的?)

8.视图解析器将view返回给前端控制器。

9.前端控制器将model数据渲染到视图里面,然后响应给浏览器。

虽然自己写的和图步骤编号不同,但是内容步骤是一样的。

这里有几点问题

1.处理器映射器返回回来的执行链里面的拦截器是什么时候执行的?

2.handler适配器,是怎么选择handler的?

3.返回的model是在哪里真正执行的?

handler里面执行的,然后将数据存入modelandview里面

有想法可以在下方一起讨论。

SpringMVC的拦截器和过滤器的区别与联系

拦截器与过滤器的区别 :

拦截器是基于java的反射机制的,而过滤器是基于函数回调。

拦截器不依赖与servlet容器,过滤器依赖与servlet容器。

拦截器只能对action请求起作用,而过滤器则可以对几乎所有的请求起作用。

拦截器可以访问action上下文、值栈里的对象,而过滤器不能访问。

在action的生命周期中,拦截器可以多次被调用,而过滤器只能在容器初始化时被调用一次。

拦截器,在AOP(Aspect-Oriented Programming)中用于在某个方法或字段被访问之前,进行拦截然后在之前或之后加入某些操作。

过滤器是一个程序,它先于与之相关的servlet或JSP页面运行在服务器上。过滤器可附加到一个或多个servlet或JSP页面上,并且可以检查进入这些资源的请求信息。

未经允许不得转载:便宜VPS网 » springmvc拦截器实现原理是什么(springmvc拦截器使用场景)