Spring Web MVC入门补充1

学习Spring MVC

请求

传递数组

Spring MVC可以⾃动绑定数组参数的赋值.

java 复制代码
    @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.绑定参数关系.

java 复制代码
    @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对象.

java 复制代码
    @RequestMapping("/r10")
    public String r10(@RequestBody Student student){
        return student.toString();
    }
从URL中获取参数

在访问一些网站时,我们发现它们的URL中没有查询字符串,确认代之的是相同的文件路径后跟随了一些不同的字母/数字组合,如B站的bv号.想要从URL中获取参数,可以使用@PathVariable.并修改@RequestMapping中的映射地址相关信息.

java 复制代码
    @RequestMapping("/r11/{id}")
    public String r11(@PathVariable Integer id){
        return "id为:"+id;
    }

这样在访问时,将想要传递的id放置在r11的后面,后端就能接收到id了.

在传递多个参数时,需要一一对应.

java 复制代码
    @RequestMapping("/r12/{id}/{name}")
    public String r12(@PathVariable Integer id,@PathVariable String name){
        return "id:"+id+",name:"+name;
    }
java 复制代码
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赋值.

java 复制代码
    @RequestMapping("/r13/{id}")
    public String r13(@PathVariable("id") Integer userId){
        return "userId为:"+userId;
    }
上传文件

上传文件时使用@RequestPart,并在括号中表示传来的请求中文件的"变量名".

java 复制代码
    @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字段返回).

  1. 客⼾端后续再给服务器发送请求的时候,需要在请求中带上sessionId.(通过HTTP请求中的

Cookie字段带上).

  1. 服务器收到请求之后,根据请求中的sessionId在Session信息中获取到对应的用户信息,再进行后续操作.找不到则重新创建Session,并把SessionID返回.
Cookie与Session的区别

1.Cookie是客⼾端保存⽤⼾信息的⼀种机制.Session是服务器端保存⽤⼾信息的⼀种机制.

2.Cookie与Session的关系主要通过sessionId关联起来的.

3.Cookie与Session通常结合使用,但是不是必须一起使用.

获取Cookie

1.通过HttpServletRequest对象获取Cookie.

java 复制代码
    @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.

java 复制代码
    @RequestMapping("/getCookie2")
    public String getCookie2(@CookieValue("cookie1") String cookie1, @CookieValue("ZheShiCookie") String cookie2) {
        return "Cookie信息获取:"+cookie1+"/"+cookie2;
    }

但是这个方法只能获取到指定的Cookie信息.

获取Session

Session是存储再服务器上的,我们要先进行添加才能获取.

java 复制代码
    @RequestMapping("/setSession")
    public String setSession(HttpServletRequest request) {
        HttpSession session = request.getSession();
        //前面为key后面是value
        session.setAttribute("userName","zhangsan");
        return "session设置完成";
    }

1.使用HttpServletRequest获取Session.

request中包含SessionId,服务器就能通过SessionId获取到Session信息.

java 复制代码
    @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中获取.

java 复制代码
    @RequestMapping("/getSession2")
    public String getSession2(HttpSession session) {
        String userName = (String)session.getAttribute("userName");
        return "userName:"+userName;
    }

3.通过@SessionAttribute获取Session

对session对象的getAttribute方法进行了一些封装,直接通过注释来获取.

java 复制代码
    @RequestMapping("/getSession3")
    public String getSession3(@SessionAttribute("userName") String userName) {
        return "userName:"+userName;
    }
获取Header

1.通过HttpServletRequest获取Header

获取Header中的User-Agent字段:

java 复制代码
    @RequestMapping("/getHeader1")
    public String gerHeader1(HttpServletRequest request) {
        String userAgent = request.getHeader("User-Agent");
        return "userAgent:"+userAgent;
    }

2.通过@RequestHeader来获取Header

对getHeader进行了封装,直接通过@RequestHeader就能获取到Header中的信息.

java 复制代码
    @RequestMapping("/getHeader2")
    public String gerHeader2(@RequestHeader("User-Agent") String userAgent) {
        return "userAgent:"+userAgent;
    }

​​​​​​​

复制代码
相关推荐
L.EscaRC2 小时前
Spring Security的解析与应用
spring boot·spring
cynicme4 小时前
力扣3318——计算子数组的 x-sum I(偷懒版)
java·算法·leetcode
天若有情6735 小时前
【java EE】IDEA 中创建或迁移 Spring 或 Java EE 项目的核心步骤和注意事项
后端·spring·java-ee·intellij-idea
青云交5 小时前
Java 大视界 -- Java 大数据在智能教育学习效果评估与教学质量改进实战
java·实时分析·生成式 ai·个性化教学·智能教育·学习效果评估·教学质量改进
崎岖Qiu5 小时前
【设计模式笔记17】:单例模式1-模式分析
java·笔记·单例模式·设计模式
Lei活在当下6 小时前
【现代 Android APP 架构】09. 聊一聊依赖注入在 Android 开发中的应用
java·架构·android jetpack
不穿格子的程序员7 小时前
从零开始刷算法-栈-括号匹配
java·开发语言·
lkbhua莱克瓦247 小时前
Java练习-正则表达式 1
java·笔记·正则表达式·github
yue0087 小时前
C#类继承
java·开发语言·c#
大鱼七成饱7 小时前
💥 从崩溃到稳定:我踩过的 Rust Tokio 线程池坑(含代码示例)
后端