更新:对于那些将其标记为重复关闭的人,假设的重复问题与我所问的完全不同。我的问题是直到渲染时间我才知道问题集是什么,会有多少问题或问题类型是什么,所以我不能使用“可能重复”答案中描述的技术。
我们的 JSF 2.x 应用程序的一部分需要向用户呈现问题集,其中问题和问题类型直到运行时才知道。例如,我们有类似的东西(为清楚起见,省略了 getters/setters):
public class QuestionSet {
private List<Section> sections;
}
public class Section {
private String sectionTitle;
private List<Question> questions;
private SectionStatus status; // e.g. UNANSWERED, CURRENTLY_ANSWERING,ANSWERED, COMPLETED
}
public class Question {
private String questionText;
private QuestionType questionType; // E.G TEXT, RADIO, LIST, CHECKBOX
private List<String> options; // for RADIO/LIST/CHECKBOX types
private List<String> answers;
}
我们需要在单独的 div 中渲染每个部分,具体取决于它的状态(例如,UNANSWERED 将显示一个仅包含标题的 div,ANSWERED 将显示一个带有部分标题和绿色刻度线的 div,而 CURRENTLY_ANSWERING 将呈现一个带有部分标题,然后是每个问题,根据问题类型使用适当的输入控件。
这些问题在运行期间也是动态的——例如,如果用户对单选按钮问题回答“是”,这可能会提示进一步的子问题。
我目前正在使用绑定来执行此操作,即
<h:panelGroup binding = "#{bean.panelGroup}" />
并在 bean 的 getPanelGroup 中手动使用 HtmlPanelGroup、HtmlOutputText、带有 ValueExpressions 的 UIInput 等创建组件树,这些工作正常,但在阅读 BalusC 的一些答案时,尤其是这个问题:“绑定”属性如何在 JSF 中工作?何时以及如何使用它?我想知道是否有“更好”的方法?
我担心的一件事是在 RECREATE_VIEW 期间调用了 getter,原因在链接问题中解释(在调用绑定中提到的方法之后)所以除非我采取措施,在 RECREATE_VIEW 阶段,只返回我创建的组件在最后一个 RENDER_RESPONSE 阶段,这引入了重新创建我刚刚创建的东西的不必要费用。
在这种情况下,JSF 调用我的 setter 来设置我刚刚在 getter 中为绑定属性提供的东西似乎也毫无意义。(我的 bean 是 View 范围,因为我需要使用 ajax 来实现我们用户需要的一些功能)
非常感谢您的想法/意见(尤其是来自一直很有帮助的 BalusC)...