在rich:dataTable中使用h:commandlink(或commandbutton)时,永远不会调用指定的操作,也不会实例化相应的托管bean(无论是在请求还是会话范围)...... 相反,执行相同的请求..(页面重新加载).. 已经看到在论坛上似乎是类似的问题,但实际上并不是我遇到的问题.. h:commandlink /按钮在rich:datatable ..
之外工作正常有人有任何建议吗?
这是一段代码:
<h:commandLink id="commLink" actionListener="#{hBean.test}" action="#{hBean.viewTranslation}">
<h:outputText value="#{trans.translationName}"/>
</h:commandLink>
</rich:column>
答案 0 :(得分:2)
bean显然是请求范围的,并且在bean构造期间没有加载数据模型(至少在后续请求的应用请求值阶段期间)。您需要为后续请求保留相同的数据模型,否则JSF无法找到与单击的链接关联的行项。最直接的方法是在bean的构造函数或@PostConstruct
方法中加载datamodel。
快速修复/测试是将bean放入会话范围。然后,数据模型将保存在会话范围中,并在后续请求中可用。但这对用户体验有更大的影响(例如,当在同一会话中的不同浏览器窗口/标签中打开相同页面时出现意外结果)。如果您已经使用JSF 2.0(由于您使用的是RichFaces可能不是这种情况),那么新的视图范围将是 解决方案。
答案 1 :(得分:0)
感谢BalusC的回复。实际上在我的情况下事情并不那么简单,因为我使用spring和JSF一起使用我的dataList是在spring注释控制器中构造的,所以为了让它知道jsf支持bean我必须让bean知道spring和jsf ..您的回复虽然帮助我找到了解决方案 - 不仅我必须在spring和jsf之间共享我的bean,还需要制作会话范围的spring控制器..也许这不是一个很好的解决方案,但现在适用.. <登记/> 我没有在我的最新项目之前使用过jsf,并且不得不说我不满意它需要如此紧密地遵循它的架构 - 让它有些难以合并spring和jsf
答案 2 :(得分:0)
如果您使用的是RichFaces 3.0.0到3.3.3,请使用标记a4j:keepAlive。它甚至可以在请求范围内工作。