【问题标题】:Passing variable to another view: best practice将变量传递给另一个视图:最佳实践
【发布时间】:2013-05-13 09:38:08
【问题描述】:

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

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) 和隐式导航(从submit() 返回String)导航到第二页。但是,这会破坏视图范围(无论如何要完成此操作)?
  • 使用@ViewScoped 并包含基于rendered='' 的正确文件(form.xhtml 或result.xhtml)和一些EL。这可以通过提交时的 Ajax 调用来完成。
  • 在对 result.xhtml 的请求中将值 nameage 作为 GET 参数传递并在 @PostConstruct 上执行逻辑(但是,如果表单是“巨大的”怎么办)?在这种情况下,@RequestScoped 就足够了。

我的问题是,什么是完成此用例的有效且良好(最佳)的方法?

感谢您的意见。

【问题讨论】:

    标签: java jsf jsf-2 scope


    【解决方案1】:

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

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

    【讨论】:

    • 是的,但似乎我忘了提及我正在使用 CDI。另一种方法是使用对话范围,但如果有人离开表单而不是完成用例,我该如何销毁这个范围?
    • +1,因为您对闪存范围的建议将我指向实际的 CDI 解决方案 @FlowScoped,如我的示例中所述。
    • @Aquillo,您可以使用 custom navigation handler在基于 CDI bean 的 JSF 应用程序中处理对话范围管理
    【解决方案2】:

    似乎 JSF 2.2 不仅为我们提供了@ViewScoped,它还为我们提供了@FlowScoped。欲了解更多信息:documentation。这似乎很符合要求。

    【讨论】:

      猜你喜欢
      • 2012-07-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-01-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多