这里先附上前一篇的地址,以上系列均为博主的学习路线,仅供参考
初识Spring MVC-CSDN博客
下面我们从SpringMVC传递数组开始讲起
1.传递数组
传递数组的方式和传递普通变量的方式其实是相同的,下面我们附上传递的图片
@RequestMapping("/r7") public String r1(String[] arrays){ return Arrays.toString(arrays); }
第二种传送方式
2.传递集合
传递集合就不能像数组和普通对象一样直接传送了,而是需要使用注解来操作
注:这个注解和之前的重命名注解是一样的
@RequestMapping("/r8") public String r8(@RequestParam List<String> list){ return "list" + list; }
3.JSON
首先json作为一种轻量级的数据交互格式,我们也需要了解json的传输和获取
首先先看一下JSON的格式
{ "squadName": "Super hero squad", "homeTown": "Metro City", "formed": 2016, "secretBase": "Super tower", "active": true, "members": [{ "name": "Molecule Man", "age": 29, "secretIdentity": "Dan Jukes", "powers": ["Radiation resistance", "Turning tiny", "Radiation blast"] }, { "name": "Madame Uppercut", "age": 39, "secretIdentity": "Jane Wilson", "powers": ["Million tonne punch", "Damage resistance", "Superhuman reflexes"] }, { "name": "Eternal Flame", "age": 1000000, "secretIdentity": "Unknown", "powers": ["Immortality", "Heat Immunity", "Inferno", "Teleportation", "Interdimensional travel"] ]} }
就是键值对的形式来表示的,数据由逗号分隔,对象由大括号表示,数组使用中括号表示
我们也可以使用在线json网站来解析json
在线JSON校验格式化工具(Be JSON)
json与java对象之间的转换
注:SpringMVC已经集成了json的转换工具,这里我们就无需引入依赖了
<dependency> <groupId>com.fasterxml.jackson.core</groupId> <artifactId>jackson-databind</artifactId> <version>2.13.5</version> </dependency>
json这里的转换工具有很多,这里jackson只是其中的一种
或者还可以使用阿里的fastjson和fastjson2
注:这里也得使用注解才能生效,使用直接传输的话会导致返回的是默认值null
这里的注解使用@RequestBody
@RequestMapping("/r9") public String r9(@RequestBody Person person){ return person.toString(); }
我们去掉注解试试,就会发现产生报错了
json和对象之间的转换
public static void main(String[] args) throws JsonProcessingException { ObjectMapper mapper = new ObjectMapper(); String json = "{\"name\":\"admin\",\"age\":18}"; //json转对象 Person person = mapper.readValue(json, Person.class); System.out.println(person); //字符串转json String json1 = mapper.writeValueAsString(person); System.out.println(json1); }
注:这里是使用反射机制来进行操作的,注意要提供get和set方法以及空参的构造器,否则会产生异常,报错信息如下
4.获取URL中的参数
@PathVariable 和字面意思一样,这个注解主要就是获取URL中的数据绑定,简而言之就是获取URL中的参数
@RequestMapping("/r10/{name}") public String r10(@PathVariable("name") String name){ return "收到参数"+name; }
5.上传文件
这里又涉及一个新注解@RequestPart 这里的part有文件的含义
这里我们可以获取到上传文件的一些信息
@RequestMapping("/r11") public String r11(@RequestPart("file") MultipartFile file) { String fileName = file.getOriginalFilename(); return "上传文件名:"+fileName; }
6.Cookie & Session
Cookie
首先我们来介绍一下Cookie
Cookie就是一串保存在客户端主机终端上的信息,是为了给某些网站进行身份验证,Session身份跟踪的字符串(经常通过加密)
Cookie保存在客户端,而Session保存在服务器端
Cookie解决了什么问题?
由于HTTP协议是一个无状态的协议,这意味着我们在访问网站的时候需要多次进行登录操作,比如访问一个淘宝,在浏览商品的时候需要进行登录,在付款的时候又要进行登录,这样就给用户造成了很大的困扰.
Cookie就是在第一次登录的时候由服务器返回一些数据给浏览器保存在本地,这样在进行第二次请求的时候,就会自动将上次保存的cookie嘻嘻携带给服务器,服务器就可以根据这个来知道用户是谁了.
注:Cookie存储的数据量有限,一般不超过4K
Cookie啥时候产生,一定有吗?
Cookie 的使用需要看要求,因为浏览器可以禁用Cookie,服务器端也可以不Set-Cookie
一般如果需要使用Cookie,那么就是客户端向服务器发送第一次请求的时候,服务端给客户端发送一个Cookie用于保存在本地
注:可以是保存在内存中,也有可能是保存在硬盘中
Cookie的生命周期?
Cookie在生成的时候会指定一个Expire值,这就是他的生命周期,超出即被清除,有些页面甚至设置为0或者负值,这样关闭浏览器即清除,更加安全
缺陷
1.Cookie中存储大的属性有限制,一个浏览器最多存储300个,且一个不能超过4K
每个站点能设置的Cookie总数不超过20个
2.安全性无法保证,因为Cookie可以被篡改
3.浏览器可以禁用Cookie
应用场景
对安全性要求不高,无需存储大量数据,主要用来做服务器和客户端的状态保持技术
Session
Session是会话的意思,比如说用户打开浏览器,点击一个超链接,访问服务器多个web资源,然后关闭浏览器就称之为一个会话.
什么时候产生?
当用户请求Web网页的时候,如果该用户还没有会话,就会自动创建一个Session,这样在应用程序跳转的时候,存储在Session对象中的变量不会丢失,这也就保证了会话会一直存在下去(Session是以键值对形式存储的)
注:服务器会向客户端发送一个SessionId放到Cookie里面,用户在每次访问网页的时候都会带着Cookie一起,这样服务器就可以根据SessionId来确定用户的信息了
Session生命周期
一般是根据需求设定的,就像淘宝的客服,在一段时间不去发送信息进行对话就会自动断开,这就是Session的生命周期
简而言之,Session和Cookie就是两种保存用户状态的机制,不同的是Cookie存储在客户端里面,Session存储在服务器里面
Cookie和Session结合使用
以登录举例,在我们第一次登录的时候,服务器会创建一个Session对象用来保存用户的信息,同时向客户端发送一出啊SessionId,客户端就将其保存在Cookie里面,下次再进行请求的时候,客户端会携带Cookie,也就是SessionId,这样服务器就可以知道用户是谁了.
下面我们介绍几种获取Cookie和Session的方式
1.传统方式获取
注意这里domain是域名千万不要写错了
@RequestMapping("/r12") public String getC(HttpServletRequest request, HttpServletResponse response) { Cookie[] cookies = request.getCookies(); StringBuilder sb = new StringBuilder(); if (cookies != null) { for(Cookie cookie : cookies) { sb.append(cookie.getName()+":"+cookie.getValue()); } } return sb.toString(); }
简单方式
@RequestMapping("/r13") public String r13(@CookieValue("name") String name) { return "name:"+name; }
这里也侧面证明了Cookie是不安全的,可以伪造的
Session的获取和存储
Session的存储
@RequestMapping("/r14") public String getS(HttpServletRequest request, HttpServletResponse response) { HttpSession session = request.getSession(); if(session != null) { session.setAttribute("name", "张三"); } return "session 存储成功"; }
获取Session
@RequestMapping("/r15") public String getR(HttpServletRequest request, HttpServletResponse response) { HttpSession session = request.getSession(); if(session != null && session.getAttribute("name") != null) { String name = (String) session.getAttribute("name"); return "name:"+name; } return "session 不存在"; }