0

更新:对于那些将其标记为重复关闭的人,假设的重复问题与我所问的完全不同。我的问题是直到渲染时间我才知道问题集是什么,会有多少问题或问题类型是什么,所以我不能使用“可能重复”答案中描述的技术。

我们的 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)...

4

2 回答 2

1

在这种情况下,我认为没有太多理由使用组件绑定。您可以在视图中决定要渲染什么以及如何渲染。您可以让<ui:fragment>/<c:if>根据问题类型有条件地呈现元素,<ui:repeat>/<c:forEach>来处理问题集等。

因此,如果我正确理解了工作流程,您的问题集将在例如 post constructor 方法中确定:

@PostConstruct
public void init() {
    questionSet = service.get();//get it somehow
}

然后你会有一组部分,每个部分都包含问题或答案,有效性将通过 AJAX 检查。如果我理解你的话,那么你可以有以下观点:

<h:form id="q-set">
    <ui:repeat value="#{bean.questionSet.sections}" var="section">
        <div>#{section.title}</div>
        <div class="#{section.status eq 'UNANSWERED' ? 'section-unanswered' : ... }"/>
        <ui:fragment rendered="#{section.status eq 'ANSWERED' ?}"><div class="tick"/></ui:fragment> ...
        <ui:fragment rendered="#{section.status eq 'ANSWERED' ?}">
            <ui:repeat value="#{section.questions}" var="question">
                <div>#{question.title}</div>
                <ui:fragment rendered="#{question.type eq 'RADIO'}">
                    <h:selectOneRadio value="#{question.answers[0]}" validator="...">
                        <f:selectItems value="#{question.options}" var="opt" itemLabel="#{opt}" ... />
                        <f:ajax ...>
                    </h:selectOneRadio>
                </ui:fragment>
                ...
            </ui:repeat>
        </ui:fragment>
    </ui:repeat>
</h:form>
于 2013-10-31T08:00:57.950 回答
0

看起来您的视图中将有太多的逻辑/条件。

在 Java 端以编程方式生成视图怎么样?

对于棘手的部分,您可以求助于 JavaScript 和 JSON。

于 2013-10-31T09:21:06.717 回答