首先看下整理的Java的学习路线:
这套路线包含了基础到就业,基本是全栈的路线,有前端、后端、微服务、小程序、安卓。到最后手撕源码。
如果你能搞完,你就是大神中的大神了。
前面分享了一个Redis的面试题:
Redis面试题全面掌握
今天复习下SpringMVC的面试题。
1,Spring MVC 框架有什么用?
Spring Web MVC 框架提供 模型-视图-控制器 架构和随时可用的组件,用于开发灵活且松散耦合的 Web 应用程序。
MVC 模式有助于分离应用程序的不同方面,如输入逻辑,业务逻辑和 UI 逻辑,同时在所有这些元素之间提供松散耦合。
2,Spring MVC 的处理流程?
Web 容器启动时会通知 Spring 初始化容器,加载 Bean 的定义信息并初始化所有单例 Bean,然后遍历容器中的 Bean,获取每⼀个 Controller 中的所有⽅法访问的 URL,将 URL 和对应的 Controller 保存 到⼀个 Map 集合中。
所有的请求会转发给 DispatcherServlet 前端处理器处理,DispatcherServlet 会请求 HandlerMapping
找出容器中被Controler注解修饰的 Bean 以及被RequestMapping修饰的⽅法和类,⽣成Handler 和 HandlerInterceptor 并以⼀个 HandlerExcutionChain 处理器执⾏链的形式返回。
之后 DispatcherServlet 使⽤ Handler 找到对应的 HandlerApapter,通过 HandlerApapter 调⽤Handler 的⽅法,将请求参数绑定到⽅法的形参上,执⾏⽅法处理请求并得到 ModelAndView。
最后 DispatcherServlet 根据使⽤ ViewResolver 试图解析器对得到的 ModelAndView 逻辑视图进⾏解析得到 View 物理视图,然后对视图渲染,将数据填充到视图中并返回给客户端。
3,可以描述一下 DispatcherServlet 的工作流程吗?
DispatcherServlet 的工作流程可以用一幅图来说明:
1,向服务器发送 HTTP 请求,请求被前端控制器 DispatcherServlet 捕获。
2,DispatcherServlet 根据 -servlet.xml 中的配置对请求的 URL 进行解析,得到请求资源标识符(URI)。然后根据该 URI,调用 HandlerMapping 获得该 Handler 配置的所有相关的对象(包括 Handler 对象以及 Handler 对象对应的拦截器),最后以HandlerExecutionChain 对象的形式返回。
3,DispatcherServlet 根据获得的Handler,选择一个合适的 HandlerAdapter。(附注:如果成功获得HandlerAdapter后,此时将开始执行拦截器的 preHandler(…)方法)。
4,提取Request中的模型数据,填充Handler入参,开始执行Handler(Controller)。在填充Handler的入参过程中,根据你的配置,Spring 将帮你做一些额外的工作:
HttpMessageConveter:将请求消息(如 Json、xml 等数据)转换成一个对象,将对象转换为指定的响应信息。
数据转换:对请求消息进行数据转换。如String转换成Integer、Double等。
数据根式化:对请求消息进行数据格式化。如将字符串转换成格式化数字或格式化日期等。
数据验证:验证数据的有效性(长度、格式等),验证结果存储到BindingResult或Error中。
5. Handler(Controller)执行完成后,向 DispatcherServlet 返回一个 ModelAndView 对象;
6. 根据返回的ModelAndView,选择一个适合的 ViewResolver(必须是已经注册到 Spring 容器中的ViewResolver)返回给DispatcherServlet。
7. ViewResolver 结合Model和View,来渲染视图。
8. 视图负责将渲染结果返回给客户端。
4,Spring MVC 有哪些组件?
DispatcherServlet :SpringMVC 中的前端控制器,是整个流程控制的核⼼,负责接收请求并转发给对应的处理组件。
Handler :处理器,完成具体业务逻辑,相当于 Servlet 或 Action。
HandlerMapping :完成 URL 到 Controller 映射,DispatcherServlet 通过 HandlerMapping 将不同请求映射到不同 Handler。
HandlerInterceptor :处理器拦截器,是⼀个接⼝,如果需要完成⼀些拦截处理,可以实现该接⼝。
HandlerExecutionChain :处理器执⾏链,包括两部分内容:Handler 和 HandlerInterceptor。
HandlerAdapter :处理器适配器,Handler执⾏业务⽅法前需要进⾏⼀系列操作,包括表单数据验证、数据类型转换、将表单数据封装到JavaBean等,这些操作都由 HandlerAdapter 完成。 DispatcherServlet 通过 HandlerAdapter 来执⾏不同的 Handler。
ModelAndView :装载模型数据和视图信息,作为 Handler 处理结果返回给 DispatcherServlet。
ViewResolver :视图解析器,DispatcherServlet 通过它将逻辑视图解析为物理视图,最终将渲染的结果响应给客户端。
5,Spring MVC 的相关注解有哪些?
@Controller :在类定义处添加,将类交给IoC容器管理。
@RequtestMapping :将URL请求和业务⽅法映射起来,在类和⽅法定义上都可以添加该注解。 value 属性指定URL请求的实际地址,是默认值。 method 属性限制请求的⽅法类型,包括GET、POST、PUT、DELETE等。如果没有使⽤指定的请求⽅法请求URL,会报405 Method Not Allowed 错误。 params 属性限制必须提供的参数,如果没有会报错。
@RequestParam :如果 Controller ⽅法的形参和 URL 参数名⼀致可以不添加注解,如果不⼀致可以使⽤该注解绑定。 value 属性表示HTTP请求中的参数名。 required 属性设置参数是否必要,默认false。 defaultValue 属性指定没有给参数赋值时的默认值。
@PathVariable :Spring MVC ⽀持 RESTful ⻛格 URL,通过的绑定。
通过PathVariable完成请求参数与形参的绑定。
6,如何解决 POST 请求和 GET 请求中文乱码问题?
1,解决 POST 请求乱码问题:在 web.xml 中配置一个 CharacterEncodingFilter 过滤器,设置成 utf-8 ;
GET 请求中出现中文乱码,讲真在url 中传递中文,就不是什么明智之举,最好不要这用做!
但是事情已经发生了,总得要解决的:
1,修改 Tomcat 配置文件;
2,在拼接 url 的时候先做一个编码工作,然后将编码后生成的 url 进行拼接,之后再发送请求,然后再服务端拿到数据后做一次反编码的工作;
3,最好就是定义一个字典,在发送 url 的get 请求之前先查询一下要拼接的 中文 字段对应的字典值,然后用字典值进行传输,完事了再在服务端做解析;
7,SpringMVC 制器是不是单例模式,如果是,有什么问题,怎么解决?
是单例模式,之前在 Spring 篇章里面有说过控制层和Service 层以及 DAO 层一般是无状态的实例,不涉及数据的增删改等操作,只有简单的查询操作,那么就是线程安全的。
所以解决方案就是:在控制器里面不要写可变的状态量,如果需要这些可变的状态量,那么可以通过 ThreadLocal 进行解决,为每个线程提供一个独立的变量副本,进行数据操作。
8,SpringMVC 怎么和AJAX相互调用的?
通过 Jackson 框架可以将 Java 中的对象直接转换为 json 对象:
1,加入 Jackson.jar 包;
2,在配置文件中配置 json 的映射;
3,在接受 ajax 方法里面可以直接返回对象,但是需要使用 @ResponseBody 注解。
9,怎样在方法里面得到Request,或者Session?
直接在方法的形参中声明 request,SpringMVC 就自动把 request 对象传入。
10,SpringMVC 中函数的返回值是什么?
返回值可以有很多类型,有String,ModelAndView。ModelAndView类把视图和数据都合并的一起的,但一般用String比较好。
11,怎么样把ModelMap里面的数据放入Session里面?
可以在类上面加上@SessionAttributes注解,里面包含的字符串就是要放入session里面的key。
12,请说下Springmvc的优点有哪些?
(1)可以支持各种视图技术,而不仅仅局限于JSP;
(2)与Spring框架集成(如IoC容器、AOP等);
(3)清晰的角色分配:前端控制器(dispatcherServlet) , 请求到处理器映射(handlerMapping), 处理器适配器(HandlerAdapter), 视图解析器(ViewResolver)。
(4)支持各种请求资源的映射策略。