如何在JSF中使用组件绑定? (会话范围bean中的请求范围的组件)

时间:2013-09-06 23:13:16

标签: jsf jsf-2 scope

Mojara 2.1.21

我已根据评论更新了我的问题。我有两种情况,组件绑定到服务器会话bean。 (包含信息的其他链接:Binding attribute causes duplicate component ID found in the viewhttps://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。

2 个答案:

答案 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());
}