4

莫哈拉 2.1.21

我已经根据评论更新了我的问题。我有两种情况,组件绑定到服务器会话 bean。(附加信息链接:绑定属性导致在视图中发现重复的组件 IDhttps://stackoverflow.com/a/12512672/2692917

版本 1:

单.xhtml:

 <h:outputText value=... binding="#{mysessionbean.out}" />

爪哇:

 @SessionScoped @Named public class Mysessionbean {
    UIOutput out;
    //getter and setter ....
 }

版本 2:

模板.xhtml:

 <h:outputText value=... binding="#{mysessionbean.out}"

view1.xhtml:

 <ui:composition template="template.xhtml" />

view2.xhtml:

 <ui:composition template="template.xhtml" />

爪哇:

 @SessionScoped @Named public class Mysessionbean {
    UIOutput out;
    //getter and setter ....
 }

版本 1 没问题。(至少到目前为止我还没有遇到任何错误)。但是在版本 2 中,如果我从一个页面导航到另一个页面,则会发生重复的 id 错误。为什么会这样?将(请求范围的)组件(版本 1)与会话范围的绑定一起使用是否安全?还有其他用例需要考虑吗?

编辑: 功能要求1:

我想在视图中使用 Primefaces 数据表。我需要这个数据表中的一些信息。(如选中的行或行索引)。所以绑定数据表可以帮助我检索这些信息。

功能需求2:

复合组件中的组件绑定。它们将绑定到会话范围的 bean。(并且主要在一个页面上使用,但是如果我在另一个页面上使用它呢?

要求 3

如“版本2”中的情况。带有 primefaces 菜单和会话范围绑定的模板。为此,我使用了 EL-Binding。

4

2 回答 2

9

在 JSF 2.x 中,除非您想以编程方式操作组件(这本身也很可疑),否则没有明智的现实世界用例将组件绑定到支持 bean。如果它们进一步没有在支持 bean 本身中使用,或者仅仅是它们的属性被扁平化,那么肯定不会。


关于获取数据表当前行的功能需求,这里列出了很多更好的方法,如何将选定的行传递给dataTable内部的commandLink?,例如,如果您的环境支持 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}" />

与豆

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请求范围的一个注入。


也可以看看:

于 2013-09-09T00:27:42.980 回答
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());
}
于 2014-05-28T15:30:42.220 回答