あなたはそれを避けることはできません。エンドユーザーは、リクエストURLを自由に操作できます。最善の策は、ウィザードのステップがビューの状態に基づいて条件付きで(ajax-)レンダリングされる単一のビュー/URLに固執することです。このように、エンドユーザーは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を1つではなく@ConversationScoped
1つで回避できます(MyFaces CODIを使用すると、重要な場合@ViewScoped
に、CDI@Named
でJSFを使用できます)。
さらに、PrimeFaces<p:wizard>
には、ほぼ同じように機能するコンポーネントがあります。検証などに関する面倒な定型コードから身を守るために役立つ場合があります。