我们有一个基于JSF2的web应用程序,它为购买过程建模,其中用户在类似向导的庄园中输入和选择不同的信息,可以向前和向后导航,并在某个时候完成该过程。
没什么特别的,一个典型的应用程序和用户之间的对话。为此,我尝试了常规和MyFaces对话范围,但是尽管我知道如何开始和结束对话。我仍然没有设法确保一个活跃的对话,所以换句话说,我如何通过输入页面URL而不是将用户重定向到步骤1来避免用户在中间进入流程?
你无法避免。终端用户可以完全自由地操作请求URL。最好的选择是坚持使用单个视图/URL,其中向导步骤是根据视图的状态有条件地(ajax-)呈现的。这样,最终用户只能通过UI中提供的按钮进行导航,而不能通过操纵URL进行导航。
。
<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>
同样,这样您就可以使用单个@ViewScoped
bean而不是@ConversationScoped
bean(对于重要的情况,使用MyFaces CODI您将能够在CDI @Named
上使用JSF @ViewScoped
)。
此外,PrimeFaces有一个<p:wizard>
组件,它几乎与此完全相同。您可能会发现它很有用,可以将您从验证之类的痛苦的样板代码中拯救出来。