我们有一个基于 JSF2 的 Web 应用程序,它对购买过程进行建模,用户在类似向导的庄园中输入和选择不同的信息,可以向前和向后导航,并在某个时间点完成该过程。
所以没什么特别的,应用程序和用户之间的典型对话。为此,我尝试了常规和 MyFaces 对话范围,但我知道如何开始和结束对话。我仍然无法确保进行积极的对话,所以换句话说,我如何避免用户通过键入页面 URL 进入中间过程,而不是将他重定向到第 1 步?
我们有一个基于 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
一个(对于重要的情况,使用 MyFaces CODI 您可以@ViewScoped
在 CDI 上使用 JSF @Named
)。
此外,PrimeFaces有一个<p:wizard>
几乎完全一样的组件。您可能会发现它很有用,可以让您免于验证等一些痛苦的样板代码。