Java---SpringMVC(2)

下文使用postman模拟客户端传递信息。

1.postman传参介绍

1.1传递单个参数

1.2传递多个参数

注意事项

使⽤**基本类型(int...)**来接收参数时, 参数必须传(除boolean类型), 否则会报500错误

类型不匹配时, 会报400错误

对于包装类型, 如果不传对应参数,Spring 接收到的数据则为null

所以对于参数可能为空的数据,建议使⽤包装类型

1.3传递数组参数

复制代码
    @RequestMapping("/r1")
    String r1(String[] arr){
        return "r1:" + Arrays.toString(arr);
    }

也可以这样传入:

1.4传递对象

复制代码
    @RequestMapping("/r3")
    String r3(Person person){
        return "person:" + person;
    }
public class Person {
    private String name;
    private String password;
    private Integer age;

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getPassword() {
        return password;
    }

    public void setPassword(String password) {
        this.password = password;
    }

    public Integer getAge() {
        return age;
    }

    public void setAge(Integer age) {
        this.age = age;
    }

    @Override
    public String toString() {
        return "Person{" +
                "name='" + name + '\'' +
                ", password='" + password + '\'' +
                ", age=" + age +
                '}';
    }
}

也可以不按顺序传入:

1.5后端参数重命名(后端参数映射)

有时候前端为了保证前端代码的保密性,会把参数的名字起得后端人员难以理解,这时我们就可以借助注解@RequestParam 来重命名前后端的参数值.

复制代码
    @RequestMapping("/r4")
    String r4(@RequestParam("q") String keyword){
        return keyword;
    }

将前端传入的参数名"q"重命名为keyword

并且使⽤ @RequestParam 进⾏参数重命名时, 参数就变成了必传参数

如果不传参数,会报错

我们可以借助@RequestParam注解实现非必传参数的设置

复制代码
    @RequestMapping("/r5")
    String r5(@RequestParam(value = "q" ,required = false) String keyword){
        return "keyword: " + keyword;
    }

1.6 传递集合

集合参数:和数组类似, 同⼀个请求参数名有为多个, 且需要使⽤ @RequestParam 绑定参数关系

默认情况下,请求中参数名相同的多个值,是封装到数组. 如果要封装到集合,要使⽤

@RequestParam 绑定参数关系

复制代码
    @RequestMapping("/r6")
    String r6(@RequestParam(value = "q") List<String> list){
        return Arrays.toString(list.toArray());
    }

同样也可以一起传

1.8传递JSON数据

JSON概念

JSON:JavaScript Object Notation 【JavaScript 对象表⽰法】

JSON是⼀种轻量级的数据交互格式. 它基于 ECMAScript (欧洲计算机协会制定的js规范)的⼀个⼦集,采⽤完全独⽴于编程语⾔的⽂本格式来存储和表⽰数据。--百度百科

我们可以理解为一种数据结构/对象,用于在不同的语⾔中数据传递和交换.

JSON语法

JSON 是⼀个字符串,其格式⾮常类似于 JavaScript 对象字⾯量的格式

数据在键值对(Key/Value) 中

数据由逗号 , 分隔

对象⽤ {} 表⽰

数组⽤ [] 表⽰

值可以为对象, 也可以为数组, 数组中可以包含多个对象

复制代码
{
 "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", "Radiationblast"]
 }, {
 "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校验格式化⼯具

1.9JSON字符串和Java对象互转

复制代码
public class JSONUtils {
 private static ObjectMapper objectMapper = new ObjectMapper();
 public static void main(String[] args) throws JsonProcessingException {
 Person person = new Person();
 person.setId(5);
 person.setName("zhangsan");
 person.setPassword("123456");
 //对象转为JSON字符串
 String jsonStr = objectMapper.writeValueAsString(person);
 System.out.println("JSON字符串为:"+jsonStr);
 //JSON字符串转为对象
 Person p = objectMapper.readValue(jsonStr,Person.class);
 System.out.println("转换的对象
id:"+p.getId()+",name:"+p.getName()+",password:"+p.getPassword());
 }
}

使用ObjectMapper 对象提供的两个⽅法, 可以完成对象和JSON字符串的互转:

writeValueAsString: 把对象转为JSON字符串

readValue: 把字符串转为对象

1.10传递JSON对象

接收JSON对象, 需要使⽤ @RequestBody 注解

复制代码
    @RequestMapping("/r7")
    String r7(@RequestBody Person person){
        return person.toString();
    }

2.获取参数

2.1获取URL中参数@PathVariable

复制代码
    @RequestMapping("/article/{id}")
    String r8(@PathVariable() String id) {
        return "id: " + id;
    }

也可以变换参数名称:

复制代码
    @RequestMapping("/article/{articleId}")
    String r8(@PathVariable("articleId") String id) {
        return "id: " + id;
    }

2.2上传文件并接收到本地

使用@REquestPart

复制代码
    @RequestMapping("/r9")
    String r9(@RequestPart("userAgent") MultipartFile file) throws IOException {
        String fileName = file.getOriginalFilename();
        file.transferTo(new File("D:\\Test2" + fileName));
        return "接收文件名称为:" + fileName;
    }

接收文件并复制到本地文件夹

2.3获取Cookie/Session

当我们登录QQ时,并不是每一次需要输入账号密码进行验证,程序会根据用户之前登陆的信息直接进行登录,这就涉及了cookie及session的知识了。

上述图中的 "令牌" 通常就存储在 Cookie 字段中

此时在服务器这边就需要记录"令牌"信息, 以及令牌对应的⽤⼾信息, 这个就是 Session 机制所做的⼯作

我们使用抓包软件随便查看一个进程的cookie

其内部都存储一定信息,这就是cookie的作用

session

我们先来了解⼀下什么是会话.

会话: 对话的意思

在计算机领域, 会话是⼀个客⼾与服务器之间的不中断的请求响应. 对客⼾的每个请求,服务器能够识别出请求来⾃于同⼀个客⼾. 当⼀个未知的客⼾向Web应⽤程序发送第⼀个请求时就开始了⼀个会话.当客⼾明确结束会话或服务器在⼀个时限内没有接受到客⼾的任何请求时,会话就结束了

⽐如我们打客服电话

每次打客服电话, 是⼀个会话. 挂断电话, 会话就结束了

下次再打客服电话, ⼜是⼀个新的会话.

如果我们⻓时间不说话, 没有新的请求, 会话也会结束

Session是服务器为了保存⽤⼾信息⽽创建的⼀个特殊的对象

Session的本质就是⼀个 "哈希表", 存储了⼀些键值对结构. Key 就是SessionID, Value 就是⽤⼾信息(⽤⼾信息可以根据需求灵活设计)

获取cookie

复制代码
    @RequestMapping("/getCookie")
    String getCookie(HttpServletRequest request, HttpServletResponse response){
        Cookie[] cookies = request.getCookies();
        StringBuilder sb = new StringBuilder();
        for (Cookie cookie : cookies) {
            sb.append(cookie.getName() + ":" + cookie.getValue());
        }
        return "获取cookie:" + sb;
    }
    //简洁版
    @RequestMapping("/getCookie2")
    String getCookie2(@CookieValue("man") String bite) {
        return "man:" + bite;
    }

HttpServletRequest在有连接时直接使用(像String一样使用)

调用getCookies()方法获取cookie

从这个例⼦中, 也可以看出Cookie是可以伪造的, 也就是不安全的, 所以使⽤Cookie时, 后端需要进⾏ Cookie校验

设置Session

Session 存储和获取

Session是服务器端的机制, 我们需要先存储, 才能再获取

Session 也是基于HttpServletRequest 来存储和获取的

复制代码
    @RequestMapping("/setSession")
    String getSession(HttpServletRequest request) {
        HttpSession session = request.getSession();
        session.setAttribute("user",1);
        session.setAttribute("user",2);
        return "设置session";
    }

当调用request.getSession()时,如果没有session对象,那么系统将自动分配一个sessionId,然后再放回cookie中,再使用cookie访问session对象,获取session的信息

当然,也可以采用简化写法,既然如果没有session对象,那么系统将自动分配一个sessionId

.....那么我们直接声明一个 HttpSession session

复制代码
    @RequestMapping("/setSession2")
    String setSession2(String name, HttpSession session) {
        session.setAttribute("name","zhangsan");
        session.setAttribute("age",19);
        return "设置session";
    }

同样可以自动分配

此时我们再调用session

调用session

复制代码
    @RequestMapping("/getSession")
    String getSession(HttpServletRequest request) {
        HttpSession session = request.getSession(false);
        String name = (String)session.getAttribute("name");
        Integer age = (Integer)session.getAttribute("age");
        return "从session中获取信息  name:" + name + ",age:" + age;
    }

调用 session.getAttribute("name")...(因为有cookie,直接就可以调用上一步存储的信息)

这样我们就可以完成信息的保留 也就是会话

当然,也可以像刚才那样简化一下

复制代码
    @RequestMapping("/getSession2")
    String getSession2(HttpSession session) {
        String name = (String)session.getAttribute("name");
        Integer age = (Integer)session.getAttribute("age");
        return "从session中获取信息  name:" + name + ",age:" + age;
    }

还有封装的注解也可以调用session

@SessionAttribute("name")

复制代码
    @RequestMapping("/getSession3")
    String getSession3(@SessionAttribute("name") String name) {
        return "从session中获取信息  name:" + name;
    }
相关推荐
揣晓丹7 分钟前
JAVA实战开源项目:共享汽车管理系统(Vue+SpringBoot) 附源码
java·开发语言·vue.js·spring boot·开源
阿什么名字不会重复呢10 分钟前
hadoop-配置安装jdk
java·大数据·hadoop
生活百般滋味,人生需要笑对。 --佚名28 分钟前
docker安装redis
java·redis·docker
hxung33 分钟前
spring动态代理是在生命周期的哪个阶段实现的
java·后端·spring
座山雕~1 小时前
每日一题----------多线程和并发
java·开发语言
祝瑾萱1 小时前
JavaScript语言的正则表达式
开发语言·后端·golang
支持未来1 小时前
eclipse离线安装Grep console
java·ide·eclipse
哪吒编程1 小时前
2个真实案例,揭示Java并发工具类的致命陷阱,ConcurrentHashMap也不是100%安全
java·后端
机器视觉—ing1 小时前
C# 不同框架如何调用framework 和 net core
java·数据库·c#
李白的粉1 小时前
基于ssm的电子病历系统(全套)
java·毕业设计·ssm·课程设计·源代码·基于ssm的电子病历系统