将变量传递给另一个视图:最佳实践

时间:2013-05-18 08:35:54

标签: java jsf jsf-2 scope

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

form.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的视图:

result.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)和隐式导航(从String返回submit())导航到第二页。然而这打破了观察镜(无论如何要完成这个)?
  • 使用@ViewScoped并包含基于rendered=''的正确文件(form.xhtml或result.xhtml)和一些EL。这可以通过提交Ajax调用来完成。
  • 将值nameage作为GET参数传递给result.xhtml并在@PostConstruct上执行逻辑(但是,如果表单为'huge',该怎么办? )?在这种情况下,@RequestScoped就足够了。

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

感谢您的意见。

2 个答案:

答案 0 :(得分:2)

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

解决方案是通过Flash范围传递您的nameage变量,并使用它们来渲染您的结果。

答案 1 :(得分:1)

似乎JSF 2.2不仅向我们提供了@ViewScoped,它还为我们提供了@FlowScoped。有关详细信息:documentation。这似乎很符合要求。