关于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的区别
https://blog.nowcoder.net/n/290df5af9a58477ead5a52256f5d548d
很明显的指出model的使用,一定要返回一个页面,我这边是返回了 一个map ,相当于返回了JSON . 所以我这边这个项目只能采用session或者前端接受JSON进行JS操作
第二个错误
由于这个函数我是在页面加载时调用的,然后通过取session中的值进行循环渲染形成下拉框
但是问题就会遇到,你进入这个页面,下拉框是空的,只有主动刷新一次才会有下拉值,可能是异步的原因吧
所以就要再前一个页面就完成这个操作,提前调用接口并存好值,不然就会取不到值.
第三个错误
这个只能大概形容一下 , 就是如果返回值为Model , 但是又使用了@Response这个注解 , 页面就不会寻找 存在Attribute中的值 , 直接根据注解返回的字符串进行下一行 操作 . 所以尽量不要混合使用 .
解决方案:
最后我正确的做法就是,在前一个页面加载 进行调用接口 , 并把数据存入到 session中 , 然后 在前段 使用 Thymeleaf 进行渲染生成下拉框 .