SpringMVC基本知识

概述

  • SpringMVC基本概念;
  • SpringMVC中前后端数据交互;

注:本文来自狂神说java springmvc视频;

1、SpringMVC基本知识

1.1、MVC框架说明

 MVC是模型(Model)、视图(view)、控制器(controller)的简写,是一种设计规范:将数据、显示、业务逻辑进行分离的方法组织代码,MVC主要是降低视图和业务逻辑之间的双向耦合。MVC是一种架构模式。

  • Model模型:数据模型,提供要展示的数据,包含数据和行为。可以是领域模型或javaBean组件,现在一般分离开来,分为数据层(Dao)和服务层 (Service)。也就是说,模型提供了数据查询和数据状态的修改,包括数据和业务;
  • view视图:负责模型的展示,一般就是界面;
  • controller控制器:负责接受用户的请求,委托给模型进行处理(修改数据的状态),处理完成后,把模型返回给视图。控制器,是模型和视图之间的调度。也是这一层对视图和业务逻辑进行了解耦

常见的服务端mvc框架有:springmvc、struts、asp.net mvc等;前端mvc框架有vue、react等;由mvc衍生的模式:mvp、mvvm等;

1.2、什么是springmvc

 由于spring非常好用,于是基于spring开发了一个mvc框架,这就是springmvc,是一个轻量级web框架。springmvc围绕dispatcherServlet[调度servlet]进行设计,dispatcherServlet的作用是将用户的请求分发给不同的处理器(controller)。dispatcherservlet实际是一个servlet,它继承与HttpServlet,围绕这个servlet,springmvc可以进行请求的分配以及提供其他功能。

在这里插入图片描述
 springmvc的运行原理(实线为springmvc提供的技术,不需要开发者实现。虚线为需要开发者实现的部分):
在这里插入图片描述
执行流程:用户发出http请求(url、参数信息),DispatcherServlet调度器接收并拦截请求,调用HandlerMapping(映射处理器)进行请求信息查找具体handler处理器(有多种处理器,处理不同的请求),通过具体的处理器hanlerexcution根据url查找具体的控制器controller(mycontroller类),然后将解析出的控制器信息返回给调度器,调度器通过适配器按照规则执行handler(到具体的方法),handler处理器让具体controller的方法执行(会调用开发者编写的逻辑方法),controller将执行完的信息返回给适配器,调度器调用视图解析器解析适配器的结果,将解析的结果返回给具体视图,最终的视图呈现给用户。

2、SpringMVC中前后端数据交互

2.1、交互过程

1、浏览器输入域名[参数],发起http请求;
2、NDS根据域名解析ip和端口号,找到相应的服务器(三次握手和四次挥手);
3、服务器接收请求,分配对应的路由;
4、返回对应路由的页面文件。
5、浏览器渲染html页面文件,遇到link标签,继续向服务器发送http请求,请求css文件,遇到js文件,请求js逻辑,遇到Ajax请求,请求对应的服务器(异步请求,在回调里才能拿到结果,或者使用promise,一般获取的都是json数据),ajax请求更新页面部分内容。

2.1、Http协议

http协议是基于tcp协议进行客户终端和服务端进行请求和响应的标准。http协议定义了web客户端如何从web服务器请求web页面,以及服务端如何把数据响应给客户端。

web客户端发送请求报文,报文包括:请求行、请求头、请求参数[可选]

  • 请求行包括请求方法(get、post、delete、put…)、请求地址(即URL地址:<协议>://<主机>:<端口>/<路径>,例如:http://localhost:7710/manage/enterprise/findList1)、协议版本(HTTP/主版本号.次版本号,常用的有HTTP/1.0和HTTP/1.1)

在这里插入图片描述

  • 请求头是为报文添加一些附加信息,由键值对组成,用冒号分隔。
    在这里插入图片描述

  • 请求参数(可选)
    在这里插入图片描述

服务器响应HTTP报文,报文由状态行、响应头部、响应数据组成。

  • 状态行:协议版本,状态码,状态码描述组成;协议版本与请求的版本一致。
    状态码与状态描述(状态码为三位数字)
    1xx:指示信息,请求已接收,继续处理;
    2xx:成功,请求已被成功接收理解;
    3xxx:重定向,要完成请求必须进行更下一步的操作;
    4xx:客户端错误,请求语法错误或请求无法实现;
    5xx:服务器端错误,服务器未能实现合法请求。

在这里插入图片描述

  • 响应头部:与请求头部类似,为响应报文添加附加信息;

在这里插入图片描述

  • 响应数据,存放返回给客户端的数据信息。
    在这里插入图片描述

2.2、前后端的数据传参

resutful与控制器

 RestFul是一种简洁的资源操作风格。使用GET、POST、DELETE、PUT分别对应资源的获取、新增、删除、查询。文档参考:https://restfulapi.cn/
 springmvc控制器,通过RequestMapping,可以用在类上(表示所有请求的父路径),用在方法上(方法的映射路径)。method可以指定请求的类型:GET、POST、PUT、DELETE、HEAD、PATCH、OPTIONS、PATCH等。
 restful风格要求前后的请求方式一致(控制器遵循restful风格),才能正确访问。

前后的数据传参,⭐⭐⭐⭐⭐

2.2.1、http请求的传参方式

 发起http请求时,有两种传参方式:

  • url地址传参
    数据参数写在url地址中,可以是查询参数(?参数),也可以是路径参数(/参数),一般get请求使用较多。传输速度很快,但是不安全。
  • body传参
    数据参数写在body中,有多种content-type格式:json、xml、formdata,一般post方式使用的多。相对安全,没有大小限制,但是需要两次tcp传输(一次传head,一次传body)。
2.2.2、http请求方式

但是post就只能body传参,get只能url传参,实际上如何传参是由开发者确定的。只是按照规范来进行参数传递,更便于理解,现在传参方式,基本都遵循restful风格。
前后端的交互时的http请求方式,主要看后端对请求的处理逻辑,确定请求方式:

  • get 获取资源
  • post 创建资源
  • put 创建或更新资源(有则更新,无则创建)
  • 例如 PUT /items/1 的意思是替换 /items/1 ,存在则替换,不存在则创建。
  • 所以,PUT方法一般会用来更新一个已知资源。
  • patch 部分更新资源
  • delete 删除资源
2.2.3、content-type不同数据格式及使用注意事项
  • 前端content-type请求格式
    1、application/json(在axios中默认的post方式)
    传递json格式的数,网络流中被编码成json格式的字符串,如:{“key1”:“value1”,“key2”:“value2”}/
    2、application/x-www-form-urlencoded
    浏览器原生form表单格式,如果不设置enctype属性,那么最终就会以application/x-www-form-urlencoded这种方式提交。提交的数据,按照 key1=val1&key2=val2 的方式进行编码。
    3、multipart/form-data
    也是原生的form表单格式,与application/x-www-form-urlencoded不同的是,它既可以传键值对,又可以上传文件。上传文件时,必须让表单的enctyped 等于这个值。

所以在进行数据传输时,要清楚传输的数据是什么格式的,上传文件必须使用multipart/form-data。同时,后端也需要清楚传过来的是什么格式的数据,对于不同的数据,后端采用的接收数据方法也不同。框架一般会在请求响应的最前端进行拦截处理,很多框架的在Filter端点进行的数据的转换。

  • spingMVC接收数据的方式
    1、uri参数

    • @PathVariable:获取路径参数,即url/{参数}
    • @RequestParam:获取查询参数,即url?参数=值

    2、Body参数

    • @RequestBody:获取并解析body中application/json格式的数据
    • 无注解或@RequestParam:获取并解析body中multipart/form-data和x-www-form-urlencoded的数据。multipart/form-data既可以用做文件数据的传输也可以做键值对的传输,x-www-form-urlencoded只能用做键值对。
2.2.4、文件上传下载

文件上传

1、文件上传前端注意表单设置enctype=“multipart/form-data”

<form action="" enctype="multipart/form-data" method="post">

若是ajax上传,则需设置请求头header的content-type为multipart/form-data。
2、后端接收
使用MultipartFile对象接收,若是批量上传,则使用数组接收即可;

//批量上传, @RequestParam("files") MultipartFile[] file,
 public String fileUpload(@RequestParam("file") MultipartFile file,
 HttpServletRequest request) throws IOException {
 }

文件下载
1、获取文件位置;
2、设置response响应头;
3、读取文件 — inputStream;
4、写出文件----outputStream;
5、执行写出操作;
6、关闭流;


@RequestMapping(value="/download")
public String downloads(HttpServletResponse response ,HttpServletRequest request) throws Exception{
   //1、要下载的图片地址
   String  path = request.getServletContext().getRealPath("/upload");
   String  fileName = "基础语法.jpg";

   //2、设置response 响应头
   response.reset(); //设置页面不缓存,清空buffer
   response.setCharacterEncoding("UTF-8"); //字符编码
   response.setContentType("multipart/form-data"); //二进制传输数据
   //设置响应头
   response.setHeader("Content-Disposition",
           "attachment;fileName="+URLEncoder.encode(fileName, "UTF-8"));

   File file = new File(path,fileName);
   //3、 读取文件--输入流
   InputStream input=new FileInputStream(file);
   //4、 写出文件--输出流
   OutputStream out = response.getOutputStream();

   byte[] buff =new byte[1024];
   int index=0;
   //5、执行 写出操作
   while((index= input.read(buff))!= -1){
       out.write(buff, 0, index);
       out.flush();
  }
  //6、关闭流
   out.close();
   input.close();
   return null;
}

ajax

ajax是一种网页部分更新技术,通过少量的数据交换,实现异步局部更新。
通过ajax,可以实现登录的局部校验,删除数据时,部分删除,dom部分删除更新…。

2.3、springMVC监听器、过滤器、拦截器

2.3.1、监听器

 1、web监听器属于Servlet中的特殊类,帮助开发者监听web中特定事件,随着web应用启动而启动,只初始化一次,随web应用的停止而销毁。
 2、主要作用是:感知到包括 request(请求域)、session(会话域)、application(应用程序)的初始化和属性的变化;
 3、监听器的应用场景:统计在线人数,清除过期session。
 4、监听器接口主要有四类八种,能够监听request域、session域、application域的产生,销毁和属性的变化。
(1)监听器对象的创建:

  • ServletContext:监听servletContext的创建,需要实现ServletContextListener接口;
  • ServletRequest:主要监听request的创建,需要实现ServletRequestListener接口;
  • HttpSession:主要监听session的创建,需要实现HttpSessionListener接口;

(2)监听属性变化

  • ServletContext:主要监听servletContext属性的更改、添加、删除,需要实现 ServeltContextAttrbuteListener接口;
  • ServletRequest:主要监听request属性的更改、添加、删除, 需要实现ServletRequestAttrbuteListener接口;
  • HttpSession:主要监听session属性的更改、添加、删除,需要实现HttpSessionAttrbuteListener接口。
  • httpSessionActivationListener:主要监听了session的活化与钝化。
  • httpSessionBindingListener:监听了session与对象的绑定。

一个webServlet里面若有多个监听器的话,顺序是按照加载的顺序来加载和注册的这些servlet监听器的。

2.3.2、过滤器与拦截器

过滤器

1、过滤器依赖于servlet容器,可以对所有的请求进行过滤,但是过滤器只能在容器初始化时调用一次。使用过滤器的目的是用来做一些过滤操作,如:过滤器中修改字符编码,在过滤器中修改HttpServletRequst的一些参数,包括:过滤低俗文字、危险字符等。
2、过滤器的应用场景:设置字符编码、url级别的权限访问控制,过滤敏感词汇、压缩响应信息等。
3、过滤器的使用,只需要实现filter接口,重写doFilter()、init()、destroy()方法即可;

  • doFilter():完成对请求或响应的过滤;
  • init():读取过滤器的初始化参数
  • destroy():过滤器销毁的时候做一些操作;

拦截器

1、拦截器依赖于web框架,springmvc中的拦截器是AOP思想的具体应用。拦截器只能拦截访问控制器的方法,不能对其他一些请求(如直接访问静态资源)进行拦截。同一个拦截器在一个controller的生命周期内可以进行多次调用。
2、拦截器的应用场景:拦截未登录、审计日志等;
3、拦截器的使用,需要实现HandlerInterceptor或者WebRequestInterceptor,重写preHandle()、postHandle()和afterCompletion()方法;

  • preHandle():请求处理之前进行调用,这里可以进行一些前置操作或对当前请求进行一个预处理,也可以在这个方法中进行一些判断来决定是否要继续进行下去。方法的返回值是Boolean,如果是false,表示结束,后续Interceptor 和Controller 都不会执行;如果是true,会继续调用下一个Interceptor 的preHandle 方法。当最后一个Interceptor 也是true,才会执行controller方法。
  • postHandle():在请求已经进行处理之后,也就是controller已经执行调用之后执行,但是会在模型返回之前,进行调用,所以可以在这个方法中,对controller处理后的模型对象进行操作
  • afterCompletion():在整个请求结束之后执行,也就是模型对象返回之后执行,这个方法的主要作用是进行资源清理工作。

执行顺序:监听器——>过滤器——>拦截器——>servlet执行——>拦截器——>过滤器——>监听器。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值