SpringMVC

本文介绍了MVC设计模式的原理,详细阐述了SpringMVC框架的作用和工作流程。主要内容包括:MVC模式的三个组成部分及其职责,SpringMVC的创建过程,以及HTTP请求方式的解析,重点讨论了GET和POST的区别。此外,还提到了SpringMVC中RESTful风格参数的解析方法。
摘要由CSDN通过智能技术生成

MVC设计模式

  • MVC(Model模型、View视图、Controller控制层)
  • MVC 设计模式一般指 MVC 框架,M(Model)指数据模型层,V(View)指视图层,C(Controller)指控制层。使用 MVC 的目的是将 M 和 V 的实现代码分离,使同一个程序可以有不同的表现形式。其中,View 的定义比较清晰,就是用户界面。
  • 在MVC设计模式中,要求这三部分相互独立,互不干扰,每个部分只执行自己应作的内容,当该部分发送改变时,应当尽量不改变其他模块的功能。以达到提高代码复用性,及实现松耦合的功能。
  • 总结:
    • 数据模型层(Model):模型对象拥有最多的处理任务,是应用程序的主体部分,它负责数据逻辑(业务规则)的处理和实现数据操作(即在数据库中存取数据)。封装数据
    • 视图层(View):负责格式化数据并把它们呈现给用户,包括数据展示、用户交互、数据验证、界面设计等功能。展示数据
    • 控制层(Controller):负责接收并转发请求,对请求进行处理后,指定视图并将响应结果发送给客户端。接受请求,做出响应

SpringMVC

1. 概述

  • 是SpringFrameWork的后续产品,遵循了MVC设计模式,保证了程序间的松耦合
  • 主要作用:
    • 接受请求(解析请求数据)
    • 做出响应

2. 创建maven Module

在这里插入图片描述
在这里插入图片描述

3. 准备数据进行测试

  • 在module下新建一个启动类RunApp
    	package cn.tedu;
    	
    	import org.springframework.boot.SpringApplication;
    	import org.springframework.boot.autoconfigure.SpringBootApplication;
    	
    	/**
    	 * @Author Sky-haohao
    	 * @Date 2021/8/11 11:57
    	 * @Version 1.0
    	 */
    	
    	//标记这这是spring boot的启动类
    	@SpringBootApplication
    	public class RunApp {
    	    public static void main(String[] args) {
    	        SpringApplication.run(RunApp.class, args);
    	    }
    	}
    
    
  • 创建实体类Car,封装 id,name,type,color,price属性
  • 创建HelloController测试类
    	package cn.tedu.mvc;
    	
    	import org.springframework.web.bind.annotation.RequestMapping;
    	import org.springframework.web.bind.annotation.RestController;
    	
    	/**
    	 * @Author Sky-haohao
    	 * @Date 2021/8/11 14:17
    	 * @Version 1.0
    	 */
    	
    	@RestController
    	@RequestMapping("car")  //规定了url怎么访问这个类
    	public class HelloController {
    	    // 测试 http://localhost:8080/car/get
    	    @RequestMapping("get")  //规定了url怎么访问这个方法
    	    public String show(){
    	        return "123";
    	    }
    	
    		// 测试 http://localhost:8080/car/abc
    	    @RequestMapping("abc")
    	    public int show2(){
    	        return 123;
    	    }
    	    /**
    	     * SpringMVC框架除了能返回字符串,整数以外,还可以返回对象信息
    	     * 创建Car类,封装属性
    	     */
    	    // 测试 http://localhost:8080/car/msg
    	    @RequestMapping("msg")
    	    public Car show3(){
    	        Car c = new Car(001,"奥迪","A4L","white",40.0);
    	        return c;
    	    }
    	    /**
    	     * 响应数组
    	     */
    	    //测试 http://localhost:8080/car/arr
    	    @RequestMapping("arr")
    	    public String[] show4(){
    	        String[] i = new String[]{"张三", "李四", "王五", "jack", "rose"};
    	        return i;
    	    }
    	}
    
    

请求数据的方式

4. 请求方式概述

  • 什么是HTTP
    • HTTP,即超文本传输协议,是一种实现客户端和服务器之间通信的响应协议,它是用作客户端和服务器之间的请求。
    • 客户端(浏览器)会向服务器提交HTTP请求;然后服务器向客户端返回响应;其中响应包含有关请求的状态信息,还可能包含请求的内容。
    • 常用请求方式
      • GET方法
      • GET方法用于使用给定的URI从给定服务器中检索信息,即从指定资源中请求数据。使用GET方法的请求应该只是检索数据,并且不应对数据产生其他影响。
      • 在GET请求的URL中发送查询字符串(名称/值对),需要这样写:
        • 说明:
          • GET请求是可以缓存的,我们可以从浏览器历史记录中查找到GET请求,还可以把它收藏到书签中;且GET请求有长度限制,仅用于请求数据(不修改)。
          • 注:因GET请求的不安全性,在处理敏感数据时,绝不可以使用GET请求。
      • POST方法
        • POST方法用于将数据发送到服务器以创建或更新资源,它要求服务器确认请求中包含的内容作为由URI区分的Web资源的另一个下属。
        • POST请求永远不会被缓存,且对数据长度没有限制;我们无法从浏览器历史记录中查找到POST请求。
      • HEAD方法
        • HEAD方法与GET方法相同,但没有响应体,仅传输状态行和标题部分。这对于恢复相应头部编写的元数据非常有用,而无需传输整个内容。
      • PUT方法
        • PUT方法用于将数据发送到服务器以创建或更新资源,它可以用上传的内容替换目标资源中的所有当前内容。
        • 它会将包含的元素放在所提供的URI下,如果URI指示的是当前资源,则会被改变。如果URI未指示当前资源,则服务器可以使用该URI创建资源。
      • DELETE方法
        • DELETE方法用来删除指定的资源,它会删除URI给出的目标资源的所有当前内容。
      • CONNECT方法
        • CONNECT方法用来建立到给定URI标识的服务器的隧道;它通过简单的TCP / IP隧道更改请求连接,通常实使用解码的HTTP代理来进行SSL编码的通信(HTTPS)。
      • OPTIONS方法
        • OPTIONS方法用来描述了目标资源的通信选项,会返回服务器支持预定义URL的HTTP策略。
      • TRACE方法
        • TRACE方法用于沿着目标资源的路径执行消息环回测试;它回应收到的请求,以便客户可以看到中间服务器进行了哪些(假设任何)进度或增量。
          在这里插入图片描述

5. get和post

  • 两种最常用的请求方式
  • get
    • 向特定的资源发出请求,并返回实体.有固定的写法,数据有最大长度,不能超出
  • post
    • 向指定资源提交数据进行处理请求(例如提交表单或者上传文件)。数据被包含在请求体中。POST请求可能会导致新的资源的建立和/或已有资源的修改。
  • get和post的区别:
    • 标准答案
      • GET在浏览器回退时是无害的,而POST会再次提交请求。
      • GET产生的URL地址可以被Bookmark,而POST不可以。
      • GET请求会被浏览器主动cache,而POST不会,除非手动设置。
      • GET请求只能进行url编码,而POST支持多种编码方式。
      • GET请求参数会被完整保留在浏览器历史记录里,而POST中的参数不会被保留。
      • GET请求在URL中传送的参数是有长度限制的,而POST没有。
      • 对参数的数据类型,GET只接受ASCII字符,而POST没有限制。
      • GET比POST更不安全,因为参数直接暴露在URL上,所以不能用来传递敏感信息。GET参数通过URL传递,POST放在Request body中。
    • 深入答案
      • GET和POST是HTTP协议中的两种发送请求的方法。
        HTTP是基于TCP/IP关于数据如何在万维网中如何通信的协议。(HTTP的底层是TCP/IP。所以GET和POST的底层也是TCP/IP,也就是说,GET/POST都是TCP链接。GET和POST能做的事情是一样一样的。你要给GET加上requestbody,给POST带上url参数,技术上是完全行的通的。)
        GET产生一个TCP数据包;POST产生两个TCP数据包。(对于GET方式的请求,浏览器会把http header和data一并发送出去,服务器响应200(返回数据);而对于POST,浏览器先发送header,服务器响应100 continue,浏览器再发送data,服务器响应200 ok(返回数据))

6. 请求参数的解析

  • SpringMVC解析,get方式提交的数据
    	package cn.tedu.mvc;
    	
    	import org.junit.jupiter.api.Test;
    	import org.springframework.web.bind.annotation.RequestMapping;
    	import org.springframework.web.bind.annotation.RestController;
    	
    	/**
    	 * @Author Sky-haohao
    	 * @Date 2021/8/11 15:55
    	 * @Version 1.0
    	 */
    	//SpringMVC解析get请求参数
    	@RestController  //接收请求做出响应
    	@RequestMapping("get")  //规定了浏览器的访问方式
    	public class GetController {
    	
    	    @RequestMapping("param")
    	    //测试 http://localhost:8080/get/param?id=100&name=张三&age=18
    	    // 注意,param(int id,String name,int age)参数中的值必须和地址中的名称
    	    // 如果需要参数,必须传  变量类型,必须相同  变量名,必须相同
    	    public String param(Integer id,String name,Integer age){
    	        return "请求的参数中的值为:"+id+name+age;
    	    }
    	
    	    @RequestMapping("param2")
    	    //测试 http://localhost:8080/get/param2?id=001&name=奥迪&type=A4L&color=white&price=40.0
    	    // 参数很多时,可以直接封装成一个对象,返回一个对象即可
    	    public Car param2(Car car){
    	        return car;
    	    }
    	
    	    @Test
    	    public void test(){
    	        // https://localhost:8080/car/insert?id=1&name=张三&age=18
    	        String url = "https://localhost:8080/car/insert?id=1&name=张三&age=18";
    	        String[] a = url.split("\\?")[1].split("&");
    	        for (String s : a){
    	            String data = s.split("=")[1];
    	            System.out.println(data);
    	        }
    	
    	    }
    	
    	}
    
    

7. 解析restful风格的参数

  • restful风格的参数
    • 简化了get请求的写法,使用/代替了get中的部分内容
    • http://localhost:8080/car/get?id=100&name=张三 变成了http://localhost:8080/car/get/100/张三
    • 通过{ }来获取路径中传递的值,通过@PathVariable注解来获取路径中的参数值
    	package cn.tedu.controller;
    	
    	import cn.tedu.pojo.Car;
    	import org.springframework.web.bind.annotation.PathVariable;
    	import org.springframework.web.bind.annotation.RequestMapping;
    	import org.springframework.web.bind.annotation.RestController;
    	
    	/**
    	 * @Author Sky-haohao
    	 * @Date 2021/8/12 10:25
    	 * @Version 1.0
    	 */
    	@RestController
    	@RequestMapping("car")
    	public class CarController {
    	    //普通方式解析get请求参数
    	    @RequestMapping("get")
    	    public String hello(Integer id,String name){
    	        return id+name;
    	    }
    	
    	    //restful方式解析参数:简化了get方式参数的写法
    	    //http://localhost:8080/car/get/100/张三
    	    //{x} -- 通过{}获取访问路径中携带的参数,并且交给变量x保存
    	    @RequestMapping("get2/{id}/{name}")
    	    //@PathVariable注解 -- 获取{}中间变量的值
    	    public String get2(@PathVariable Integer id,
    	                       @PathVariable String name){
    	        return id+name;
    	    }
    	
    	    @RequestMapping("get3/{id}/{name}/{color}/{price}")
    	    public Car get3(@PathVariable Integer id,
    	                    @PathVariable String name,
    	                    @PathVariable String color,
    	                    @PathVariable Double price){
    	        Car car = new Car(id, name, color, price);
    	        return car;
    	    }
    	}
    
    
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值