Spring Web MVC入门补充1
学习Spring MVC
请求
传递数组
Spring MVC可以⾃动绑定数组参数的赋值.
@RequestMapping("/r8")public String r8(String[] array){return Arrays.toString(array);}
直接在URL后,添加array=1,nihao,a略有不妥,因为URL中的特殊字符需要转义编码,在部分浏览器上可能无法运行.可以添加array=1&array=nihao来让Spring识别到这是一个数组.
传递集合
集合参数:和数组类似,同⼀个请求参数名有为多个,但是需要使⽤@RequestParam绑定参数关系.现在学习到的@RequestParam有三个作用:1.重命名,2.设置必传参数,3.绑定参数关系.
@RequestMapping("/r9")public String r9(@RequestParam List<String> list){return list.toString();}
传递JSON格式
JSON的语法:
1. 数据在 键值对(Key/Value) 中
2. 数据由逗号 , 分隔
3. 对象⽤ { } 表示
4. 数组⽤ [ ]表示
5. 值可以为对象,也可以为数组,数组中可以包含多个对象
合法JSON列举:
{"name":"admin","age":18}
["hello", 3.1415, "json"]
[{"name":"admin","age":18},{"name":"root","age":16},{"name":"张三","age":20}]
传递JSON对象,需要使用@RequestBody注解,在接收到JSON对象后,会自动与代码中的对象进行匹配进而转化为Java对象.
@RequestMapping("/r10")public String r10(@RequestBody Student student){return student.toString();}
从URL中获取参数
在访问一些网站时,我们发现它们的URL中没有查询字符串,确认代之的是相同的文件路径后跟随了一些不同的字母/数字组合,如B站的bv号.想要从URL中获取参数,可以使用@PathVariable.并修改@RequestMapping中的映射地址相关信息.
@RequestMapping("/r11/{id}")public String r11(@PathVariable Integer id){return "id为:"+id;}
这样在访问时,将想要传递的id放置在r11的后面,后端就能接收到id了.
在传递多个参数时,需要一一对应.
@RequestMapping("/r12/{id}/{name}")public String r12(@PathVariable Integer id,@PathVariable String name){return "id:"+id+",name:"+name;}
Resolved [org.springframework.web.method.annotation.MethodArgumentTypeMismatchException: Failed to convert value of type 'java.lang.String' to required type 'java.lang.Integer'; For input string: "zhangsan"]
报错节选:将String类型的"zhangsan"转换为Integer类型出错.可见这里将zhangsan写在前面会被id捕获到.
如果⽅法参数名称和需要绑定的URL中的变量名称不⼀致时,需要@PathVariable的属性value赋值.
@RequestMapping("/r13/{id}")public String r13(@PathVariable("id") Integer userId){return "userId为:"+userId;}
上传文件
上传文件时使用@RequestPart,并在括号中表示传来的请求中文件的"变量名".
@RequestMapping("/r14")public String r14(@RequestPart("wenjian") MultipartFile file){//获取文件的真实名称return file.getOriginalFilename();}
获取Cookie或Session
回顾Cookie:
HTTP协议自身是"无状态"协议.无状态协议指默认情况下HTTP协议的客⼾端和服务器之间的这次通信,和下次通信之间没有直接的联系.但是实际应用时,很多时候是需要知道请求之间的关联关系的.
Cookie就是用来解决这种需要关联关系的场景的.在客户端访问服务器时,登陆成功后,服务器会返回一个"令牌",这个令牌通常是存储在Cookie中的.此时在服务器这边就需要记录"令牌"信息,以及令牌对应的⽤⼾信息,这个就是Session机制所做的⼯作.
理解Session:
Session直译为会话,会话就是对话的意思,AB交流产生一个对话,AC交流产生一个对话.
在计算机领域,会话是⼀个客户与服务器之间的不中断的请求响应.对客⼾的每个请求,服务器能够识别出请求来⾃于同⼀个客户.当⼀个未知的客⼾向Web应⽤程序发送第⼀个请求时就开始了⼀个会话.当客⼾明确结束会话或服务器在⼀个时限内没有接受到客⼾的任何请求时,会话就结束了.
服务器同⼀时刻收到的请求是很多的.服务器需要清楚的区分每个请求是从属于哪个用户,也就是属于哪个会话,就需要在服务器这边记录每个会话以及与用户的信息的对应关系.Session是服务器为了保存用户信息⽽创建的⼀个特殊的对象.
1.当⽤⼾登陆的时候,服务器在Session中新增⼀个新记录,并把sessionId返回给客⼾端.(通过HTTP响应中的Set-Cookie字段返回).
2. 客⼾端后续再给服务器发送请求的时候,需要在请求中带上sessionId.(通过HTTP请求中的
Cookie字段带上).
3. 服务器收到请求之后,根据请求中的sessionId在Session信息中获取到对应的用户信息,再进行后续操作.找不到则重新创建Session,并把SessionID返回.
Cookie与Session的区别
1.Cookie是客⼾端保存⽤⼾信息的⼀种机制.Session是服务器端保存⽤⼾信息的⼀种机制.
2.Cookie与Session的关系主要通过sessionId关联起来的.
3.Cookie与Session通常结合使用,但是不是必须一起使用.
获取Cookie
1.通过HttpServletRequest对象获取Cookie.
@RequestMapping("/getCookie1")public String getCookie1(HttpServletRequest request) {Cookie[] cookies = request.getCookies();if (cookies != null) {for (Cookie cookie : cookies) {System.out.println(cookie.getName()+":"+cookie.getValue());}}return "Cookie信息获取完毕!";}
因为刚开始没有Cookie,因此我们需要手动添加一些Cookie.前往页面,打开F12调试,添加Cookie.然后再进行访问.
页面显示正常,控制台正常打印了Cookie.
2.使用@CookieValue简洁的获取Cookie.
@RequestMapping("/getCookie2")public String getCookie2(@CookieValue("cookie1") String cookie1, @CookieValue("ZheShiCookie") String cookie2) {return "Cookie信息获取:"+cookie1+"/"+cookie2;}
但是这个方法只能获取到指定的Cookie信息.
获取Session
Session是存储再服务器上的,我们要先进行添加才能获取.
@RequestMapping("/setSession")public String setSession(HttpServletRequest request) {HttpSession session = request.getSession();//前面为key后面是valuesession.setAttribute("userName","zhangsan");return "session设置完成";}
1.使用HttpServletRequest获取Session.
request中包含SessionId,服务器就能通过SessionId获取到Session信息.
@RequestMapping("/getSession1")public String getSession(HttpServletRequest request) {HttpSession session = request.getSession();String userName = (String)session.getAttribute("userName");return "userName:"+userName;}
2.通过SpringMVC内置的HttpSession对象来获取Session
对Session进行一个封装,在想要获取Session时可以单独获取,不再需要从request中获取.
@RequestMapping("/getSession2")public String getSession2(HttpSession session) {String userName = (String)session.getAttribute("userName");return "userName:"+userName;}
3.通过@SessionAttribute获取Session
对session对象的getAttribute方法进行了一些封装,直接通过注释来获取.
@RequestMapping("/getSession3")public String getSession3(@SessionAttribute("userName") String userName) {return "userName:"+userName;}
获取Header
1.通过HttpServletRequest获取Header
获取Header中的User-Agent字段:
@RequestMapping("/getHeader1")public String gerHeader1(HttpServletRequest request) {String userAgent = request.getHeader("User-Agent");return "userAgent:"+userAgent;}
2.通过@RequestHeader来获取Header
对getHeader进行了封装,直接通过@RequestHeader就能获取到Header中的信息.
@RequestMapping("/getHeader2")public String gerHeader2(@RequestHeader("User-Agent") String userAgent) {return "userAgent:"+userAgent;}