假设我有一些简单的任务流模板 task-flow-template.xml:
<managed-bean id="__5">
<managed-bean-name id="__3">viewBean</managed-bean-name>
<managed-bean-class id="__2">com.cs.blog.ViewBean</managed-bean-class>
<managed-bean-scope id="__4">request</managed-bean-scope>
</managed-bean>
<managed-bean id="__15">
<managed-bean-name id="__13">flowBean</managed-bean-name>
<managed-bean-class id="__12">com.cs.blog.FlowBean</managed-bean-class>
<managed-bean-scope id="__14">pageFlow</managed-bean-scope>
</managed-bean>
<view id="MainView">
<page>/MainView.jsff</page>
</view>
它具有一个视图活动MainView和两个后备bean。 flowBean具有pageFlow范围,并负责存储流信息。 viewBean具有请求范围(我们将使用该范围),并为ManView视图活动提供服务。
flowBean具有以下返回任务流标题的方法:
public String getFlowTitle() {
return null;
}
viewBean具有一些字符串字段testString来存储输入值:
protected String testString;
public void setTestString(String testString) {
this.testString = testString;
}
public String getTestString() {
return testString;
}
MainView显示任务流的标题,并具有testString的inputText。 看起来像这样:
我们还在任务流模板上构建了两个任务流–第一流定义和第二流定义。 他们已覆盖托管豆。
对于第一流定义 :
<managed-bean id="__5">
<managed-bean-name id="__3">viewBean</managed-bean-name>
<managed-bean-class id="__21">com.cs.blog.FirstViewBean</managed-bean-class>
<managed-bean-scope id="__4">request</managed-bean-scope>
</managed-bean>
<managed-bean id="__15">
<managed-bean-name id="__13">flowBean</managed-bean-name>
<managed-bean-class id="__12">com.cs.blog.FirstFlowBean</managed-bean-class>
<managed-bean-scope id="__14">pageFlow</managed-bean-scope>
</managed-bean>
public class FirstFlowBean extends FlowBean {
public FirstFlowBean() {
super();
}
public String getFlowTitle() {
return "FirstFlow";
}
}
public class FirstViewBean extends ViewBean {
public FirstViewBean() {
super();
}
@PostConstruct
public void init() {
testString = "FirstFlow";
}
}
因此,testString的标题和默认值为“ FirstFlow”。
对于第二个流程定义 :
<managed-bean id="__5">
<managed-bean-name id="__3">viewBean</managed-bean-name>
<managed-bean-class id="__21">com.cs.blog.SecondViewBean</managed-bean-class>
<managed-bean-scope id="__4">request</managed-bean-scope>
</managed-bean>
<managed-bean id="__15">
<managed-bean-name id="__13">flowBean</managed-bean-name>
<managed-bean-class id="__12">com.cs.blog.SecondFlowBean</managed-bean-class>
<managed-bean-scope id="__14">pageFlow</managed-bean-scope>
</managed-bean>
public class SecondFlowBean extends FlowBean {
public SecondfFowBean() {
super();
}
public String getFlowTitle() {
return "SecondFlow";
}
}
public class SecondViewBean extends ViewBean {
public SecondViewBean() {
super();
}
@PostConstruct
public void init() {
testString = "SecondFlow";
}
}
因此,testString的标题和默认值为“ SecondFlow”。
好。 现在该进行实验了。 让我们在页面上放置两个具有第一流定义和第二流定义任务流的区域:
<af:region value="#{bindings.firstflowdefinition1.regionModel}" id="r1"/>
<af:separator id="s1"/>
<af:region value="#{bindings.secondflowdefinition1.regionModel}" id="r2" />
requestScope
将viewBean的范围保留为requestScope,我们将得到以下结果:
在SecondFlow中,我们从FirstViewBean实例中看到了testString。 每个请求只能有一个requestScope bean实例。 viewBean是为FirstFlow任务流创建的,同一实例再次用于SecondFlow。
backingBeanScope
而且,是的,backingBeanScope已解决了该问题。 我们有两个viewBean实例–用于区域r1和r2。
但是,让我们让“第一流定义”任务流程更加复杂:
现在我们可以从MainView调用子任务流(具有相同的定义)。 让我们重复一下实验。 关于初始渲染:
![](https://1.bp.blogspot.com/-hNNd60m9_CI/T1zOHn7_H9I/AAAAAAAAANc/mg0tGbAXyto/s400/mbs6.jpg)
到目前为止,一切都很好。 让我们在FirstFlow的输入文本中输入一些内容,然后按“调用子任务流”:
![](https://3.bp.blogspot.com/-HQbDC-bThjw/T1zPItwqatI/AAAAAAAAANk/AIzn0WCjUKA/s400/mbs7.jpg)
viewScope
现在,我们将viewBean的范围更改为viewScope并进行相同的实验。 关于初始渲染:
![](https://1.bp.blogspot.com/-hNNd60m9_CI/T1zOHn7_H9I/AAAAAAAAANc/mg0tGbAXyto/s400/mbs6.jpg)
好。 在inputText中输入相同的垃圾:
![](https://3.bp.blogspot.com/-HQbDC-bThjw/T1zPItwqatI/AAAAAAAAANk/AIzn0WCjUKA/s400/mbs7.jpg)
然后按“呼叫子任务流程”:
![](https://1.bp.blogspot.com/-hNNd60m9_CI/T1zOHn7_H9I/AAAAAAAAANc/mg0tGbAXyto/s400/mbs6.jpg)
而已!
参考:来自ADF实践博客的JCG合作伙伴 Eugene Fedorenko提供的ADF Task Flow中页面片段的托管bean作用域 。
翻译自: https://www.javacodegeeks.com/2012/05/adf-task-flow-managed-bean-scopes-for.html