Web Dynpro组件关系总结

本文介绍SAP Web Dynpro中组件的设计方法,包括CustomController的作用与使用技巧、不同组件间的视图跳转机制及数据绑定原理,旨在帮助开发者更好地理解和运用SAP Web Dynpro进行高效开发。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

组件的关系:

这里写图片描述
这里写图片描述
几个Controller都需要共同调用的内容可由写在Custom Controller中,例如当一个BAPI被调用时返回的信息需要某种形式的中间处理才可以显示,这个中间处理可由写在Custom Controller中。
如常见的RFC的处理就会在Custom中新建一个RFCController,并创建这三个常用的方法:

 //@@begin javadoc:excute_ZTM_RFC_YSQSD_GETORDER()
  /** 执行某RFC的方法. */
  //@@end
  public com.nanchu.ysd.model.Ztm_Rfc_Ysqsd_Getorder_Output excute_ZTM_RFC_YSQSD_GETORDER( com.nanchu.ysd.model.Ztm_Rfc_Ysqsd_Getorder_Input input )
  {
    //@@begin excute_ZTM_RFC_YSQSD_GETORDER()
    Ztm_Rfc_Ysqsd_Getorder_Output output = null;
    try {
        input.execute();
        output = input.getOutput();
    } catch (WDDynamicRFCExecuteException e) {
        e.printStackTrace();
        logger.errorT(e.getLocalizedMessage());
        printRFCError(e);
        return null;
    } finally {
        input.modelInstance().disconnectIfAlive();
    }
    return output;
    //@@end
  }

  //@@begin javadoc:handleBapiret()
  /** 处理异常. */
  //@@end
  public boolean handleBapiret( com.nanchu.ysd.model.Bapiret2 bapiret )
  {
    //@@begin handleBapiret()
    String type = bapiret.getType();
    String msg = bapiret.getMessage_V1();
    if ("S".equals(type)) {
        wdComponentAPI.getMessageManager().reportSuccess(msg);
        return true;
    } else if ("E".equals(type)) {
        wdComponentAPI.getMessageManager().reportException(msg, false);
        return false;
    } else if ("W".equals(type)) {
        wdComponentAPI.getMessageManager().reportWarning(msg);
        return true;
    }
    return true;
    //@@end
  }

  //@@begin javadoc:printRFCError()
  /** 打印异常. */
  //@@end
  public void printRFCError( com.sap.tc.webdynpro.modelimpl.dynamicrfc.WDDynamicRFCExecuteException e )
  {
    //@@begin printRFCError()
    try {
        wdComponentAPI.getMessageManager().reportException(
            new String(e.getMessage().getBytes("ISO-8859-1"), "GB2312"), false);
    } catch (UnsupportedEncodingException e1) {
        wdComponentAPI.getMessageManager().reportWarning(e1.toString());
    }   
    //@@end
  }

当然这些方法也是可以直接写在Component Controller中,但是方法一多就不好管理。
Custom Controller就相当于定制化的Component Controller,方便了代码的整合优化,并且其生命周期可以修改,而在Component中不能修改。
这里写图片描述

组件之间的跳转

1)无传值跳转

这里写图片描述
实现:
这里写图片描述
这里写图片描述
分成四个步骤:
1)创建要跳转的两个或多个View
2)在创建window并嵌入要跳转的View
3)在window中设置inbound和outbound插口
4)连接插口

2)有传值跳转

这里写图片描述
补充两个知识要点:
- 数据绑定(Data Binding):自动将数据从Controller的上下文传递到另一个Controller上下文。
映射可以分为内部映射(同一组件内不同控制器间的映射)和外部映射(不同组件之间的控制器间的映射);上下文节点为数据源时称为映射源节点,其他的成为映射节点。
- 数据绑定(Data Binding):自动将数据从View Controller的上下文传递到其布局的元素。
这里写图片描述
三个图可以说明其实现:
1)在Component Controller中新建共同使用的数据集,注意要设置Person节点的基数为1:1否则该节点是不活动的
这里写图片描述这里写图片描述
2)让两个互相跳转的View都映射到Component Controller,这样数据就会通过该控制器进行传递。
这里写图片描述
这里写图片描述
3)跳转按钮实现的方法如下:返回跳转的按钮同理。

  public void onActionGo(com.sap.tc.webdynpro.progmodel.api.IWDCustomEvent wdEvent )
  {
    //@@begin onActionGo(ServerEvent)
    //$$begin ActionButton(956662293)
    wdThis.wdFirePlugToDetailView();
    //$$end
    //@@end
  }

有时候需要在Local Dictionaries中新建一个Structure:StructurePerson,然后让Component Controller去绑定(Binding)这个Structure,再去让两个View分别映射Component的节点(即重复上述的操作)。如下面的Begin Date和End Date,可以使用系统自带的类型也可以绑定本地字典的类型:
这里写图片描述
这里写图片描述

3、不同Component之间的View跳转

这里写图片描述
实现:
1)首先准备好两个Component(ExComp、DetailComp)以及View(StartView & DetailView,DetailCompView)
2)Component里面Context内容是通过component Interface暴露给其他component,而使用该外部映射的Component就要通过used Component来引用映射源Component的component interface,从而建立外部映射关系。这里DetailComp和Component Controller(ExComp2)之间的映射成为外部映射
这里写图片描述
注意:外部映射的映射节点(本例中指的是Component Interface的Person节点)的isInputElement属性必须设置为true

3)至于示例要实现在同一个页面上显示另一个Component的View,则可以通过Window的ViewSet来实现,如下所示,StartView点击Go后跳转到Interface中去并把页面在空白的View上显示。
这里写图片描述

图片主要来自:SAP官方文档

SAP_ABAP_WebDynpro开发(中文) http://scnblogs.techweb.com.cn/tcsapbw/archives/5.html 一、WebDynpro For ABAP 基础 案例一:WebDynpro环境准备 - 6 - 案例二: Tabtrip与close事件 - 10 - 案例三: HorizonalContextPanel及其事件 - 12 - 案例四: ContextPanel及其事件 - 18 - 案例五: 使用RowRepeater - 25 - 案例六: Table:Scroll以及header(append与delete) - 30 - 案例七: Table:Group(Column & Row) 以及firstActualRow,FirstVisiableRow - 34 - 案例八: Table: Filter - 41 - 案例九: Table: Sort - 46 - 案例十: Table: Row Popin 与 Cell Popin,以及Business Graphic - 53 - 案例十一: Table: 使用TableSummaryCell作subtotal - 67 - 案例十二: Table: 实现TableSummaryCell的方法(展开或隐藏) - 72 - 案例十三: Table:动态创建并实现TableSummaryCell的方法(展开或隐藏) - 80 - 案例十四: Table:Context Change History的使用 - 89 - 案例十五: Table:Tree table(TreeByKeyTableColumn)- One level - 100 - 案例十六: Table:Tree table(TreeByKeyTableColumn)- multi level - 106 - 案例十七: Table:Tree table(TreeByKeyTableColumn)- Recursive Node - 112 - 案例十八: 使用DateNavigator - 121 - 案例十九: 使用RoadMap - 134 - 案例二十: 使用Phase Indicator - 149 - 案例二十一: 使用Select Options - 156 - 案例二十二: 简单使用Reuse Component - 162 - 案例二十三: 使用OTR并进行翻译 - 166 - 案例二十四: 利用Request进行SE63中OTR的翻译 - 170 - 案例二十五: UI Element的居中显示(Vertical and horizonal) - 173 - 案例二十六: 使用Grid layout将UI element放置在不同的位置(左右缩进等) - 183 - 案例二十七: 使用NavigationList(使用Recursion Node) - 186 - 案例二十八: 使用CheckBox 和Checkbox Group - 193 - 案例二十九: 使用OVS - 197 - 案例三十: 使用Supply Function - 207 - 案例三十一: 使用Message - 214 - 案例三十二:使用DropdownlistByKey 和DropdownlistByIndex - 223 - 案例三十三:使用External Window以及Dialog Boxes - 227 - 案例三十四:实现Input field的cursor定位 - 246 - 案例三十五:从View上实现WebDynpro的log out - 248 - 案例三十六:从Component Controller中实现WebDynpro的log out - 252 - 案例三十七:实现Mandatory Fields的check - 256 - 案例三十八:使用Assistance Class 案例三十九:WD防止Time out
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值