EL中访问含null键的Map时,方括号与get方法表现差异咨询
EL中Map空键的方括号语法与get方法差异解析
这不是EL的bug,而是符合EL的设计逻辑。
核心原因:EL方括号对null键的特殊处理
EL规范明确规定,使用map[key]方括号语法时,若key为null,会被自动转换为字符串"null"作为键去Map中查找,而非直接使用null本身。而Java原生的map.get(key)方法则会直接传递null作为键,完全遵循Map的原生行为。
对应到你的场景:
- 当
person为null时,#{bean.byPerson[person][svc]}实际等价于调用byPerson.get("null").get(svc),但你的Map中只有null键,不存在"null"字符串键,因此找不到对应值,EL对null值默认渲染为空字符串,所以返回空白。 - 而
#{bean.byPerson.get(person)[svc]}直接调用Java的get(null),匹配到Map中存在的null键,自然能正常返回对应数值。
直观验证方法
你可以在后台代码中添加测试逻辑:
// 同时添加null键和"null"字符串键 Map<String, Integer> nullKeyMap = new HashMap<>(); nullKeyMap.put("svc1", 100); Map<String, Integer> stringNullKeyMap = new HashMap<>(); stringNullKeyMap.put("svc1", 200); byPerson.put(null, nullKeyMap); byPerson.put("null", stringNullKeyMap);
此时页面中测试:
#{bean.byPerson[person][svc1]}(person为null)会返回200#{bean.byPerson.get(person)[svc1]}会返回100,能直接看到两种语法的差异。
总结
EL方括号语法对null键的转换是规范定义的行为,目的是统一处理空值场景的歧义。如果需要操作Map的null键,必须使用Java原生的get()方法调用。
内容的提问来源于stack exchange,提问作者Edward
相关产品推荐
相关产品推荐

