Task Flow使用指南之四:获取Task Flow返回值(2)

来源:互联网 发布:汽车美容会员软件 编辑:程序博客网 时间:2024/05/17 07:52
开发环境:JDevloper 11.1.2.1.0+ Oracle Database 10g Express Edition 10.2.0.1。

TaskFlow可以以inline popup窗口的方式显示,那么如何得到TaskFlow的返回值呢?
回答是通过按钮上的ReturnListener方法。
本实验场景如下:在员工表单修改页面,点击浏览部门按钮,弹出一个popup窗口,选择一个部门,确定后,该部门即为当前员工的部门。

重点步骤说明:
1. employee-taskflow
这是一个使用page fragment的Bounded TaskFlow。


2. employee.jsff

Browse按钮的代码如下:
<af:commandButton text="Browse..." id="cb6" windowHeight="350" windowWidth="430"                   returnListener="#{myBackingBean.departmentsTaskFlowReturnListener}" partialSubmit="true"                  useWindow="true" action="launch" windowEmbedStyle="window"/>

属性说明:
(1)useWindow=true, 表明下一个导航目的地,使用popup窗口方式展现。
(2)windowEmbedStyle=inlineDocument,popup窗口与原始页面是同一个view id;=window,popup窗口单独使用一个view id。
(3)windowModalityType=applicationModal,modal模式;=modeless,非modal模式。
(4)lanchListener=popup窗口装载时调用的方法,可以用来向popup窗口传递参数。
(5)returnListener=popup窗口的返回时调用的方法,可以用来接收返回值。
(6)partialSubmit=true,防止显示popup窗口时,原始页面被reloading。

3. departments-taskflow
(1)该TaskFlow即是在popup窗口中显示的TaskFlow。
注意,这是一个没有使用page fragment的Bounded TaskFlow。也就是说,在popup窗口中显示的TaskFlow没有要求一定要用page fragment。

(2)departments.jsf

Select Department按钮的代码如下:
                  <af:commandButton text="Select Department" id="cb1" action="done">    <af:setPropertyListener type="action" from="#{bindings.DepartmentId.inputValue}"                            to="#{pageFlowScope.selectedDepartmentId}"/></af:commandButton>

注意,为了方便地在页面中引用DepartmentId的值,我手工为页面添加一个AttributeBinding:DepartmentId。
可以看出,点击按钮后,DepartmentId的值将被传递到pageFlowScope.selectedDepartmentId中。

(3)设置departments-taskflow的返回参数值
参数bv_departmentId的值正是来自于前面设置的pageFlowScope.selectedDepartmentId。

那么,最终是如何获得返回值的呢?答案在Managed Bean的代码中。

4. Managed Bean的代码
package view;import java.util.Map;import javax.faces.application.Application;import javax.faces.application.NavigationHandler;import javax.faces.context.FacesContext;import oracle.adf.model.BindingContext;import oracle.adf.model.binding.DCIteratorBinding;import oracle.adf.view.rich.render.ClientEvent;import oracle.binding.AttributeBinding;import oracle.binding.BindingContainer;import oracle.binding.ControlBinding;import oracle.jbo.Row;import org.apache.myfaces.trinidad.context.RequestContext;import org.apache.myfaces.trinidad.event.ReturnEvent;public class MyBackingBean {    public MyBackingBean() {        super();    }    public void departmentsTaskFlowReturnListener(ReturnEvent returnEvent) {        BindingContext bindingContext = BindingContext.getCurrent();        BindingContainer bindings = bindingContext.getCurrentBindingsEntry();        ControlBinding control = bindings.getControlBinding("DepartmentId");        AttributeBinding deptId = (AttributeBinding)control;        deptId.setInputValue(returnEvent.getReturnValue());    }   }

注意,这里直接通过returnEvent.getReturnValue()获取返回对象,因为只有一个返回值,所以不用根据变量名字查找。
如果是返回多个值,可以使用returnEvent.getReturnParameters();获取所有变量值。
Map params = returnEvent.getReturnParameters();for (Map.Entry entry : params.entrySet()) {    Object key =  entry.getKey();    Object value =  entry.getValue();    System.out.println(key.toString() + ":" + value.toString());}

更进一步,你可以在程序中自己创建一个HashMap对象,为其增加Key和Value,然后返回。比如:
HashMap hm = new HashMap();
hm.put("myreturn","The Value");
AdfFacesContext.getCurrentInstance().returnFromDialog(null,hm); 

5. 支持双击选择
点击Select Department按钮选择当前行有些麻烦,如果能够支持双击选择就好了。
关于支持Table双击的方法请参考《Table 组件使用指南之二:基于Table的CRUD》。
这里只重点说明Managed Bean中新增加的方法:handleTableDoubleClick。
(1)使用ViewIterator查找当前行对象。
(2)获取PageFlowScope,并通过程序设置pageFlowScope.selectedDepartmentId变量。
(3)使用NavigationHandler实现程序导航。
 public void handleTableDoubleClick(ClientEvent clientEvent) {        Map pageFlowScope = RequestContext.getCurrentInstance().getPageFlowScope();        BindingContainer bindings = BindingContext.getCurrent().getCurrentBindingsEntry();        DCIteratorBinding iter = (DCIteratorBinding)bindings.get("DepartmentsView1Iterator");        Row row = iter.getCurrentRow();               pageFlowScope.put("selectedDepartmentId", row.getAttribute("DepartmentId"));        FacesContext fctx = FacesContext.getCurrentInstance();        Application application = fctx.getApplication();        NavigationHandler navHandler = application.getNavigationHandler();        ControllerContext controllerContext = ControllerContext.getInstance();        String viewId = controllerContext.getCurrentViewPort().getViewId();         navigationHandler.handleNavigation(fctx, viewId,  "done");    }


Project下载:ADF_TaskFlow_ReturnValues.7z

参考文献:
1. http://www.yaosansi.com/post/605.html

2. http://oracleseeker.com/2009/12/30/adf_dialog_inlinepopup_11g/

http://maping930883.blogspot.com/2010/04/adf086task-flowtask-flow2.html

0 0
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 美图手机久没充电再充没反应怎么办 美图6s开不开机怎么办 苹果4s照片不能拍照黑屏怎么办 美图手机开机键坏了怎么办 金立金刚二手机烧卡怎么办 金立金刚手机开不开机怎么办 小米4手机拆机信号不好怎么办 荣耀自带游览器无法正常打开怎么办 苹果4s电池越来越不耐用怎么办 苹果4s电池不耐用了怎么办 苹果手机4s电池不耐用怎么办 红米4s电池不耐用怎么办 32位app私密相册打不开怎么办 红米手机取卡针断手机里了怎么办 我差评了客服打电话骂我怎么办 顺丰快递在预计时间没有回来怎么办 同款商品比京东便宜怎么办 京东自营不支持7天退货怎么办 天猫买了一个月的电动车坏了怎么办 发票号码和机打号码不一致怎么办 交电费的本子弄丢了怎么办 快递正在派件中发现地址错了怎么办 快递当天送达当天签收还算延怎么办 深圳国税公众号预约取号公司怎么办 社保买了停了2年怎么办 qq号被冻结申请不回来了怎么办 qq号被冻结 手机密保忘了怎么办 微信账号封了2天怎么办 买qq号被申诉找回了怎么办 收到了京东白条的催款通知单怎么办 成都买房社保不够两年怎么办18年 电话号码给人设置成骚扰电话怎么办 找不到领导电话不接短信不回怎么办 微信账号被别人手机号冻结了怎么办 微信冻结了手机号也让人换了怎么办 顺丰快递拒收退回丢件了怎么办 京东买东西快递电话没有听到怎么办 在京东购物自己电话号输错了怎么办 北京房子卖了户口没地方迁怎么办 微信弄丢了微信密码找不到了怎么办 微信背人用过找不到密码怎么办