Java框架--SpringMVC(工作原理,常用注解)的学习笔记

10 篇文章 0 订阅

SpringMVC
什么是SpringMVC?
  • Spring MVC是一个基于Java的实现了MVC设计模式的请求驱动类型的轻量级Web框架,通过把模型-视图-控制器分离,将web层进行职责解耦,把复杂的web应用分成逻辑清晰的几部分,简化开发,减少出错,方便组内开发人员之间的配合。
SpringMVC的优点
  1. 是Spring框架的一部分,可以方便的利用Spring所提供的其他功能(如IOC容器,AOP等)。
  2. 灵活性强,易于与其他框架集成。
  3. 提供了一个前端控制器DispatcherServlet,使开发人员无需额外开发控制器对象。
  4. 可自动绑定用户输入,并能正确的转换数据类型。
  5. 内置了常见的校验器,可以校验用户输入。如果校验不能通过,那么就会重定向到输入表单。
  6. 支持国际化。可以根据用户区域显示多国语言。
  7. 支持多种视图技术。它支持JSP、Velocity和FreeMarker等视图技术。
  8. 使用基于XML的配置文件,在编辑后,不需要重新编译应用程序。
SpringMVC的原理图

在这里插入图片描述

SpringMVC接口解释
  • DispatcherServlet接口
    Spring提供的前端控制器,所有的请求都有经过它来统一分发。在DispatcherServlet将请求分发给Spring Controller之前,需要借助于Spring提供的HandlerMapping定位到具体的Controller。
  • HandlerMapping接口
    能够完成客户请求到Controller映射。
  • Controller接口
    需要为并发用户处理上述请求,因此实现Controller接口时,必须保证线程安全并且可重用。Controller将处理用户请求,这和Struts Action扮演的角色是一致的。一旦Controller处理完用户请求,则返回ModelAndView对象给DispatcherServlet前端控制器,ModelAndView中包含了模型(Model)和视图(View)。
    • 从宏观角度考虑,DispatcherServlet是整个Web应用的控制器;
    • 从微观角度考虑,Controller是单个Http请求处理过程中的控制器,而ModelAndView是Http请求过程中返回的模型(Model)和视图(View)。
  • ViewResolver接口
    Spring提供的视图解析器(ViewResolver)在Web应用中查找View对象,从而将相应结果渲染给客户。
SpringMVC运行原理
  1. 用户发送请求到前端控制器DispatcherServlet。
  2. DispatcherServlet收到请求调用HandlerMapping处理器映射器。
  3. 处理器映射器找到具体的处理器(可以根据xml配置,注解进行查找),生成处理器对象以及处理器拦截器(如果有则生成)一并返回给DispatcherServlet。
  4. DispatcherServlet调用处理器适配器HandlerAdapter。
  5. HandlerAdapter经过适配调用具体的处理器(Controller,后端控制器)。
  6. Controller执行完成返回ModelAndView。
  7. HandlerAdapter将controller返回的ModelAndView返回给DispatcherServlet。
  8. DispatcherServlet将ModelAndView传送给ViewResolver视图解析器。
  9. VIewResolver解析后返回具体的View。
  10. DispatcherServlet根据View渲染视图(即将模型数据填充至视图中)。
  11. DispatcherServlet响应用户。
SpringMVC常用注解

在这里插入图片描述

  • @Controller
    • 用于标注控制层组件,被标记的类就是一个SpringMVC Controller对象;
    • 分发处理器会扫描使用了该注解的类的方法,并检测该方法是否使用了@RequestMapping注解;
    • 可以把Request请求header部分绑定到方法的参数上。
  • @RestController
    • 相当于@Controller与@ResponseBody的组合效果
  • @Respository
    • 用于标注dao层,在daoImpl类上面注解
  • @Service
    • 用于标注业务层组件
  • @Component
    • 泛指组件,当组件不好归类时,可用此注解标注
  • @ResponseBody
    • 异步请求
    • 该注解用于将Controller的方法返回的对象,通过恰当的HttpMessageConverter转换为指定格式后,写入Response对象的Body数据区。
    • 返回的数据不是Html标签的页面,而是其他某种格式的数据时(json,xml等)使用
  • @RequestMapping
    • 用来处理请求地址映射的注解,可用于类或者方法上。用于类上,表示类中所有响应请求的方法都是以该地址作为父路径。
  • @PathVariable
    • 用于将请求URL中的模板变量映射到功能处理方法的参数上,即取出url模板中的变量作为参数。
  • @RequestsParam
    • 用于在SpringMVC后台控制层获取参数,类似一种时request.getParamter(“name”)
  • @RequestHeader
    • 可以把request请求header部分绑定到方法的参数上
SpringMVC执行流程
1.配置阶段
  • 配置阶段,主要是完成对 xml配置和注解配置。
  • 具体步骤如下:
    1. 首先,从 web.xml 开始,配置 DispatcherServlet 的url 匹配规则和Spring 主配置文件的加载路径。
    2. 然后,就是配置注解,比如@Controller、@Service、@Autowrited 以及@RequestMapping 等。
2.初始化阶段
  • 初始化阶段,主要是加载并解析配置信息以及 IoC 容器、DI 操作和 HandlerMapping 的初始化。
  • 具体步骤如下:
    1. 首先,Web 容器启动以后,会由 Web 容器自动调用DispatcherServlet 的 init()方法。然后,在 init()方法中,会初始化 IoC 容器(Map),紧接着,根据配置好的扫描包路径,扫描出相关的类,并利用反射进行实例化,存放到 IoC 容器中。
    2. 缓存之后,Spring 将再次迭代扫描 IoC 容器中的实例,给需要自动赋值的属性(加了 @Autowired注解 )自动赋值。
    3. 最后,读取 @RequestMapping 注解,获得请求 url,将 url 和 Method 建议一对一的映射关系并缓存起来。可以简单粗暴地理解为缓存在一个 Map 中,它的 Key 就是url,它的值是 Method。
3.运行阶段
  • 运行阶段,在 Spring 启动以后,等待用户请求,完成内
    部调度并返回响应结果。
  • 具体步骤如下:
    1. 用户在浏览器输入 url 之后,Web 容器会接收到用户请求。Web 容器会自动调用 doGet()或者 doPost()方法。从doGet()或者 doPost()方法中,我们可以获得两个对象,分别是 request 和 response。通过 request 可以获得用户请求带过来的信息,通过 response 可以往浏览器端输出响应结果。
    2. 然后,根据 request 中获得的请求 url,可以从HandlerMapping 中找到对应 Method。
    3. 接着,还是利用反射调用方法,将获得方法调用的返回结果。
    4. 最后,将返回结果通过 response 输出到浏览器,用户就可以看到响应结果。
一些问题
Spring MVC的控制器是不是单例模式,如果是,有什么问题,怎么解决?
  • 答:是单例模式,所以在多线程访问的时候有线程安全问题,不要用同步,会影响性能的,解决方案是在控制器里面不能写字段。
Spring MVC怎么样设定重定向和转发的?
  • 答:
    • 转发:在返回值前面加"forward:",如"forward:user.do?name=method4";
    • 重定向:在返回值前面加"redirect:",如"redirect:http://www.baidu.com"。
Spring MVC怎么和AJAX相互调用的?
  • 答:通过Jackson框架就可以把Java里面的对象直接转化成Js可以识别的Json对象。
    具体步骤如下 :
    1. 加入Jackson.jar
    2. 在配置文件中配置json的映射
    3. 在接受Ajax方法里面可以直接返回Object,List等,但方法前面要加上@ResponseBody注解。
Spring MVC中函数的返回值是什么?
  • 答:返回值可以有很多类型,有String, ModelAndView。ModelAndView类把视图和数据都合并的一起的,但一般用String比较好。
  • 4
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

芝麻馅_

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值