JSF 2.0中用于向导模式的范围是什么?
我有一个多页面的表单,又名向导模式,其中第1页对应于向导表单的第1步,第2页对应第2步等。除最后一页以外的每个页面都有一个Next按钮,你到表格的下一页。最后一页有一个提交按钮,用于提交向导中所有页面的所有数据。JSF 2.0中用于向导模式的范围是什么?
我应该使用什么范围来维护每个表单上输入的数据的状态?例如我应该使用一个View Scoped bean来保存所有页面上输入的所有数据吗?这是否会工作,因为我将导航到不同的页面(我认为这些页面被认为是不同的“视图”;如果他们是不同的视图,我相信当您导航到下一页时,视图范围数据将会丢失向导)
我相信当你在向导中导航到下一个页面视图作用域的数据将丢失)
这是正确的。只要您与相同视图进行交互并在创建新视图时进行垃圾回收,视图范围就会一直存在。你正在寻找“对话范围”。这不受任何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>
组件用于此目的。
我不幸没有访问CDI容器。我想我可能会继续使用p:向导或条件渲染。使用JSF 2.0的“自定义范围”设施是否会提供另一种选择? – BestPractices 2012-03-27 21:06:52
是的,应该可以使用自定义的JSF2范围。这不会是一些微不足道的代码,我可以在头顶打字(因为我从来没有这样试过:))。 – BalusC 2012-03-27 21:09:21
从我的pov,这里很好的选择是会话范围的bean。在需要时,用户将能够中断向导,访问其他页面,文档,手册等等,然后返回到相同的向导步骤。当然,它可以通过视图范围的bean来完成(请参阅BalusC答案)。就个人而言,我更喜欢ajax大量参与的视图范围的bean。在这种情况下,我建议组合这两个范围。
我不会为此推荐会话范围。这会导致在多个浏览器窗口/选项卡中打开向导页时出现不规则情况。 – BalusC 2012-03-27 20:40:29
...以及后扣。 – BestPractices 2012-03-27 21:07:16
@BestPractices,当然,这取决于。有时候ALT-F4也是一个问题,你无法胜利)) – Osw 2012-03-27 21:15:23
我认为ViewScope正常工作只使用Ajax。但我会推荐这个选项。 – Gaim 2012-03-27 20:18:42