2014-06-18 Created By BaoXinjian


Control层位于Model层和View层的中间,连接了Model层和View层,

主要存在两个功能

  • 操作/初始化UI和数据
  • 接受和处理页面上的用户的各种事件,并进行分发

本文的基本结构

  • Designand Create an OA Controller - 基本概念和建立
  • Handling an HTTP GET - 如何处理HTTP GET请求
    • Data层面 - 进行初始化
    • WebBean层面
      • WebBean层面 - 动态修改WebBean的属性
      • WebBean层面 - 动态创建WebBean
  • Handing an HTTP POST - 如何处理HTTP POST请求
    • processFormData( )
    • processFormRequest( )
  • Model Interaction - Contorl层和Model层的整合
    • 在CO中通过pageContext.getRootApplicationModule()获取AM
    • 查询 - 在CO中调用AM的Search方法
    • 新增 - 在CO中调用AM的Create方法
    • 删除 - 在CO中调用AM的Delete方法
    • 提交 - 在CO中调用AM的Commit方法

OAF构成原件中Contorller的位置

二、具体解析


1. Designand Create an OA Controller - 基本概念和建立

选中PageRN,右击Set New Controller or Edit Contorller

系统会自动产生HTTP Get方法(processRequset)和HTTP Post方法(processFormRequest)

2. Handling an HTTP GET - 如何处理HTTP GET请求

2.1 修改WebBean的属性

比如动态修改TableText

processRequest(OAPageContext pageContext, OAWebBean webBean)
{
  // Always call this before adding your own code.  super.processRequest(pageContext, webBean);
 
  OATableBean table = (OATableBean)webBean.findIndexedChildRecursive("OrdersTable");
  if (table == null)
  {
     MessageToken[] tokens = { new MessageToken("OBJECT_NAME", "OrdersTable")};
     throw new OAException("ICX", "FWK_TBX_OBJECT_NOT_FOUND", tokens);
  }
   
  // Set the purchase-order specific "control bar" select text:
  // "Select Purchase Order(s) and..."
  String selectPOText = pageContext.getMessage("ICX", "FWK_TBX_T_SELECT_PO", null);
  table.setTableSelectionText(selectPOText);
}

2.2 创建WebBean

比如动态新增Table Row

OATableLayoutBean tableLayout = (OATableLayoutBean)findIndexedChildRecursive("tableLayout");
// Create a row layout and give it the unique ID "topRow"
OARowLayoutBean row = (OARowLayoutBean)createWebBean(pageContext,
                                                                                           OAWebBeanConstants.ROW_LAYOUT_BEAN,
                                                                                           null, // no need to specify a data type
                                                                                          "topRow");
// Create a row layout and give it the unique ID "bottomRow"
OARowLayoutBean anotherRow = (OARowLayoutBean)createWebBean(pageContext,
                                                                                                       OAWebBeanConstants.ROW_LAYOUT_BEAN,
                                                                                                       null, // no need to specify a data type
                                                                                                       "bottomRow");
// Always check to see if a web bean exists.
if (tableLayout != null)
{
   // Add the two row layout beans to the table so the "topRow" renders above
   // the "bottomRow"
   tableLayout.addIndexedChild(row);
   tableLayout.addIndexedChild(anotherRow);
}

3. Handing an HTTP POST - 如何处理HTTP POST请求

public void processFormRequest(OAPageContext pageContext, OAWebBean webBean)
{
   // Always call this before adding your code
   super.processFormRequest(pageContext, webBean);
   // Pressing the Go button causes the search to be executed.   If (pageContext.getParameter("Go") != null)
   {
     String orderNumber = pageContext.getParameter("SearchOrder");
     String created = pageContext.getParameter("Created");
     String showMyOrders = pageContext.getParameter("MyOrders");
     OAApplicationModule am = pageContext.getApplicationModule(webBean);
     // All parameters passed using invokeMethod() must be serializable.
     Serializable[] parameters = { orderNumber, created, showMyOrders };
     am.invokeMethod("search", parameters);
     // Now forward back to this page so we can implement UI changes as a
     // consequence of the query in processRequest(). NEVER make UI changes in
     // processFormRequest().
     pageContext.setForwardURLToCurrentPage(null, // no parameters to pass
                                            true, // retain the AM
                                            OAWebBeanConstants.ADD_BREAD_CRUMB_NO,
                                            OAWebBeanConstants.IGNORE_MESSAGES);   
  }
} // end processFormRequest();

4. Model Interaction - Contorl层和Model层的整合

4.1 在Am中调用Search方法,具体如何Search则定义在AM中

processFormRequest(OAPageContext pageContext, OAWebBean webBean)
{
  // Check to see if the "Go" button was pressed...
  if (pageContext.getParameter("gButton") != null)
  {
    // Get the search criteria
    String orderNumber = pageContext.getParameter("SearchOrder");
    String created = pageContext.getParameter("Created");
    String showMyOrders = pageContext.getParameter("MyOrders");
    OAApplicationModule am = pageContext.getApplicationModule(webBean);
    // All parameters passed using invokeMethod() must be serializable.    Serializable[] parameters = { orderNumber, created, showMyOrders };
    am.invokeMethod("search", parameters);
  }
}

4.2 在Am中调用Create方法,具体如何Create则定义在AM中

processFormRequest(OAPageContext pageContext, OAWebBean webBean)
{
  OAApplicationModule am = pageContext.getApplicationModule(webBean);
  am.invokeMethod("create", null);
}

4.3 在Am中调用Delete方法,具体如何Delete则定义在AM中

processFormRequest(OAPageContext pageContext, OAWebBean webBean)
{
 if (pageContext.getParameter("DeleteYesButton") != null)
 {
   // User has confirmed that she wants to delete this purchase order.
   // Invoke a method on the AM to set the current row in the VO and
   // call remove() on this row.
   
   String poHeaderId = pageContext.getParameter("poHeaderId");
   Serializable[] parameters = { poHeaderId };
   OAApplicationModule am = pageContext.getApplicationModule(webBean);     am.invokeMethod("delete", parameters);
  }

4.4 在Am中调用Commit方法,具体如何Commit则定义在AM中

processFormRequest(OAPageContext pageContext, OAWebBean webBean)
{
  if (pageContext.getParameter("Approve") != null)
  {
    OAApplicationModule am = pageContext.getApplicationModule(webBean);
    am.invokeMethod("Apply");
  }
}

Thanks and Regards

OAF_架构MVC系列4 - Control的概述(概念)的更多相关文章

  1. OAF_架构MVC系列3 - View的概述(概念)

    2014-06-18 Created By BaoXinjian

  2. OAF_架构MVC系列2 - Model的概述(概念)

    2014-06-22 Created By BaoXinjian

  3. OAF_架构MVC系列1 - MVC的概述(概念)

     2015-04-03 Created By BaoXinjian

  4. mvc项目架构分享系列之架构搭建初步

    mvc项目架构分享系列之架构搭建初步 Contents 系列一[架构概览] 0.项目简介 1.项目解决方案分层方案 2.所用到的技术 3.项目引用关系 系列二[架构搭建初步] 4.项目架构各部分解析 ...

  5. Asp.net mvc项目架构分享系列之架构概览

    Asp.net mvc项目架构分享系列之架构概览 Contents 系列一[架构概览] 0.项目简介 1.项目解决方案分层方案 2.所用到的技术 3.项目引用关系 系列二[架构搭建初步] 4.项目架构 ...

  6. Asp.net mvc项目架构分享系列之架构搭建初步

    copy to:http://www.cnblogs.com/ben121011/p/5014795.html 项目架构各部分解析 Core Models IDAL MSSQLDAL IBLL BLL ...

  7. 【ASP.NET MVC系列】浅谈ASP.NET MVC八大类扩展(上篇)

    lASP.NET MVC系列文章 [01]浅谈Google Chrome浏览器(理论篇) [02]浅谈Google Chrome浏览器(操作篇)(上) [03]浅谈Google Chrome浏览器(操 ...

  8. 【ASP.NET MVC系列】浅谈ASP.NET MVC运行过程

    ASP.NET MVC系列文章 [01]浅谈Google Chrome浏览器(理论篇) [02]浅谈Google Chrome浏览器(操作篇)(上) [03]浅谈Google Chrome浏览器(操作 ...

  9. 【ASP.NET MVC系列】浅谈Google Chrome浏览器(操作篇)(下)

    ASP.NET MVC系列文章 [01]浅谈Google Chrome浏览器(理论篇) [02]浅谈Google Chrome浏览器(操作篇)(上) [03]浅谈Google Chrome浏览器(操作 ...

随机推荐

  1. 工作中遇到的问题--缓存配置(使用@Configuration装配 @Bean的方式注入)

    @EnableCaching@Configurationpublic class MFGCachingConfiguration { @Autowired private MFGSettings mf ...

  2. POJ 1966 Cable TV Network(顶点连通度的求解)

                               Cable TV Network Time Limit: 1000MS   Memory Limit: 30000K Total Submissi ...

  3. 英语语法最终珍藏版笔记-17名词性-主语-宾语-同位语-表语-that从句

    名词性从句 在主从复合句中,从句可以充当主句的主语.表语.宾语或同位语.由于在多数情况下,主语.表语.宾语或同位语这四种句子成分由名词性词类充当,所以,我们把这些作用相当于名词的从句统称为名词性从句, ...

  4. 自定义颜色显示的CheckBox

    using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.T ...

  5. 为什么说Parcelable 比Serializable更高效

    本文转载自:http://blog.csdn.net/androidzhaoxiaogang/article/details/8172539 什么是序列化,实现序列化的目的是什么? 讨论这个问题之前, ...

  6. Oracle Enterprise Manager Cloud Control 12c的安装

    这里,我介绍的是Cloud Control 12c的安装.之前的版本叫Grid Control,这也是11g里面的叫法.在我写这篇博客时,Cloud Control 13c已经出来了,这个版本后续我再 ...

  7. Android Apk反编译得到Java源代码

    大家做Android开发,看到别人应用里一些好的功能,是不是很想得到源码,借鉴一下?既然Android是用JAVA开发的,那么我们就能很容易的通过反编译的到应用的源代码.下面我简单介绍下应该怎么操作. ...

  8. objective-c 一个链式加法计算器实现

    一个链式加法计算器实现思路 1.使用时的效果 Calculate * manger=[Calculate new]; int result=manger.add(123).add(123).sub(1 ...

  9. sql server ,OVER(PARTITION BY)函数用法,开窗函数,over子句,over开窗函数

    https://technet.microsoft.com/zh-cn/library/ms189461(v=sql.105).aspx https://social.msdn.microsoft.c ...

  10. unity, sceneview 中拾取球体gizmos

    http://answers.unity3d.com/questions/745560/handle-for-clickable-scene-objects.html http://www.jians ...