Допустим, у меня есть простой шаблон потока задач task-flow-template.xml:
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
|
< 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 и два поддерживающих бина. FlowBean имеет область действия pageFlow и отвечает за хранение информации о потоке. ViewBean имеет область запроса (мы будем играть с этим), и он обслуживает активность представления ManView.
У flowBean есть следующий метод, возвращающий заголовок потока задач:
1
2
3
|
public String getFlowTitle() { return null ; } |
ViewBean имеет некоторое строковое поле testString для хранения входного значения:
1
2
3
4
5
6
7
8
9
|
protected String testString; public void setTestString(String testString) { this .testString = testString; } public String getTestString() { return testString; } |
MainView показывает заголовок потока задач и имеет inputText для testString . Это выглядит так:
У нас также есть два потока задач, построенных на шаблоне потока задач — определение первого потока и определение второго потока. Они переопределили управляемые бобы.
Для определения первого потока :
01
02
03
04
05
06
07
08
09
10
11
12
|
< 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 > |
01
02
03
04
05
06
07
08
09
10
|
public class FirstFlowBean extends FlowBean { public FirstFlowBean() { super (); } public String getFlowTitle() { return "FirstFlow" ; } } |
01
02
03
04
05
06
07
08
09
10
11
|
public class FirstViewBean extends ViewBean { public FirstViewBean() { super (); } @PostConstruct public void init() { testString = "FirstFlow" ; } } |
Таким образом, заголовок и значение по умолчанию для testString — «FirstFlow».
Для определения второго потока :
01
02
03
04
05
06
07
08
09
10
11
|
< 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 > |
01
02
03
04
05
06
07
08
09
10
|
public class SecondFlowBean extends FlowBean { public SecondfFowBean() { super (); } public String getFlowTitle() { return "SecondFlow" ; } } |
01
02
03
04
05
06
07
08
09
10
11
12
|
public class SecondViewBean extends ViewBean { public SecondViewBean() { super (); } @PostConstruct public void init() { testString = "SecondFlow" ; } } |
Таким образом, заголовок и значение по умолчанию для testString — «SecondFlow».
ОК. Время экспериментировать. Давайте разместим на нашей странице две области с потоками задач определения первого потока и определения второго потока:
1
2
3
|
< af:region value = "#{bindings.firstflowdefinition1.regionModel}" id = "r1" /> < af:separator id = "s1" /> < af:region value = "#{bindings.secondflowdefinition1.regionModel}" id = "r2" /> |
requestScope
Оставляя область видимости для viewBean как requestScope, мы получим следующий результат:
В SecondFlow мы видим testString из экземпляра FirstViewBean. Мы можем иметь только один экземпляр bean-компонента requestScope для каждого запроса. ViewBean был создан для потока задач FirstFlow, и тот же экземпляр был снова использован для SecondFlow.
backingBeanScope
И, да, backingBeanScope устранил проблему. У нас есть два экземпляра viewBean — для регионов r1 и r2.
Но давайте сделаем процесс определения первого потока немного более сложным:
Теперь мы можем вызывать дочерний поток задач (того же определения) из MainView. И давайте повторим эксперимент. На начальном рендеринге:
Все идет нормально. Давайте что-нибудь введем во входной текст FirstFlow и нажмем «вызвать дочерний поток задач»:
viewScope
А теперь давайте изменим область видимости viewBean на viewScope и проведем тот же эксперимент. На начальном рендеринге:
ОК. Ввод того же мусора в inputText:
И нажав «вызовить дочерний процесс»:
Это оно!
Ссылка: управляемые области bean-компонентов для фрагментов страницы в потоке задач ADF от нашего партнера по JCG Евгения Федоренко из блога ADF Practice .