SpringMVC
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方法用于沿着目标资源的路径执行消息环回测试;它回应收到的请求,以便客户可以看到中间服务器进行了哪些(假设任何)进度或增量。
- 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(返回数据))
- GET和POST是HTTP协议中的两种发送请求的方法。
- 标准答案
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; } }
- 简化了get请求的写法,使用