一、SpringMVC的实现过程
  1. 初始化容器,扫描所有bean并实例化
  2. Aspect Weaver 完成对切面的织入
  3. 依赖注入
  4. 初始化请求处理器责任链
    • 预处理请求路径"/"
    • 静态资源处理,如果是静态资源,则将请求转发给default servlet 处理
    • 如果是JSP资源,则使用forward进行转发
    • controller处理器 : 依靠容器的能力,建立起请求路径,请求方法和Controller方法里的映射
      • 请求路径:遍历所有@RequestMapping的标记类,循环遍历里面@RequestMapping的方法,获取其value值进行拼接("/test/hello"),解析方法里@RequestParam注解和其value
      • RequestPathInfo 存储http请求路径和请求方法
      • ControllerMethod 待执行的Controller及其方法实例和参数的映射
  5. 根据请求方式执行执行controller方法,并返回结果
  6. 根据处理结果,选择对应的render进行渲染,jsp,json,404,500
二、Springmvc 执行流程是什么?
  1. 用户发送请求至前端控制器DispatcherServlet;

  2. DispatcherServlet收到请求后,调用HandlerMapping处理器映射器,请求获取Handler(就是对controller进行实例化),处理器映射器根据请求url找到具体的处理器,生成处理器对象及处理器拦截器(如果有则生成)一并返回给DispatcherServlet;

  3. DispatcherServlet 调用 HandlerAdapter处理器适配器,HandlerAdapter 经过适配调用 具体处理器(Handler,也叫后端控制器,需要执行并获取返回值),Handler执行完成返回ModelAndView

  4. DispatcherServlet将ModelAndView传给ViewResolver视图解析器进行解析,ViewResolver解析后返回具体View;

  5. DispatcherServlet对View进行渲染视图(即将模型数据填充至视图中)

  6. DispatcherServlet响应用户。

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-tZwd93Yl-1624069359025)(C:\Users\94372\AppData\Roaming\Typora\typora-user-images\image-20210528152912134.png)]

三、SpringMVC与Ajax交互的几种形式

SpringMVC:@RequestBody-将请求json串转化成java对象,@ResponseBody-将java对象转换成json串输出

  1. 请求请求key/value,输出json串

    $.ajax({
        type : 'post',
        url : '${pageContext.request.contextPath}/user/login.mvc',
        //请求数据是key/value,这里不需要指定contentType,默认就是key/value类型
        data:'username=cyn&age=18', 
    });
    
    @RequestMapping("login")
    @ResponseBody
    public User login(User user){
        System.out.println(user);
        return user;
    }
    
  2. 请求json输出json串

    $.ajax({
        type : 'post',
        url : '${pageContext.request.contextPath}/user/login.mvc',
        //指定请求数据格式是json串
        contentType:'application/json;charset=utf-8', 
        data:'{"username":"zhangsan","age":"12"}',  
        dataType:{}
    });
    
    @RequestMapping("login")
    @ResponseBody
    public User login(@RequestBody User user){
        System.out.println(user);
        return user;
    }
    
  3. 请求key/value,输出字符串

    response.getWriter().write(user.toString());
    
  4. dataType:

    要求为String类型的参数,预期服务器返回的数据类型。如果不指定,JQuery将自动根据http包mime信息返回responseXML或responseText,并作为回调函数参数传递。可用的类型如下:

    • xml:返回XML文档,可用JQuery处理。
    • html:返回纯文本HTML信息;包含的script标签会在插入DOM时执行。
    • script:返回纯文本JavaScript代码。不会自动缓存结果。除非设置了cache参数。注意在远程请求时(不在同一个域下),所有post请求都将转为get请求。
    • json:返回JSON数据。
    • jsonp:JSONP格式。使用SONP形式调用函数时,例如myurl?callback=?,JQuery将自动替换后一个“?”为正确的函数名,以执行回调函数。
    • text:返回纯文本字符串。
四、springMVC中controller的几种返回类型
  1. 返回ModelAndView

  2. 返回String

    • return “/hello”。真实的访问路径=“/jsp”+"/hello"+“.jsp”
    • return “redirect:/hello” redirect的特点和servlet一样,使用redirect进行重定向那么地址栏中的URL会发生变化,同时不会携带上一次的request
    • return “forward:/hello” 通过forward进行转发,地址栏中的URL不会发生改变,同时会将上一次的request携带到写一次请求中去
  3. 返回void

    • 使用request转发页面request.getRequestDispatcher(“转发路径”).forward(request,response);
    • 使用response进行页面重定向response.sendRedirect(“重定向路径”);
    • 也可以使用response指定响应结果
      response.setCharacterEncoding(“UTF-8”);
      response.setContentType(“application/json;charset=utf-8”);
      response.getWriter.write(“json串”);
五、SpringMVC中如何进行异常处理

最终异常会由controller层被抛到前端控制器DispatcherServlet,由DispatcherServlet找到异常处理器进行处理

异常处理SysExceptionResolver实现HandlerExceptionResolver接口重写resolveException方法

<bean class="com.jing.handler.SysExceptionResolver"/>
六、一些问题集合

12、注解原理:

注解本质是一个继承了Annotation的特殊接口,其具体实现类是JDK动态代理生成的代理类。我们通过反射获取注解时,返回的也是Java运行时生成的动态代理对象。通过代理对象调用自定义注解的方法,会最终调用AnnotationInvocationHandler的invoke方法,该方法会从memberValues这个Map中查询出对应的值,而memberValues的来源是Java常量池。
13、SpringMvc的控制器是不是单例模式?如果是,有什么问题?怎么解决?

答:是单例模式,在多线程访问的时候有线程安全问题,解决方案是在控制器里面不能写可变状态量,如果需要使用这些可变状态,可以使用ThreadLocal机制解决,为每个线程单独生成一份变量副本,独立操作,互不影响。

14、如果在拦截请求中,我想拦截get方式提交的方法,怎么配置?

答:可以在@RequestMapping注解里面加上method=RequestMethod.GET。

16、怎样在方法里面得到Request,或者Session?

答:直接在方法的形参中声明request,SpringMvc就自动把request对象传入。

16、如果想在拦截的方法里面得到从前台传入的参数,怎么得到?

答:直接在形参里面声明这个参数就可以,但必须名字和传过来的参数一样。

17、如果前台有很多个参数传入,并且这些参数都是一个对象的,那么怎么样快速得到这个对象?

答:直接在方法中声明这个对象,SpringMvc就自动会把属性赋值到这个对象里面。

18、SpringMvc中函数的返回值是什么?

答:返回值可以有很多类型,有String,ModelAndView。ModelAndView类把视图和数据都合并的一起的,但一般用String比较好。

19、SpringMvc用什么对象从后台向前台传递数据的?

答:通过ModelMap对象,可以在这个对象里面调用put方法,把对象加到里面,前端就可以通过el表达式拿到。

20、怎么样把ModelMap里面的数据放入Session里面?

答:可以在类上面加上@SessionAttributes注解,里面包含的字符串就是要放入session里面的key。

相关阅读:

Spring常见面试题总结

Mybatis常见面试题总结

MySQL常见面试题总结

RabbitMQ消息队列常见面试题总结

ElasticSearch搜索引擎常见面试题总结

计算机网络常见面试题总结

操作系统常见面试题总结

海量数据处理的方法总结

更多推荐

SpringMVC相关面试题整理