ADF任务流:页面片段的托管bean范围
假設我有一些簡單的任務流模板 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();}@PostConstructpublic 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();}@PostConstructpublic 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調用子任務流(具有相同的定義)。 讓我們重復一下實驗。 關于初始渲染:
到目前為止,一切都很好。 讓我們在FirstFlow的輸入文本中輸入一些內容,然后按“調用子任務流”:
哎呀! 在請求期間,我們只有一個r1區域的viewBean實例。 因此,在父任務流中再次呈現了在父任務流中輸入的值“ FirstFlow111111”。 viewScope
?
現在,我們將viewBean的范圍更改為viewScope并進行相同的實驗。 關于初始渲染:
好。 在inputText中輸入相同的垃圾:
然后按“呼叫子任務流程”:
一切都很好。 我們不僅為不同的視口ID(針對不同的區域和任務流實例)使用了單獨的viewScope bean實例,而且控制器還在導航過程中重置了viewScope。 但是奶酪不是免費的。 您必須按記憶付費。 如果requestScope或backingBeanScope的生存期不超過請求,則viewScope保留在內存中,直到更改視口ID。 也許在我的后續文章中,我將展示如何使用backingBeanScope解決問題。 因此,當您為片段托管bean選擇適當的范圍時,請考慮將如何使用任務流。 為了獲得非常高的可重用任務流,使用viewScope可能是片段bean的最佳方法。而已!
參考:來自ADF實踐博客的JCG合作伙伴 Eugene Fedorenko提供的ADF Task Flow中頁面片段的托管bean作用域 。
翻譯自: https://www.javacodegeeks.com/2012/05/adf-task-flow-managed-bean-scopes-for.html
總結
以上是生活随笔為你收集整理的ADF任务流:页面片段的托管bean范围的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 怎样终止电脑系统更新(怎样终止电脑系统更
- 下一篇: 通过OpenShift超越云技术