Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/jsf-2/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Jsf 2 未显示JSF绑定的HtmlPanelGrid_Jsf 2 - Fatal编程技术网

Jsf 2 未显示JSF绑定的HtmlPanelGrid

Jsf 2 未显示JSF绑定的HtmlPanelGrid,jsf-2,Jsf 2,我使用托管bean生成HtmlPanelGrid,然后将其绑定到xhtml文件中,如下所示 <h:panelGrid id ="questions" binding="#{ui.generatedComponents}" /> 此页面上有一个表单,带有下拉列表,每当选择一个值时,它都会显示该页面。但是,当选择某个组件时,会显示其他(静态的,即在xhtml页面中)组件,但不会显示绑定的组件 但是,如果我在浏览器中重新请求页面,它会显示它们 太令人困惑了。有什么想法吗?当

我使用托管bean生成HtmlPanelGrid,然后将其绑定到xhtml文件中,如下所示

    <h:panelGrid id ="questions"  binding="#{ui.generatedComponents}" />

此页面上有一个表单,带有下拉列表,每当选择一个值时,它都会显示该页面。但是,当选择某个组件时,会显示其他(静态的,即在xhtml页面中)组件,但不会显示绑定的组件

但是,如果我在浏览器中重新请求页面,它会显示它们


太令人困惑了。有什么想法吗?

当使用
绑定时,您需要绝对确保此属性后面的属性在当前视图中被该组件独占使用。托管bean不应在会话范围内,因为它将在同一会话中的多个视图(浏览器窗口/选项卡)之间共享同一属性。当然,它也不应该在适用范围之内。托管bean应该在请求或视图范围中处于最高级别。视图范围对于此特定目的最有意义

binding
后面的属性的getter方法也应该包含no业务代码。它只应归还财产,仅此而已。任何初始化都需要在支持bean类的(post)构造函数或(action)侦听器方法中完成。此组件属性的任何操作都需要在支持bean类的(操作)侦听器方法中完成


不这样做可能会导致尴尬的行为。

确实尴尬。。。它已经设置为请求范围,我已经将业务代码移动到postconstruct。然而,我认为问题在于原始sessionscoped托管bean中的“setter”方法(通过托管属性将其注入requestscoped托管bean)。它似乎是在postconstruct方法之后调用的,因此UIComponent是基于旧数据构建的。。。。我应该使用价值观/行为监听器吗?我想是的。您能告诉我如何从postconstruct内部获取发布到会话bean的“新”数据吗?使用requestparametermap????还是别的什么?只需在(操作)侦听器方法中执行该工作。绑定到command/ajax组件的
action
listener
属性的一个。我已经将逻辑放在valuechangelistener中,但是创建了请求范围bean,甚至在调用valuechangelistener之前,就通过getter请求用于绑定的UIComponent。因此,即使我使用侦听器,在我可以更改它之前,已经检索到该值(以及随后的HtmlPanel)。。。。。?还是我错了?这是参考资料,不是副本。Java是面向对象的,不是过程的。不要过分关注调用的getter/setter。别理他们。专注于以正确的方式创建/操作/存储它。在(post)构造函数中创建它,在(action)侦听器方法中操作它,并将其存储在请求或视图范围的bean中。这就是全部。