目录

什么是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 构建的

springmvc jndi 数据源配置 springmvc 数据库_MVC

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


springmvc jndi 数据源配置 springmvc 数据库_java_02

 什么是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服务器

springmvc jndi 数据源配置 springmvc 数据库_java_03

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

springmvc jndi 数据源配置 springmvc 数据库_spring_04


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

springmvc jndi 数据源配置 springmvc 数据库_数据_05

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

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

springmvc jndi 数据源配置 springmvc 数据库_数据_06

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

Tomcat提供的软件

springmvc jndi 数据源配置 springmvc 数据库_spring_07

  •  Tomact提供的软件=Http服务器+Servlet容器
关于不同角度看待Servlet

springmvc jndi 数据源配置 springmvc 数据库_spring_08

springmvc jndi 数据源配置 springmvc 数据库_mvc_09

 

MVC的执行过程

springmvc jndi 数据源配置 springmvc 数据库_java_10

前提条件

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过程 


添加依赖 

springmvc jndi 数据源配置 springmvc 数据库_java_11

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

拦截器

springmvc jndi 数据源配置 springmvc 数据库_数据_12

view文件 

springmvc jndi 数据源配置 springmvc 数据库_spring_13

  • 我们放在templates目录下


动态资源和model

springmvc jndi 数据源配置 springmvc 数据库_数据_14

其他方式实现

springmvc jndi 数据源配置 springmvc 数据库_java_15


最后显示的效果

springmvc jndi 数据源配置 springmvc 数据库_mvc_16

拦截器的效果

springmvc jndi 数据源配置 springmvc 数据库_mvc_17

 

springmvc jndi 数据源配置 springmvc 数据库_mvc_18

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

springmvc jndi 数据源配置 springmvc 数据库_spring_19

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

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

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

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

如何实现

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

简易写法

springmvc jndi 数据源配置 springmvc 数据库_mvc_20


springmvc jndi 数据源配置 springmvc 数据库_数据_21



实现获取参数的功能 

什么是获取参数

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

HTTP携带数据的形式

springmvc jndi 数据源配置 springmvc 数据库_数据_22

获取query string来获取数据

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

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

springmvc jndi 数据源配置 springmvc 数据库_数据_23

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

springmvc jndi 数据源配置 springmvc 数据库_mvc_24

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

springmvc jndi 数据源配置 springmvc 数据库_spring_25

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


required的意思

springmvc jndi 数据源配置 springmvc 数据库_mvc_26

关于数据类型转换

springmvc jndi 数据源配置 springmvc 数据库_数据_27

 

springmvc jndi 数据源配置 springmvc 数据库_spring_28

直接定义请求参数的对象

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

springmvc jndi 数据源配置 springmvc 数据库_数据_29

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

获取POST请求体的内容

 @RequestBody 接收JSON对象

springmvc jndi 数据源配置 springmvc 数据库_spring_30

 获取URL中参数@PathVariable

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

springmvc jndi 数据源配置 springmvc 数据库_数据_31

springmvc jndi 数据源配置 springmvc 数据库_spring_32

 上传文件@RequestPart

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

springmvc jndi 数据源配置 springmvc 数据库_spring_33


HttpServletRequest和HttpSession 

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

springmvc jndi 数据源配置 springmvc 数据库_MVC_34

 

springmvc jndi 数据源配置 springmvc 数据库_java_35


实现输出数据的功能 

什么是输出数据功能

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

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

@ResponseBody

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

作用

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

springmvc jndi 数据源配置 springmvc 数据库_mvc_36

@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());
  }

springmvc jndi 数据源配置 springmvc 数据库_mvc_37

返回静态资源

springmvc jndi 数据源配置 springmvc 数据库_java_38

返回动态资源 

springmvc jndi 数据源配置 springmvc 数据库_mvc_39


forward 和 redirect 具体区别如下:

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

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