2013-05-18 36 views
0

我有一个视图形式,例如说:传递变量另一种观点认为:最好的做法

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)导航到第二页。然而,这打破了viewcope(无论如何要完成这个)?
  • 使用@ViewScoped并包含基于rendered=''与某些EL的正确文件(form.xhtml或result.xhtml)。这可以通过提交上的Ajax调用完成。
  • 将值nameage作为GET参数传递给result.xhtml的请求,并在@PostConstruct上执行逻辑(但是,如果表单为'巨大')呢?在这种情况下,@RequestScoped就足够了。

我的问题是,什么将是一个高效和好(最好)的方式来完成这个用例?

感谢您的输入。

回答

1

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

2

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

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

+0

是的,但似乎我忘了提及我正在使用CDI。另一种方法是使用Conversation作用域,但是如果有人从表单导航而不是完成用例,我该如何销毁这个范围? – Aquillo

+0

+1,因为您对flash范围的建议将我指向实际的CDI解决方案'@ FlowScoped',如我的示例中所述。 – Aquillo

+0

@Aquillo,你可以使用[自定义导航处理程序](http://stackoverflow.com/a/15441777/1530938)在基于CDI bean的JSF应用程序中处理对话作用域管理, – kolossus

相关问题