目录
一、概述
1、springmvc有什么用?
2、springmvc的执行流程?
二、注解
3、说一说常用的springmvc注解
4、刚才你提到了@RequestMapping,它具体是做什么的?怎么用呢?
5、你知道Restful风格吗?
6、前端往后台传参,后台如何接收?
7、你刚才提到@RequestParam注解,这个注解有什么属性吗?
8、如何获取到请求头的信息?
9、springmvc有个@ResponseBody注解,你了解过吗?
10、除了@ResponseBody的方式进行返回,还有其余的方式吗?
三、拦截器
12、用过拦截器吗?如何自定义拦截器?
13、过滤器与拦截器有什么区别?
14、多个拦截器执行顺序是怎样的?
四、异常处理
15、springmvc是怎么处理异常的?
答:
(1)天生与Spring框架集成。
(2)支持Restful风格。
(3)支持灵活的URL到页面控制器的映射。
(4)非常容易与其他视图技术集成,如:Freemarker等等。
(5)非常灵活的数据验证、格式化和数据绑定机制、能使用任何对象进行数据绑定,不必实现特定框架的API。
(6)更加简单、强大的异常处理。
(7)对静态资源的支持。
(8)支持灵活的本地化、主题等解析。
答:
第一步:发起请求到前端控制器(DispatcherServlet)。
第二步:前端控制器请求处理器映射器HandlerMapping查找Hander。可以根据xml配置,也可以根据注解查找。
第三步:处理器映射器HandlerMapping向前端控制器返回Handler。
第四步:前端控制器调用处理器适配器HandlerAdapter。
第五步:处理器适配器HandlerAdapter去执行Handler。
第六步:handler执行完给适配器返回ModelAndView。
第七步:处理器适配器向前端控制器返回ModelAndView。ModelAndView是springmvc框架的一个底层对象,包括Model和View。
第八步:前端控制器请求视图解析器去进行视图解析。根据逻辑视图名解析成真正的视图(jsp)。
第九步:视图解析器向前端控制器返回View对象。
第十步:前端控制器进行视图渲染。视图渲染将模型数据(在ModelAndView对象中)填充到request域。
第十一步:前端控制器向用户响应结果。
答:@RequestMapping、@RequestParam、@RequestHeader、@CookieValue、@ResponseBody等。
答:@RequestMapping主要是用来映射URL的,它有三个属性,分别是value、method和params。value是用来写映射路径的,method是用来设置请求方式,只有客户端发送请求的方式和method的值一致,才能处理请求。底层是一个枚举。注意method没有默认值,如果你不写这个属性,那么GET、POST都能访问。params是用来设置客户端传到服务器的数据,支持表达式。如果表达式匹配不上,就无法进入到方法中。
答:知道,Restful是(资源)表现层状态转化。是目前最流行的一种互联网软件架构。它结构清晰、符合标准、易于理解、扩展方便,所以正得到越来越多网站的采用。优点是:
① 规范化接口访问方式
这些http操作方法包括GET/POST/PUT/DELETE/OPTIONS等,每个操作方法都代表一个相同意义的操作,它向所有人透明地表明操作方式。比如GET只能读取/拉数据,当然你也可以是添加数据,但建议不要这么做,不然这样就失去了REST的意义。
GET 读取
POST 添加
PUT 修改
DELETE 删除
② 资源标识唯一,通过URI表示一个资源名称,形式/resource/patch。如/users,表示用户的组合,或用户群。当然还可以继续标识某个具体的一个用户,/users/11,表示id为11的用户。当然,你也可以又用一组/usrgroup/11的URI代表操作用户组,不过不建议这么做,因为这样从字面上重复了/users/11资源表示的内容。一个资源URI总是包含第一条实现的方法:
GET /users/11
POST /users/11
PUT /users/11
DELETE /users/11
③ 状态的转化。这就是REST的真实含义,指它允许资源URI具有不同的表现形式。同一个URI,根据不同请求方式,执行的动作不同;还可以根据请求的Header Accept的不同返回不同的结果,如text/html、text/css、text/xml等等。也可以理解为body不同。如查询快递一般,可以上次查询,物品还在仓库,而过一段时间已经在路上了。它表示的是一个互动过程。
答:分形参名是否一致的情况,如果前端传参的名字和controller方法形参的名字一致,那直接就可以接收到,如果名字不一致,则用@RequestParam注解接收。另外还可以使用pojo接收,要求实体类对象中的属性名一定要和页面汇总表单元素的name属性值一致。且支持级联。
答:有required和defaultValue属性,defaultValue是设置个默认值,如果前端传来的参数为null,就走默认值,required如果为true,就是此参数是必要的。
答:有两种方法,一种是使用@RequestHeader注解,另一种是使用HttpServletRequest。
答:了解过,@ResponseBody是将方法的返回值转为json相应给前台,默认是使用jackson处理json。
答:有三种方式往作用域放值并返回,分别是Map、Model、ModelAndView,其实底层都用的ModelAndView。
答:使用@CookieValue注解。
答:springmvc可以使用拦截器对请求进行拦截处理,用户可以自定义拦截器来实现特定的功能,自定义的拦截器可以实现HandlerInterceptor接口,也可以继承HandlerInterceptorAdapter适配器类。
1、preHandle():这个方法在业务处理器处理请求之前被调用,在该方法中对用户请求request进行处理。如果程序员决定该拦截器对请求进行拦截处理后还要调用其他的拦截器,或者是业务处理器去进行处理,则返回true(放行);如果程序员决定不需要再调用其他的组件去处理请求,则返回false(拦截)。
2、postHandle():这个方法在业务处理器处理完请求后,但是DispatcherServlet向客户端返回响应前被调用,在该方法中对用户请求request进行处理。
3、afterCompletion():这个方法在DispatcherServlet完全处理完请求后被调用,可以在该方法中进行一些资源清理的操作。
答:过滤器是 servlet 规范中的一部分,任何 java web 工程都可以使用。拦截器是 springMvc 框架自己的,只有使用了 springmvc 框架的工程才能用。过滤器在 url-pattern 中配置了/*之后,可以对所有要访问的资源拦截。拦截器它是只会拦截访问的控制器方法,如果访问的是 jsp,html、css、image 或者 js 是不会进行拦截的。
答:执行顺序与配置顺序有关。preHandle()是按照配置顺序执行。其它两个方式按相反顺序执行。
答:springmvc通过HandlerExceptionResolver接口处理程序的异常,包括Handler映射、数据绑定以及目标方法执行时发生的异常。Controller调用Service,Service调用Dao,异常都是向上抛出的,最终有DispatcherServlet找异常处理器进行异常的处理。