一、SpringMVC的实现过程
- 初始化容器,扫描所有bean并实例化
- Aspect Weaver 完成对切面的织入
- 依赖注入
- 初始化请求处理器责任链
- 预处理请求路径"/"
- 静态资源处理,如果是静态资源,则将请求转发给default servlet 处理
- 如果是JSP资源,则使用forward进行转发
- controller处理器 : 依靠容器的能力,建立起请求路径,请求方法和Controller方法里的映射
- 请求路径:遍历所有@RequestMapping的标记类,循环遍历里面@RequestMapping的方法,获取其value值进行拼接("/test/hello"),解析方法里@RequestParam注解和其value
- RequestPathInfo 存储http请求路径和请求方法
- ControllerMethod 待执行的Controller及其方法实例和参数的映射
- 根据请求方式执行执行controller方法,并返回结果
- 根据处理结果,选择对应的render进行渲染,jsp,json,404,500
二、Springmvc 执行流程是什么?
-
用户发送请求至前端控制器DispatcherServlet;
-
DispatcherServlet收到请求后,调用HandlerMapping处理器映射器,请求获取Handler(就是对controller进行实例化),处理器映射器根据请求url找到具体的处理器,生成处理器对象及处理器拦截器(如果有则生成)一并返回给DispatcherServlet;
-
DispatcherServlet 调用 HandlerAdapter处理器适配器,HandlerAdapter 经过适配调用 具体处理器(Handler,也叫后端控制器,需要执行并获取返回值),Handler执行完成返回ModelAndView;
-
DispatcherServlet将ModelAndView传给ViewResolver视图解析器进行解析,ViewResolver解析后返回具体View;
-
DispatcherServlet对View进行渲染视图(即将模型数据填充至视图中)
-
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串输出
-
请求请求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; }
-
请求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; }
-
请求key/value,输出字符串
response.getWriter().write(user.toString());
-
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的几种返回类型
-
返回ModelAndView
-
返回String
- return “/hello”。真实的访问路径=“/jsp”+"/hello"+“.jsp”
- return “redirect:/hello” redirect的特点和servlet一样,使用redirect进行重定向那么地址栏中的URL会发生变化,同时不会携带上一次的request
- return “forward:/hello” 通过forward进行转发,地址栏中的URL不会发生改变,同时会将上一次的request携带到写一次请求中去
-
返回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相关面试题整理
发布评论