SpringMVC面试题
springmvc是一个应用于表现层的框架
springmvc是对serlvet的封装
注解
@Requestbody
@RequestBody和@ResponseBody主要用于将接收(或响应)的pojo对象,转化为json格式
@RequestParam和@PathVariable的区别
请求参数绑定
SpringMVC在接受参数时,是可以直接绑定pojo类型的,甚至是pojo里面还嵌套了pojo也都可以,只要pojo里面的属性名跟接受的参数名称一致就行,因为它是利用反射给pojo的属性set值的。
1、参数名跟形参名一致就行,不一致加@RequestParam
2、是pojo类型,参数名跟Pojo的属性名一致就行,跟形参名(就是pojo的名称)没关系
3、是复杂pojo类型(里面还有pojo),同样保持属性名一致,只不过可以加上. 来定位到内部pojo的属性
SpringMVC工作流程
某支付公司问了这个问题,基本上说出图中的这些顺序就行了。
1、 请求发过来,首先是经过前端控制器
2、 通过处理器映射器HandlerMapping,获取能够处理当前请求的执⾏链(里面存放该请求需要经过的拦截器和处理器)
3、 遍历处理器适配器列表(List<HandlerAdapter>),找到能支持这个处理器的HandlerAdapter
为什么要有这个适配器?因为处理器不止controller一种类型
4、 顺序执行拦截器的preHandle方法
5、 调用处理器适配器的handle方法---->执行处理器,返回ModelAndView
6、 顺序执行拦截器的postHandle方法
7、 ModelAndView传回前端控制器,前端控制器调用视图解析器,把逻辑视图名解析为具体的View,再进行页面渲染
在最后视图解析器部分,会把modelAndView的Model也就是数据给取出来,设置到request里面,这也是为什么jsp能取到数据的原因:
protected void exposeModelAsRequestAttributes(Map<String, Object> model,
HttpServletRequest request) throws Exception {
model.forEach((name, value) -> {
if (value != null) {
request.setAttribute(name, value);
}
else {
request.removeAttribute(name);
}
});
}
SpringMVC九大组件
九大组件都是接口,接口定义了规范,如果我们想自定义组件,只需实现接口即可
核心组件
前端控制器:接受请求、响应结果
处理器映射器:根据url查找handler、拦截器,组成拦截器链
处理器适配器:适配合适的处理器
处理器
视图解析器:把视图的逻辑名解析成真正的视图
过滤器和拦截器的区别
-
过滤器Filter:请求最先经过过滤器,如果配置为/*可以对所有资源访问(servlet、js、css等静态资源)进行过滤处理
-
拦截器Inerceptor:拦截器是SpringMVC框架的,不会拦截jsp html css image等的访问,只拦截访问的控制器方法
-
拦截器有三个拦截的时机:
在Handler业务逻辑执⾏之前拦截⼀次
在Handler逻辑执⾏完毕但未跳转⻚⾯之前拦截⼀次
在跳转⻚⾯之后拦截⼀次
-
拦截器是包裹在过滤器里面的:
@Override
//这个是调用过滤器的方法
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
System.out.println("filter before...");
chain.doFilter(request,response);//然后这个方法里面会调用DispatcherServlet的doService,然后拦截器是在doService()方法中调用的doDispatch()方法中执行的
System.out.println("filter after.....");
}
Cookie与Session
cookie数据存放在客户的浏览器上,session数据放在服务器上。
session会话机制:session会话机制是一种服务器端机制,它使用类似于哈希表(可能还有哈希表)的结构来保存信息。
cookies会话机制:cookie是服务器存储在本地计算机上的小块文本,并随每个请求发送到同一服务器。
Cookie是怎么做的?
1、首先,客户端浏览某个使用cookie网站时,该网站服务器就为该客户端生成一个唯一的标识码,并以此作为索引在服务器的后端数据库中产生一个项目
2、在给客户端发送的响应报文中,会添加一个首部行如下:
Set-cookie:唯一标识
3、客户端拿到这个唯一标识后,浏览器就在它管理的Cookie文件中添加一行,包括服务器主机名和唯一标识
4、以后客户端浏览这个网站时,每发送一个http报文,浏览器就会从其Cookie文件中取出这个唯一标识,放到请求报文的首部行中:
Cookie:唯一标识
这样,服务器就能跟踪该客户端在该网站的活动。
参考:《计算机网络(第7版) 谢希仁 著》
Rest
资源表现层状态转移
1、定位资源:URL 也就是说整个URL中只有表示资源的名称,没有动词
2、操作资源:使⽤HTTP请求中的method⽅法put、delete、post、get来操作资源
Spring MVC ⽀持 RESTful ⻛格请求
优点
它结构清晰、符合标准、易于理解、扩展⽅便,所以正得到越来越多⽹站的采⽤。
请求转发和重定向
转发 | 重定向 |
---|---|
只能访问当前服务器下的资源 | 可以访问其他服务器资源 |
一次请求,可以共享request域 | 两次请求,不可以共享request域的数据 |
地址栏不会改变 | 地址栏改变 |
Request和Session
request:就是从上个页面取出参数,结果输出来后,request就结束了;多用于表单提交等
session:session可以跨越多个页面;多用于服务器端记录变量,比如用户登录登出