如何在JSF中无方法引用存储字符串?Facelets存ID遇重复值问题
解决Facelets中ID变量重复生成的问题
首先得搞清楚为什么<ui:param>会导致每次调用都生成新ID:Facelets里的<ui:param>采用延迟求值机制,每次你在页面中引用#{ids}时,EL表达式都会重新执行genId()方法,自然每次得到的ID都不一样。
你试过的<c:set>思路是对的,但选对作用域很关键:
如果你只需要这个ID在当前视图生命周期内唯一(比如同一个页面的多次AJAX请求也复用同一个ID),应该把作用域设为
view,而不是session:<c:set var="datatable1key" value="#{models.genId()}" scope="view" /><c:set>是立即求值的,当页面渲染到这个标签时,会一次性执行genId()并把结果存入视图作用域,后续所有对#{datatable1key}的引用都会直接取存储的值,不会再触发方法调用。要是用
session作用域,这个ID会在整个用户会话中共享,跨页面也不会重新生成,这大概率不是你想要的场景,反而可能导致ID冲突或者不必要的内存占用。
另外补充个小细节:你的genId()方法会往modelMap里存新的DataTableModel,如果重复调用会生成一堆无用的键值对,用view作用域的<c:set>刚好能避免这个问题,确保只生成一次唯一ID。
内容的提问来源于stack exchange,提问作者Z3RP
相关产品推荐
相关产品推荐

