Spring之MVC

目录

什么是MVC

 什么是servlet

SpringMVC 

简单的例子来演示MVC过程 

实现获取参数的功能 

获取query string来获取数据

 使用@RequestParam修饰的形参,来传递参数

直接定义请求参数的对象

获取POST请求体的内容

 @RequestBody 接收JSON对象

 获取URL中参数@PathVariable

 上传文件@RequestPart

HttpServletRequest和HttpSession 

实现输出数据的功能 

@ResponseBody

返回静态资源

返回动态资源 

总结


什么是MVC

MVC的官方定义

Spring Web MVC is the original web framework built on the Servlet API and has been
included in the Spring Framework from the very beginning. The formal name, “Spring Web
MVC,” comes from the name of its source module (spring-webmvc), but it is more commonlyknown as “Spring MVC”.

  • MVC是一种设计模式,三层架构也是是对MVC模式的实现的软件层次,我们写代码需要跟着三层架构的模式去区分功能
  • 1. Spring MVC 是一个 Web 框架。
  • 2. Spring MVC 是基于 Servlet API 构建的

  • Model(模型)是应用程序中用于处理应用程序数据逻辑的部分。通常模型对象负责在数据库中存取数据(数据访问层(mapper)的功能),和对应数据的逻辑性操作比如组装数据(业务逻辑层(service)的功能)
  • View(视图)是应用程序中处理数据显示的部分。通常视图是依据模型数据创建的。
  • Controller(控制器)是应用程序中处理用户交互的部分。通常控制器负责从视图读取数据,控制用户输入,并向模型发送数据。
  • View:用来处理展示相关流程的对象(过程对象)
  • Controller:用来处理数据加工流程的对象(过程对象)
  • Model:  1获取数据对象    2获取数据对象的过程对象

 什么是servlet

首先认识所面对的问题

  • 我们的浏览器发起了HTTP请求之后,我们如何在后端读取到这个请求,根据我们的业务需要,进行处理,发送给回浏览器
  • 第一步:我们需要回应HTTP请求,完成一次标准的HTTP协议通信——一个标准的HTTP的服务器
  • 第二步:我们需要将一次HTTP请求-响应,对应到Java的语句(Java的语句一定放在方法中)——将请求-响应的处理过程对应到某个类下的方法对应起来——Servelet容器的功能

  • 根据定义我们MVC框架是基于Servelt构建的
  • Servlet是Java提供的一门动态web资源开发的技术,如何称为动态,也就是不同的用户访问一个资源,所展现的页面是不一样的,比如张三访问是张三欢迎你,李四访问是李四欢迎你,我访问是你不能访问该页面,类似这种功能的实现
  • Servlet是JavaEE的规范之一,其实就是一个接口,将来我们需要定义Servlet类来实现Servlet接口,并由web服务器来运行Servlet
  • Tomcat是一个轻量级的web服务器,可以称为web容器,Servlet容器,web服务器封装了http协议,简化我们的开发,其次将web项目部署到服务器中,可以对外提供网上浏览服务

 

对于原始的问题:浏览器发起了HTTP请求之后,我们如何去后端去读取这个请求,进行处理,构建出响应,发送给浏览器

第一步构建一个HTTP服务器

第二步如何将一次HTTP请求对应到我们的Java代码

Servlet就是我们规定了一个接口

  • 我们的资源都是一个Servlet接口的实现类,每次请求过来之后,根据标准和资源的路径,我们映射到不同的资源对象上
  • 请求中的数据,就被封装成ServletRequest对象
  • 响应中的数据(空的),封装成ServletResponse对象
  • 然后业务方根据Request中的数据+自己维护的数据——>去填充Response对象
  • 最后将Respnose对象发给客户端 

关于HTTP对Servlet的实现的抽象类HttpServlet

  •  当实现了Servlet标准之后,我们一般就称这个软件是是一个Servlet容器了

Tomcat提供的软件

  •  Tomact提供的软件=Http服务器+Servlet容器

关于不同角度看待Servlet

 

MVC的执行过程

前提条件

1Spring内置了一个Tomcat,Tomcat启动,2然后将所有@Controller注解修饰的类,实例化成bean对象,扫描这些controller对象中的方法,发现那些@RequestMapping注解修饰的,视为一个web资源,将为所有的web资源管理起来,用一个Map来记录——HanderMapping

  1. 前端的请求到达了DispatcherServlet(这个就是我们的Servlet对象)的某个方法(通过HTTP服务器和Servelt容器的功劳) 
  2. 根据资源的路径url,从HanderMaping中得知(并不是执行)对应的处理器(Hander),如果没有找到,那么说明就是404,请求了一个错误的路径的web资源
  3. Hander实际上不仅仅是一个方法,而是方法的链条(一个执行链executionChain),可能会存在对应的拦截器(比如前置拦截器和后置拦截器,这是AOP思想的体现,但是不上SpringAOP实现的)
  4. 从Hander中得到相应的处理器的适配器(为什么需要适配器,因为我们的handler有很多种实现方式,所以使用适配器模式),为了选择最合适的形参和对应调用方法by反射做到的
  5. 通过适配器去调用处理器方法——视为调用到我们自己写的方法上(我们的写的Controller的方法)
  6. 如果我们的方法没有通过@ResponseBody修饰,整个方法应该返回应该ModelAndViem
  7. DispatcherServlet得到具体的ModelAndViem对象
  8. 得到具体的视图解析器(ViewResolver):Thymeleaf View Resolver,通过具体的视图解析器来得到具体的View对象,视图对象
  9. 把Model的中的数据填充到View中,渲染视图
  10. 将相应内容填充到HttpServletResponse对象(Servlet API的要求,自然变成了HTTP响应返回给浏览器)

SpringMVC 

  • Servlet 就是 Tomcat 这个 HTTP 服务器提供给 Java 的一组 API, 来完成构建动态页面这个任务。
  • SpringMVC 是再 Servlet 基础之上,提供的一组更加便捷的开发 Web 资源的框架
  • 也就是基于Java实现MVC模型的轻量级Web框架,其实就是用来做表现层开发(View+Controller)的技术

 

MVC 和 Spring MVC 的关系

  • MVC 是一种思想,而 Spring MVC 是对 MVC 思想的具体实现。总结来说,Spring MVC 是一个实现了 MVC 模式,并继承了 Servlet API 的 Web 框架。既然是 Web 框架,那么当用户在浏览器中输入了 url 之后,我们的 Spring MVC 项目就可以感知到用户的请求。

为什么要学 Spring MVC?
现在绝大部分的 Java 项目都是基于 Spring(或 Spring Boot)的,而 Spring 的核心就是 SpringMVC。也就是说 Spring MVC 是 Spring 框架的核心模块,而 Spring Boot 是 Spring 的脚手架,因此我们可以推断出,现在市面上绝大部分的 Java 项目约等于 Spring MVC 项目,这是我们要学 Spring MVC的原因。

怎么学 Spring MVC?

  • 1. 连接的功能:将用户(浏览器)和 Java 程序连接起来,也就是访问一个地址能够调用到我们的Spring 程序。
  • 2. 获取参数的功能:用户访问的时候会带一些参数,在程序中要想办法获取到参数。
  • 3. 输出数据的功能:执行了业务逻辑之后,要把程序执行的结果返回给用户。
     

简单的例子来演示MVC过程 

添加依赖 

  • 动态资源
  • 添加几个拦截器
  • 准备好一些view文件,也俗称为模板文件
  • 动态资源中准备好一些数据——所谓的model
  • 动态资源返回 model and viem 1直接返回ModelAndViem对象 2返回字符串(仅代表view的名字)

拦截器

view文件 

  • 我们放在templates目录下

动态资源和model

其他方式实现

最后显示的效果

拦截器的效果

 

  • model+view得到了最后的效果 

  • demo.html不上一个web资源,他只是我们为了得到/demp这个动态资源的一个中间的材料罢了 

怎么使用 Spring MVC的连接的功能

连接功能:就是我们在网页能去访问我们的动态资源 

  • 就是把我们的web资源请求,变成一个具体的Java代码,SpringMVC提供了几种方式,我们只学习其中的一中,基于方法的处理器(MethoderHander)

如何实现

  • 要求类必须被@Controller修饰(@RestController)注释修饰1 这个类被Spring管理起来(IoC的意义)2这个类属于控制器(SpringMVC的意义)
  • 方法被@RequestMapping,@GetMapping,@PostMapping注释修饰

简易写法

实现获取参数的功能 

什么是获取参数

在HTTP请求的时候,客户端访问会带一些参数,在程序中想办法获取收到的参数,就是我们的获取参数功能 

HTTP携带数据的形式

获取query string来获取数据

  • 这种方式就跟通过表单传递参数一样的原理,因为表单也是通过url的query string传递参数

 使用@RequestParam修饰的形参,来传递参数

 当参数和传入的参数名字一样

 当参数和传入的参数名字不一样

  •  require=false的意思是可以不存在这个参数,如果不写,就默认表示肯定存在这个参数,如果没有就会导致400的情况发生

required的意思

关于数据类型转换

 

直接定义请求参数的对象

  • SpringMVC将请求参数构建对象@Model

  • 我们通过日志可以看出来是先调用无参构造,然后去调用对应参数的setter的方法 
  • 当参数比较多的时候,采用这种方法比较好

获取POST请求体的内容

 @RequestBody 接收JSON对象

 获取URL中参数@PathVariable

  • 将url的路径的一部分作为参数

 上传文件@RequestPart

  • 通过form表单进行文件的上传:content-type:multipart/form-data
  • 后端通过@RequestPart进行读取

HttpServletRequest和HttpSession 

  • HttpSession等价于先获取HttpServletRequest对象,再直接调用rquest.getSession(),一般不用

 

实现输出数据的功能 

什么是输出数据功能

执行了业务逻辑之后,要把程序执行的结果返回给用户,也就是如何将响应返回给客户端 

  • 通过上面的学习我们知道,默认请求下无论是 Spring MVC 或者是 Spring Boot 返回的是视图(xxx.html),而现在都是前后端分离的,后端只需要返给给前端数据即可,这个时候我们就需要使用@ResponseBody 注解了。

@ResponseBody

  •  注解 @ResponseBody,使用在控制层(controller)的方法上。

作用

  •  将方法的返回值,以特定的格式写入到response的body区域,进而将数据返回给客户端。当方法上面没有写ResponseBody,底层会将方法的返回值封装为ModelAndView对象。 如果返回值是字符串,那么直接将字符串写到客户端;如果是一个对象,会将对象转化为json串,然后写到客户端。
  • @ResponseBody 返回的值如果是字符会转换成 text/html,如果返回的是对象会转换成
    application/json 返回给前端。
  • @ResponseBody 可以用来修饰方法或者是修饰类,修饰类表示类中的所有方法都会返回 html 或者json,而不是视图(ModelAnaView)。

@RequestMapping("/login")
  @ResponseBody
  public User login(User user){
    return user;
  }
  User字段:userName pwd
  那么在前台接收到的数据为:'{"userName":"xxx","pwd":"xxx"}'

  效果等同于如下代码:
  @RequestMapping("/login")
  public void login(User user, HttpServletResponse response){
    response.getWriter.write(JSONObject.fromObject(user).toString());
  }

返回静态资源

返回动态资源 


forward 和 redirect 具体区别如下:

  • 1. 请求重定向(redirect)将请求重新定位到资源;请求转发(forward)服务器端发。
  • 2. 请求重定向地址发生变化,请求转发地址不发生变化。
  • 3. 请求重定向与直接访问新地址效果一直,不存在原来的外部资源不能访问;请求转发服务器端转发有可能造成原外部资源不能访问。

请求转发如果资源和转发的页面不在一个目录下,会导致外部资源不可访问
 

总结

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

库里不会投三分

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

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

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

打赏作者

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

抵扣说明:

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

余额充值