您基本上有 2 个选项来构建向导型流程。第一个选项是在一个视图中显示所有步骤,另一个是在向导中有步骤时显示视图数量。
一个视图中的所有向导步骤
正如 Xtreme Biker 正确提到的那样,设计视图最自然的方式是分离条件渲染组件中的每个步骤,例如<h:panelGroup>
在进入不同的向导步骤时更新 bean 的属性 currentStep。
基本视图设置:
<h:panelGroup id="step1">
<h:panelGroup rendered="#{bean.currentStep eq 1}">
<ui:include src="step1.xhtml"/>
</h:panelGroup>
</h:panelGroup>
...
包含的页面(step2.xhtml):
...
<h:commandButton value="Back" action="#{bean.back}">
<f:ajax execute="step2" render="step1 step2"/>
</h:commandButton>
<h:commandButton value="Forward" action="#{bean.forward}">
<f:ajax execute="step2" render="step1 step2"/>
</h:commandButton>
...
支持豆:
@ManagedBean
@ViewScoped
public class Bean implements Serializable {
...
private int currentStep = 1;//getter+setter
public String forward() {
...
if(currentStep == 2) {
doSomethingWithValues();
currentStep++;
}
...
}
public String back() {
...
if(currentStep == 2) {
clearNecessaryValues();
currentStep--;
}
...
}
}
如果您想在视图中嵌入自定义内容,这种方法很好。如果你擅长“标准”方法,你宁愿不重新发明轮子并使用Primefaces 库的<p:wizard>
标签,它在幕后基本上是相同的。
每个向导步骤都有不同的视图
如果您要通过调用后退/前进按钮导航到不同的视图,并在每次您的工作完成时返回不同的导航案例结果,可以使用flash
对象将所需的数据传输到下一个视图。
因此,设置将是:(wizard/step2.xhtml
每个步骤一个视图)和一个视图范围 bean Bean
。
一种观点(第二种观点)
...
<h:commandButton value="Back" action="#{bean.back}">
</h:commandButton>
<h:commandButton value="Forward" action="#{bean.forward}">
</h:commandButton>
...
支持豆:
@ManagedBean
@ViewScoped
public class Bean implements Serializable {
...
private int currentStep = 1;//getter+setter
@ManagedProperty("#{flash}")
private Flash flash;//getter+setter
private Data step1Data;
private Data step2Data;
private Data step3Data;
...
@PostConstruct
public void init() {
int step = Integer.parseInt(flash.get("newStep"));
Data step1 = (Data)flash.get("step1");
Data step2 = (Data)flash.get("step2");
Data step3 = (Data)flash.get("step3");
this.currentStep = step;
this.step1Data = step1;
this.step2Data = step2;
this.step3Data = step3;
...
}
public String forward() {
...
if(currentStep == 2) {
doSomethingWithValues();
currentStep++;
flash.put("step", currentStep);
flash.put("step1", step1Data);
flash.put("step2", step2Data);
return "wizard/step3?faces-redirect=true"
}
...
}
public String back() {
...
if(currentStep == 2) {
clearNecessaryValues();
currentStep--;
flash.put("step", currentStep);
flash.put("step1", step1Data);
return "wizard/step1?faces-redirect=true"
}
...
}
}