Spring MVC高频面试知识点(个人总结)

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接: https://blog.csdn.net/weixin_42331540/article/details/88373374

1:整体流程

1、用户发送请求到前端控制器(DispatcherServlet)。

2、前端控制器请求处理器映射器(HandlerMapping)去查找处理器(Handler)。

3、找到以后处理器映射器(HandlerMappering)向前端控制器返回执行链(HandlerExecutionChain)。

4、前端控制器(DispatcherServlet)调用处理器适配器(HandlerAdapter)去执行处理器(Handler)。

5、处理器适配器去执行Handler。

6、处理器执行完给处理器适配器返回ModelAndView。

7、处理器适配器向前端控制器返回ModelAndView。

8、前端控制器请求视图解析器(ViewResolver)去进行视图解析。

9、视图解析器向前端控制器返回View。

10、前端控制器对视图进行渲染。

11、前端控制器向用户响应结果。

2:主要组件

(1)前端控制器 DispatcherServlet(不需要程序员开发)

作用:接收请求、响应结果相当于转发器,有了DispatcherServlet 就减少了其它组件之间的耦合度。

(2)处理器映射器HandlerMapping(不需要程序员开发)

作用:根据请求的URL来查找Handler

(3)处理器适配器HandlerAdapter

注意:在编写Handler的时候要按照HandlerAdapter要求的规则去编写,这样适配器HandlerAdapter才可以正确的去执行Handler。

(4)处理器Handler(需要程序员开发)

要实现重定向或者请求转发时,只需要将方法的返回值设置为String,return “redirect:路径名”

(5)视图解析器 ViewResolver(不需要程序员开发)

作用:进行视图的解析 根据视图逻辑名解析成真正的视图(view)

(6)视图View(需要程序员开发jsp)

View是一个接口, 它的实现类支持不同的视图类型(jsp,freemarker,pdf等等)

3:拦截器和过滤器

滤器依赖于servlet容器。在实现上基于函数回调,可以对几乎所有请求进行过滤,但是缺点是一个过滤器实例只能在容器初始化时调用一次。使用过滤器的目的是用来做一些过滤操作,获取我们想要获取的数据. 比如:在过滤器中修改字符编码;在过滤器中修改  HttpServletRequest的一些参数,包括:过滤低俗文字、危险字符等

拦截器依赖于web框架,在SpringMVC中就是依赖于SpringMVC框架。在实现上基于Java的反射机制,属于面向切面编程(AOP)的一种运用。由于拦截器是基于web框架的调用.因此可以使用spring的依赖注入(DI)进行一些业务操作,同时一个拦截器实例在一个controller生命周期之内可以多次调用。但是缺点是只能对controller请求进行拦截,对其他的一些比如直接访问静态资源的请求则没办法进行拦截处理。

拦截器可以通过实现HandlerInterceptor接口,重写其中的preHandle(作用在Handle之前),postHandle(作用在Handle之后,视图解析器之前),afteCompletion(作用在视图解析器之后)三个方法。当只有一个拦截器的时候执行顺序是:preHandle-》Handle-》postHandle-》视图解析器-》afteCompletion。当有多个拦截器的时候,与他们在spring mvc配置的先后顺序相关,假如interceptor1配置在interceptor2之前。则执行顺序为:preHandle1-》preHandle1-》Handle-》postHandle2-》-》postHandle2-1-》视图解析器-》afteCompletion2-》afteCompletion1。即preHandle是按照配置先后顺序,而postHandle和afteCompletion是配置顺序的相反顺序。

 过滤器的运行是依赖于servlet容器的,跟springmvc等框架并没有关系。并且多个过滤器的执行顺序跟web.xml文件中定义的先后关系有关。

 拦截器的执行顺序跟在SpringMVC的配置文件中定义的先后顺序有关。

4:统一异常处理

  系统的dao、service、controller出现都通过throwsException向上抛出,最后由springmvc前端控制器交由异常处理器进行异常处理,如下图:

 全局异常处理器处理思路:

             解析出异常类型

              如果该异常类型是系统 自定义的异常,直接取出异常信息,在错误页面展示

    如果该异常类型不是系统 自定义的异常,构造一个自定义的异常类型(信息为“未知错误”)

5:解决post和get的中文乱码问题

1)解决post请求乱码问题:

在web.xml中加入:

<filter>

    <filter-name>CharacterEncodingFilter</filter-name>

    <filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>

    <init-param>

        <param-name>encoding</param-name>

        <param-value>utf-8</param-value>

    </init-param>

</filter>

<filter-mapping>

    <filter-name>CharacterEncodingFilter</filter-name>

    <url-pattern>/*</url-pattern>

</filter-mapping>

(2)get请求中文参数出现乱码解决方法有两个:

①修改tomcat配置文件添加编码与工程编码一致,如下:

<ConnectorURIEncoding="utf-8" connectionTimeout="20000" port="8080" protocol="HTTP/1.1" redirectPort="8443"/>

 ②另外一种方法对参数进行重新编码:

String userName= new String(request.getParamter("userName").getBytes("ISO8859-1"),"utf-8")

ISO8859-1是tomcat默认编码,需要将tomcat编码后的内容按utf-8编码。

猜你喜欢

转载自blog.csdn.net/weixin_42331540/article/details/88373374