Mojara 2.1.21
我已根据评论更新了我的问题。我有两种情况,组件绑定到服务器会话bean。 (包含信息的其他链接:Binding attribute causes duplicate component ID found in the view和https://stackoverflow.com/a/12512672/2692917)
版本1:
single.xhtml:
<h:outputText value=... binding="#{mysessionbean.out}" />
的java:
@SessionScoped @Named public class Mysessionbean {
UIOutput out;
//getter and setter ....
}
版本2:
所引用:
<h:outputText value=... binding="#{mysessionbean.out}"
view1.xhtml:
<ui:composition template="template.xhtml" />
view2.xhtml:
<ui:composition template="template.xhtml" />
的java:
@SessionScoped @Named public class Mysessionbean {
UIOutput out;
//getter and setter ....
}
版本1没问题。 (至少我到目前为止没有遇到任何错误)。但是在版本2中,如果我从一个页面导航到另一个页面,则会出现重复ID错误。为什么会这样? 使用(请求范围的)组件(在版本1中)与会话作用域绑定是否安全? 还有其他用例需要考虑吗?
编辑: 功能要求1:
我想在视图中使用Primefaces数据表。我需要来自这个数据表的一些信息。 (例如选定的行或行索引)。因此绑定数据表有助于我检索此信息。
功能要求2:
复合组件中的组件绑定。它们将绑定到会话范围的bean。 (主要用在一个页面上,但是如果我在另一个页面上使用它会怎么样?
要求3
&#34;版本2&#34;中的情况。带有primefaces菜单和会话作用域绑定的模板。为此,我使用了EL-Binding。
答案 0 :(得分:7)
在JSF 2.x中,除非你想以编程方式操作组件(这本身也很狡猾),否则没有明智的现实用例将组件绑定到支持bean。当然,如果它们未被用于支持bean本身,或者仅仅是它们的属性已被展平,那么肯定不会。
关于获取数据表当前行的功能要求,这里列出了更好的方法,How can I pass selected row to commandLink inside dataTable?,例如,如果您的环境支持EL 2.2:
<h:dataTable value="#{bean.items}" var="item">
<h:column>
<h:commandLink value="Foo" action="#{bean.foo(item)}" />
最后两个要求完全不清楚。至少,如果你做的事情如下:
<x:someComponent binding="#{bean.someComponent}" />
with in bean
someComponent.setSomeAttribute(someAttribute);
someComponent.setOtherAttribute(otherAttribute);
然后你应该做
<x:someComponent someAttribute="#{bean.someAttribute}" otherAttribute="#{bean.otherAttribute}" />
或者,如果您打算能够在视图中的其他位置使用该组件,那么
<h:inputText ... required="#{not empty param[bean.save.clientId]}" />
...
<h:commandButton binding="#{bean.save}" ... />
并且实例在bean中进一步使用,然后完全摆脱不必要的属性:
<h:inputText ... required="#{not empty param[save.clientId]}" />
...
<h:commandButton binding="#{save}" ... />
如果确实存在某些不明原因,那么将会话范围bean的所有请求范围属性拆分为一个单独的请求范围的bean,然后将其绑定到表单操作。会话作用域可以只作为请求范围的@ManagedProperty
注入。
答案 1 :(得分:2)
我们遇到了类似的问题,我只想分享我们的解决方案:
问题: 在视图中有一个(扩展的大部分定制)数据表。
<x:dataTable binding="#{bean.someSomeDataTable}" />
导航到另一个页面后,我们希望数据表具有完全相同的状态。以前我们通过将数据表绑定到支持bean来解决这个问题。这适用于JSP。使用Facelets,我们无法做到这一点(重复ID错误)。所以我们使用了绑定,但只保存/恢复了数据表组件的状态。
public HtmlDataTable getSomeDataTable()
{
HtmlDataTable htmlDataTable = new HtmlDataTable();
if (tableState != null)
htmlDataTable.restoreState(FacesContext.getCurrentInstance(), tableState);
return htmlDataTable;
}
public void setSomeDataTable(HtmlDataTable table)
{
tableState = table.saveState(FacesContext.getCurrentInstance());
}