JSF的SelectItems错误引用var变量时itemLabel仍可生效的原因
涉及代码
托管Bean RadioView.java
@Named @RequestScoped public class RadioView { ... private String city2; private List<String> cities; ... }
UI文件oneRadio.xhtml
<p:selectOneRadio id="city2" value="#{radioView.city2}" layout="responsive" columns="3"> <f:selectItems value="#{radioView.cities}" var="c" itemLabel="#{city}" itemValue="#{city}"/> </p:selectOneRadio>
底层实现逻辑
这个现象主要和JSF EL表达式解析规则、f:selectItems组件的迭代容错机制两个核心逻辑有关,具体如下:
- JSF主流实现的隐式迭代变量兼容特性
以Mojarra(JSF官方参考实现)为例,f:selectItems迭代集合时,除了会把当前元素绑定到你自定义的var属性指定变量(这里是c)之外,还会自动生成一个和集合名单数形式同名的隐式变量。你这里绑定的集合名为cities,单数形式就是city,所以#{city}可以直接命中这个隐式变量,拿到当前遍历的字符串元素。 - 简单类型集合的容错降级规则
你当前的集合是List<String>基础类型集合,不需要映射自定义对象的属性,哪怕你用的JSF实现没有生成上述隐式变量,#{city}解析返回null时,f:selectItems也会触发降级逻辑:直接将当前迭代的集合元素本身作为itemLabel和itemValue的值,所以依然可以正常渲染和提交。
注:这个特性属于实现级别的兼容逻辑,不属于JSF规范强制要求的内容,生产环境建议统一使用var定义的变量名,避免不同版本的JSF/Primefaces适配出现异常。
内容的提问来源于stack exchange,提问作者Abdullah Mohammad Motiullah
相关产品推荐
相关产品推荐

