0

我在视图中有一个表单,例如说:

表单.xhtml

<h:form>
    <h:panelGrid columns="2">
        <h:outputLabel value="Name" />
        <h:inputText value="#{bean.name}" />

        <h:outputLabel value="Age" />
        <h:inputText value="#{bean.age}"
                     converter="#{ageConverter}" />

        <h:outputLabel value="" />
        <h:commandButton action="#{bean.submit}"
                         value="Submit" />
    </h:panelGrid>
</h:form>

受以下 bean 支持:

Bean.java

@Named
// Scope
public class Bean implements Serializable {
    @Inject private Service service;

    private String name;
    private int age;
    private List<Person> people;

    public void submit() {
        people= service.getPeople(name, age);
    }

    // getters & setters for name & age
    // getter for people
}

导致视图people

结果.xhtml

<h:form>
    <h:dataTable value="#{bean.people}"
                 var="person">
        <h:column>
            <f:facet name="header">Name</f:facet>
            #{person.name}
        </h:column>

        <h:column>
            <f:facet name="header">Day of Birth</f:facet>
            #{person.dayOfBirth}
        </h:column>
    </h:dataTable>
</h:form>

现在显然用例类似于: - 使用 form.xhtml 提交表单 - 使用Bean.java 从服务中获取人员 - 使用result.xhtml 显示人员

在这个例子中,仍有一小部分拼图不完整。例如,范围决定了结果中是否有people任何内容,此外,结果页面没有转发(或任何类似的东西)。

现在我不确定什么是最好的(或至少是好的)方法来实现这一点。以下是我能想到的一些方法:

  • 使用@ViewScoped(JSF2.2) 和隐式导航(返回Stringfrom submit())导航到第二页。然而,这打破了视野(无论如何要做到这一点)?
  • 使用@ViewScoped并包含基于rendered=''某些 EL 的正确文件(form.xhtml 或 result.xhtml)。这可以通过提交时的 Ajax 调用来完成。
  • 将值nameage作为 GET 参数传递给 result.xhtml 的请求并在 a 上执行逻辑@PostConstruct(但是,如果表单是“巨大的”怎么办)?在这种情况下@RequestScoped就足够了。

我的问题是,什么是完成这个用例的有效和好的(最好的)方法?

感谢您的输入。

4

2 回答 2

2

我认为您正在寻找的是flash scope。它在重定向后仍然存在,但在后续请求中不再可用。

一个解决方案是通过闪存范围传递您的nameage变量,并使用它们来呈现您的结果。

于 2013-05-18T09:35:08.420 回答
1

似乎 JSF 2.2 不仅为我们@ViewScoped提供了@FlowScoped. 欲了解更多信息:文档。这似乎很好地符合要求。

于 2013-05-18T09:48:11.330 回答