SpringMVC面试题

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方法

7ModelAndView传回前端控制器,前端控制器调用视图解析器,把逻辑视图名解析为具体的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可以跨越多个页面;多用于服务器端记录变量,比如用户登录登出

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值