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

Joh*_*n N 4 jsf scope jsf-2

Mojara 2.1.21

我根据评论更新了我的问题.我有两种情况,组件绑定到服务器会话bean.(附加链接信息:绑定属性导致在视图中找到重复的组件ID,并且/sf/answers/875887071/)

版本1:

single.xhtml:

 <h:outputText value=... binding="#{mysessionbean.out}" />
Run Code Online (Sandbox Code Playgroud)

Java的:

 @SessionScoped @Named public class Mysessionbean {
    UIOutput out;
    //getter and setter ....
 }
Run Code Online (Sandbox Code Playgroud)

版本2:

所引用:

 <h:outputText value=... binding="#{mysessionbean.out}"
Run Code Online (Sandbox Code Playgroud)

view1.xhtml:

 <ui:composition template="template.xhtml" />
Run Code Online (Sandbox Code Playgroud)

view2.xhtml:

 <ui:composition template="template.xhtml" />
Run Code Online (Sandbox Code Playgroud)

Java的:

 @SessionScoped @Named public class Mysessionbean {
    UIOutput out;
    //getter and setter ....
 }
Run Code Online (Sandbox Code Playgroud)

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

编辑: 功能要求1:

我想在视图中使用Primefaces数据表.我需要来自这个数据表的一些信息.(例如选定的行或行索引).因此绑定数据表有助于我检索此信息.

功能要求2:

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

要求3

"版本2"中的情况.带有primefaces菜单和会话作用域绑定的模板.为此,我使用了EL-Binding.

Bal*_*usC 7

在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)}" />
Run Code Online (Sandbox Code Playgroud)

最后两项要求完全不清楚.至少,如果你做的事情如下:

<x:someComponent binding="#{bean.someComponent}" />
Run Code Online (Sandbox Code Playgroud)

在豆里

someComponent.setSomeAttribute(someAttribute);
someComponent.setOtherAttribute(otherAttribute);
Run Code Online (Sandbox Code Playgroud)

然后你应该做

<x:someComponent someAttribute="#{bean.someAttribute}" otherAttribute="#{bean.otherAttribute}" />
Run Code Online (Sandbox Code Playgroud)

或者,如果您打算能够在视图中的其他位置使用该组件,就像这样

<h:inputText ... required="#{not empty param[bean.save.clientId]}" />
...
<h:commandButton binding="#{bean.save}" ... />
Run Code Online (Sandbox Code Playgroud)

并且实例在bean中进一步使用,然后完全摆脱不必要的属性:

<h:inputText ... required="#{not empty param[save.clientId]}" />
...
<h:commandButton binding="#{save}" ... />
Run Code Online (Sandbox Code Playgroud)

如果确实存在某些不明原因的确无法解决,那么将会话范围bean的所有请求范围属性拆分为一个单独的请求范围bean,然后将其绑定到表单操作.会话作用域可以作为@ManagedProperty请求作用域之一注入.


也可以看看: