JSF 2.0中用于向导模式的范围是什么?

问题描述:

我有一个多页面的表单,又名向导模式,其中第1页对应于向导表单的第1步,第2页对应第2步等。除最后一页以外的每个页面都有一个Next按钮,你到表格的下一页。最后一页有一个提交按钮,用于提交向导中所有页面的所有数据。JSF 2.0中用于向导模式的范围是什么?

我应该使用什么范围来维护每个表单上输入的数据的状态?例如我应该使用一个View Scoped bean来保存所有页面上输入的所有数据吗?这是否会工作,因为我将导航到不同的页面(我认为这些页面被认为是不同的“视图”;如果他们是不同的视图,我相信当您导航到下一页时,视图范围数据将会丢失向导)

+0

我认为ViewScope正常工作只使用Ajax。但我会推荐这个选项。 – Gaim 2012-03-27 20:18:42

我相信当你在向导中导航到下一个页面视图作用域的数据将丢失)

这是正确的。只要您与相同视图进行交互并在创建新视图时进行垃圾回收,视图范围就会一直存在。你正在寻找“对话范围”。这不受任何JSF托管bean作用域的影响。这是CDI @ConversationScoped提供的。所以,如果你的环境发生支持CDI,你可以把它的使用:

import javax.enterprise.context.Conversation; 
import javax.enterprise.context.ConversationScoped; 
import javax.inject.Inject; 
import javax.inject.Named; 

@Named 
@ConversationScoped 
public class Wizard implements Serializable { 

    @Inject 
    private Conversation conversation; 

    @PostConstruct 
    public void init() { 
     conversation.begin(); 
    } 

    public void submitFirstStep() { 
     // ... 
    } 

    // ... 

    public String submitLastStep() { 
     // ... 

     conversation.end(); 
     return "someOtherPage?faces-redirect=true"; 
    } 

    // ... 
} 

谈话由自动插入cid请求参数进行管理。

如果你想坚持到JSF视图范围,那么你最好的选择是其中您呈现多个步骤有条件地建立一个页面:

<h:panelGroup rendered="#{wizard.step == 1}"> 
    <ui:include src="/WEB-INF/wizard/step1.xhtml" /> 
</h:panelGroup> 
<h:panelGroup rendered="#{wizard.step == 2}"> 
    <ui:include src="/WEB-INF/wizard/step2.xhtml" /> 
</h:panelGroup> 
<h:panelGroup rendered="#{wizard.step == 3}"> 
    <ui:include src="/WEB-INF/wizard/step3.xhtml" /> 
</h:panelGroup> 

或者,你可以使用第三方组件库,如PrimeFaces,它具有<p:wizard>组件用于此目的。

+0

我不幸没有访问CDI容器。我想我可能会继续使用p:向导或条件渲染。使用JSF 2.0的“自定义范围”设施是否会提供另一种选择? – BestPractices 2012-03-27 21:06:52

+0

是的,应该可以使用自定义的JSF2范围。这不会是一些微不足道的代码,我可以在头顶打字(因为我从来没有这样试过:))。 – BalusC 2012-03-27 21:09:21

从我的pov,这里很好的选择是会话范围的bean。在需要时,用户将能够中断向导,访问其他页面,文档,手册等等,然后返回到相同的向导步骤。当然,它可以通过视图范围的bean来完成(请参阅BalusC答案)。就个人而言,我更喜欢ajax大量参与的视图范围的bean。在这种情况下,我建议组合这两个范围。

+0

我不会为此推荐会话范围。这会导致在多个浏览器窗口/选项卡中打开向导页时出现不规则情况。 – BalusC 2012-03-27 20:40:29

+0

...以及后扣。 – BestPractices 2012-03-27 21:07:16

+0

@BestPractices,当然,这取决于。有时候ALT-F4也是一个问题,你无法胜利)) – Osw 2012-03-27 21:15:23

可以使用通话范围在这个网站创建向导找到一个例子:

JEE6 – CDI and Conversation Scope