欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

关于SpringBoot中的MVC Controller层踩坑存入session 或者model 返回值

程序员文章站 2022-07-02 22:37:52
...

问题描述:

话不多说,又是每日一踩坑,具体是这样的,贴上代码

    @GetMapping("/getUserCheckType")
    @ResponseBody
    public Map getUserCheckType(String userID, Model model){
       System.out.println("操作者的userId为 : "+ userID);
        String url = "user/checkType/{userID}";
        /**
         * 调用工具类
         */
        Map map = callServiceUtils.callGetMethodHaveArgs(url, userID);
        //System.out.println(map);
       if(map.get("resultCode").equals("1") && map.get("data")!=null){
            //拿到data值
            Map data = (Map) map.get("data");
            //拿到检查类别map
            List checkTypeInfo = (List) data.get("checkTypeInfo");
            System.out.println("存入session中的值 checkTypes: "+checkTypeInfo);
            //将map转换为实体类
            /*CheckTypeInfo checkTypes = JSON.parseObject(JSON.toJSONString(checkTypeInfo), CheckTypeInfo.class);*/
            List<CheckTypeInfo> checkTypeInfos = JSON.parseArray(JSON.toJSONString(checkTypeInfo), CheckTypeInfo.class);
            model.addAttribute("checkTypes", checkTypeInfos);
            System.out.println("取值model: "+ model.getAttribute("checkTypes"));
        }
        return map;
    }

我要实现的功能基本就是能够将后端的数据存到session或者model中,虽然我觉得对于我这个项目来说session和model的区别不会很大(更多的是因为菜吧,所以需要不断的学习),结果就烦了挺严重的错误,
首先

第一个错误

model中其实存值是有条件的 , 我去查看别的大佬的说明 , 支出了session和model的区别

关于SpringBoot中的MVC Controller层踩坑存入session 或者model 返回值

https://blog.nowcoder.net/n/290df5af9a58477ead5a52256f5d548d

很明显的指出model的使用,一定要返回一个页面,我这边是返回了 一个map ,相当于返回了JSON . 所以我这边这个项目只能采用session或者前端接受JSON进行JS操作

第二个错误

由于这个函数我是在页面加载时调用的,然后通过取session中的值进行循环渲染形成下拉框
关于SpringBoot中的MVC Controller层踩坑存入session 或者model 返回值
但是问题就会遇到,你进入这个页面,下拉框是空的,只有主动刷新一次才会有下拉值,可能是异步的原因吧
关于SpringBoot中的MVC Controller层踩坑存入session 或者model 返回值
所以就要再前一个页面就完成这个操作,提前调用接口并存好值,不然就会取不到值.

第三个错误

这个只能大概形容一下 , 就是如果返回值为Model , 但是又使用了@Response这个注解 , 页面就不会寻找 存在Attribute中的值 , 直接根据注解返回的字符串进行下一行 操作 . 所以尽量不要混合使用 .


解决方案:

最后我正确的做法就是,在前一个页面加载 进行调用接口 , 并把数据存入到 session中 , 然后 在前段 使用 Thymeleaf 进行渲染生成下拉框 .