Java面试题-day22 SpringMVC

SpringMVC

1. Spring MVC比较 Struts2

  1. springmvc的入口是一个servlet即前端控制器,而struts2入口是一个filter过虑器。

  2. springmvc是基于方法开发(一个url对应一个方法),请求参数传递到方法的形参,可以设计为单例或多例(建议单例),struts2是基于类开发,传递参数是通过类的属性,只能设计为多例。

  3. Struts采用值栈存储请求和响应的数据,通过OGNL存取数据, springmvc通过参数解析器是将request请求内容解析,并给方法形参赋值,将数据和视图封装成ModelAndView对象,最后又将ModelAndView中的模型数据通过reques域传输到页面。Jsp视图解析器默认使用jstl。

2. SpringMVC处理流程

在这里插入图片描述

  1. 向服务器发送HTTP请求,请求被前端控制器 DispatcherServlet 捕获。
  2. DispatcherServlet 根据< servlet-name >-servlet.xml 中的配置对请求的URL进行解析,得到请求资源标识符(URI)。然后根据该URI,调用 HandlerMapping 获得该Handler配置的所有相关的对象(包括Handler对象以及Handler对象对应的拦截器),最后以 HandlerExecutionChain 对象的形式返回。
  3. DispatcherServlet 根据获得的Handler,选择一个合适的 HandlerAdapter。
  4. 提取Request中的模型数据,填充Handler入参,开始执行Handler(Controller)。在填充Handler的入参过程中,根据你的配置,Spring将帮你做一些额外的工作:
    HttpMessageConveter:将请求消息(如Json、xml等数据)转换成一个对象,将对象转换为指定的响应信息。
    数据转换:对请求消息进行数据转换。如String转换成Integer、Double等。
    数据格式化:对请求消息进行数据格式化。如将字符串转换成格式化数字或格式化日期等。
    数据验证:验证数据的有效性(长度、格式等),验证结果存储到BindingResult或Error中。
  5. Handler(Controller)执行完成后,向 DispatcherServlet 返回一个 ModelAndView 对象
  6. 根据返回的ModelAndView,选择一个适合的 ViewResolver(必须是已经注册到Spring容器中的ViewResolver)返回给DispatcherServlet。
  7. ViewResolver 结合Model和View,来渲染视图。
  8. 视图负责将渲染结果返回给客户端

3. SpringMVC中的组件及各个组件的作用

  1. DispatherServlet:前置控制器,负责接收并处理所有的web请求,根据handlerMapping找到具体的Controller,由controller完成具体的处理逻辑。
  2. HandlerMapping:负责处理web请求和具体的Controller之间的映射关系匹配。
  3. Controller:DispatherServlet的次级控制器,web请求的具体处理者。DispatherServlet获得handlerMapping的返回结果后,调用controller的处理方法处理当前的业务请求,处理完成后返回ModelAndView对象。
  4. ViewResolver:用来处理视图名与具体的view实例之间的映射对应关系。根据ModelAndView中的视图名查找相应的View实现类,然后将查找的结果返回给DispatcherServlet,DispatcherServlet最终会将ModelAndView中的模型数据交给返回的View处理最终的视图渲染工作。
  5. View:为支持多种视图技术,统一抽象视图的生成策略,根据模型数据输出具体的视图。
    而存在,统一抽象视图的生成策略,根据模型数据输出具体的视图。
    在这里插入图片描述

4. Spring MVC 常用的注解

@RequestMapping设置请求映射url
@RequestParam常用于处理简单类型的绑定
@RequestBody注解用于读取http请求的内容(字符串),通过springmvc提供的 HttpMessageConverter接口将读到的内容转换为json、xml等格式的数据并绑 定到controller方法的参数上。
@ResponseBody该注解用于将Controller的方法返回的对象,通过 HttpMessageConverter接口转换为指定格式的数据如:json,xml等,通过 Response响应给客户端

5. 如何使用SpringMVC 完成 JSON 操作

配置 MappingJacksonHttpMessageConverter
如果使用mvc:annotation-driven就不需要配置。
使用 @RequestBody 注解作为请求参数或 ResponseBody作为返回值

6. mvc:annotation-driven

使用mvc:annotation-driven代替注解映射器和注解适配器配置器
mvc:annotation-driven默认加载很多的参数绑定方法,比如json转换解析器就默认加载了,如果使用mvc:annotation-driven就不用配置
RequestMappingHandlerMapping和RequestMappingHandlerAdapter

7. restful架构风格

一种软件架构风格,设计风格而不是标准,只是提供了一组设计原则和约束条件。它主要用于客户端和服务器交互类的软件。基于这个风格设计的软件可以更简洁,更有层次,更易于实现缓存等机制。(强调以资源为导向)

所谓"资源",就是网络上的一个实体,或者说是网络上的一个具体信息。它可以是一段文本、一张图片、一首歌曲、一种服务,总之就是一个具体的实在。你可以用一个URI(统一资源定位符)指向它,每种资源对应一个特定的URI。要获取这个资源,访问它的URI就可以,因此URI就成了每一个资源的地址或独一无二的识别符。

资源定位:互联网所有的事物都是资源,要求url中没有动词,只有名词。没有参数

Url格式:http://blog.csdn.net/beat_the_world/article/details/45621673
(使用restful后,utl中不能用?传参或.action)
资源操作:使用put、delete、post、get,使用不同方法对资源进行操作。分别对应添加、删除、修改、查询。一般使用时还是post和get。Put和Delete几乎不使用。
客户端用到的手段,只能是HTTP协议。具体来说,就是HTTP协议里面,四个表示操作方式的动词:GET、POST、PUT、DELETE。

它们分别对应四种基本操作:GET用来获取资源,POST用来新建资源(也可以用于更新资源),PUT用来更新资源,DELETE用来删除资源。

URI 的设计只要负责把资源通过合理方式暴露出来就可以了。对资源的操作与它无关,操作是通过 HTTP动词来体现,所以REST 通过 URI 暴露资源时,会强调不要在 URI 中出现动词。

比如:左边是错误的设计,而右边是正确的

GET /rest/api/getDogs --> GET /rest/api/dogs 获取所有小狗狗
GET /rest/api/addDogs --> PUT /rest/api/dog 添加一个小狗狗
GET /rest/api/editDogs/:dog_id --> POST /rest/api/dogs/:dog_id 修改一个小 狗狗
GET /rest/api/deleteDogs/:dog_id --> DELETE /rest/api/dogs/:dog_id 删除一 个小狗狗
左边的这种设计,很明显不符合REST风格,上面已经说了,URI 只负责准确无误的暴露资源,而 getDogs/addDogs…已经包含了对资源的操作,这是不对的。相反右边却满足了,它的操作是使用标准的HTTP动词来体现。

8. SpringMvc里面拦截器是怎么实现的?

有两种方式,一种是实现接口,另外一种是继承适配器类,然后在SpringMvc的配置文件中配置拦截器即可。
在这里插入图片描述
使用场景
用户登录判断,在执行Action的前面判断是否已经登录,如果没有登录的跳转到登录页面。
用户权限判断,在执行Action的前面判断是否具有,如果没有权限就给出提示信息。
操作日志

猜你喜欢

转载自blog.csdn.net/m0_56368068/article/details/121178832