Java SpringMVC(一) --- 建立连接,请求,获取Cookie,Session,Header
文章目录
- SpringMVC
- MVC
- 学习Spring MVC
- 建立连接
- 请求
- 总结
- JSON传递数据
- 获取url中的参数
- 上传文件@RequestPart
- Cookie和Session
- 获取Cookie
- 获取Session
- 获取Header

SpringMVC
- Spring Web MVC就是Spring全家桶下的一个模块,现在通常把Spring Web MVC叫做Spring MVC
- Spring MVC:是一个 Web 框架
- Spring Boot:是一个 快速开发框架,它自动集成了 Spring MVC
Spring MVC 就是一个web的框架,用来做web的功能
MVC
- 什么是MVC ??
MVC把一个项目分为了三个部分
View就相当于前台,Controller就相当于团队,团队就指派某个人进行处理,Model就相当于某个人
下面是MVC的图
2. MVC是一种思想,Spring进行了实现,所以称为Spring MVC
下面是Spring MVC的图
3. SpringBoot是创建SpringMVC项目的一种方式而已
4. 当前阶段,MVC的概念又发生了一些变化,后端开发人员不涉及前端页面的开发,所以也就没有view层
view层又有了一层解释,之前返回的是视图,现在返回的是视图所需要的数据
下面返回的就可以是视图所要的数据:
学习Spring MVC
- 建立连接(客户端和服务器)
- 请求
- 响应
建立连接
- 通过 @RequestMapping 建立路由映射,通过tomcat找到服务器的地址
- @RequestMapping 可以修饰方法,也可以修饰类
访问地址:类的路径 + 方法路径
下图中访问的路径就是:127.0.0.1:8080/hello/sayhi
注意**:路径前面的 / 可以省略,比如 /hello,可以写成hello,建议统一都加上**
前面的 / 加上,后面的 / 不加上
@RequestMapping用的是get请求,还是post请求??
@RequestMapping默认支持所有的请求,也可以进行显示请求的方式
请求
- 请求,主要就是学习如何传参
1.传递单个参数
2.多个参数
3.对象
4.数组/集合
开发中,建议加上类路径
1.避免重复的方法
2.方便查找代码(在某个路径下就可以找到了)
- 传递单个参数
需要名称一样
底层逻辑:从请求的参数中,获取参数名为name的值,并给name赋值
- 传递多个参数
参数的类型在请求中位置不要求的,位置随便在哪都行
如果参数中有基本类型,必须要传值,不传会报错
- 传递对象
- 后端参数重命名
后端对前端的参数进行了重命名
使用了required = false就不会出现报错
package com.example.demo.controller;import com.example.demo.Person;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;@RequestMapping("/param")
@RestController
public class ParamController {@RequestMapping("/m1")public String m1(String name){return "接收到的参数name: " + name;}// 方法名和路径名不要求一样@RequestMapping("/m2")public String m2(String name,Integer age){return "接收到的参数name: " + name + ",age: " + age;}// 传递一个对象@RequestMapping("/m3")public String m2(Person person){return "接收到的参数person: " + person.toString();}@RequestMapping("/m4")public String m4(@RequestParam(value = "name",required = false) String usename){return "接收到的参数name: " + usename;}
}
总结
对上面内容的一个总结:
6. 传递数组
当我们的请求,同一个参数有多个时,浏览器就会帮我们给封装成一个数组
比如下面两种传参的方式:
@RequestMapping("/m5")public String m5(String[] arrayParam){return "接收到的参数arrayParam: " + Arrays.toString(arrayParam) + ",长度为: " + arrayParam.length;}
- 传递集合
@RequestParam让上传的参数变为不是非必须上传的,不上传的时候,值为null
@RequestMapping("/m6")public String m5(@RequestParam List<String> listParam){return "接收到的参数arrayList: " + listParam + ",长度为: " + listParam.size();}
- 状态码都是后端去自定义的吗?
不是的,状态码分为http状态码(不是后端自定义的),业务状态码(是后端自定义的)
JSON传递数据
虽然介绍了这些传递参数的方法,但是我们工作中并不使用这些方法,而是使用JSON传递数据
-
接口指的是API
就是应用程序提供了哪些服务给我们,接口如果对应到代码上,通常是指方法 -
JSON本质上是一个字符串,表示对象的字符串(JSON字符串)
-
传递JSON数据,需要使用@RequestBody
把整个正文传给这个对象
@RequestBody获取请求正文中的数据
// 通过json请求进行传递@RequestMapping("/m7")public String m7(@RequestBody Person person){return "接收到的参数person: " + person.toString();}
获取url中的参数
@PathVariable获取url中的参数时使用
- 可以获取url中的一个参数
- 可以获取url中的多个参数,但是要注意顺序要一致
- 可以对参数进行重命名,但是路径上的参数的名字和下面括号中参数的名字要一致
@RequestMapping("/m8/{useId}/{name}")public String m8(@PathVariable Integer useId,@PathVariable("name") String usename){return "useId: " + useId + "name: " + usename;}
上传文件@RequestPart
- 上传图片
- 还可以上传图片到本机中的指定路径或者是指定的文件服务器中
// 上传文件@RequestMapping("/m9")public String m9(@RequestPart MultipartFile file) throws IOException {// 打印文件名字System.out.println(file.getOriginalFilename());// 把上传的图片进行保存到本地电脑或者是专门的文件服务器中file.transferTo(new File("E:/文件夹/" + file.getOriginalFilename()));return "success";}
Cookie和Session
- Http是无状态的,http没有记忆功能,现在请求和过一会请求,同样的请求参数,得到的结果(这个结果是指处理逻辑是一样的,而不是指数据是一样的)是一样的
- Cookie 客户端机制,比如存储学生证中的id身份信息
Session 服务端机制
获取Cookie
- 使用servlet的方式获取cookie,可以获取全部的cookie
// 获取Cookie@RequestMapping("/getCookie")public String getCookie(HttpServletRequest request){Cookie[] cookies = request.getCookies();
// for(Cookie cookie : cookies){
// System.out.println("name: " + cookie.getName() + "Value: " + cookie.getValue());
// }// lambda的写法if(cookies != null) {Arrays.stream(cookies).forEach(cookie -> {System.out.println("name: " + cookie.getName() + "Value: " + cookie.getValue());});}return "获取Cookie的值成功";}
2. 使用Spring的方式获取Cookie(使用注解的方式),只能一个一个cookie去拿
@RequestMapping("/getCookie")public String getCookie(@CookieValue String abc){return "cookie的值为: " + abc;}
也可以传多个注解的Cookie参数
获取Session
- 使用Servlet的方式获取Session
// 构造一个Session对象@RequestMapping("/setSession")public String setSesion(HttpServletRequest request){HttpSession session = request.getSession();session.setAttribute("usename","zhangsan");return "success";}// 获取Session@RequestMapping("/getSession")public String getSession(HttpServletRequest request){// 为true就是没有session,也会创建一个session对象// 为false就是没有session,不会创建一个session对象HttpSession session = request.getSession(false);if(session != null){String usename = (String)session.getAttribute("usename");return "登录用户: " + usename;}return "session为空";}
- 使用Spring的方式获取Session
session是存在服务器的内存中的,每次进行刷新,session之前设置的值都会清空
@RequestMapping("/getSession2")public String getSession2(@SessionAttribute(required = false) String usename){// 在@SessionAttribute下,usename为必传的return "usename: " + usename;}
3. 第三种获取Session的方式
HttpSession是内置的接口
@RequestMapping("/getSession3")public String getSession3(HttpSession session){String usename = (String) session.getAttribute("usename");return "usename: " + usename;}
获取Header
- Servlet提供的获取Header的方式
// 获取Header@RequestMapping("/getHeader")public String getHeader(HttpServletRequest request){String useAgent = request.getHeader("User_Agent");return "User_Agent " + useAgent;}
- Spring提供的获取Header的方式
@RequestMapping("/getHeader2")public String getHeader2(@RequestHeader("User_Agent") String useAgent){return "User_Agent " + useAgent;}
学会看错误日志:
获取 Header