OAF_架构MVC系列4 - Control的概述(概念)
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的概述(概念)的更多相关文章
- OAF_架构MVC系列3 - View的概述(概念)
2014-06-18 Created By BaoXinjian
- OAF_架构MVC系列2 - Model的概述(概念)
2014-06-22 Created By BaoXinjian
- OAF_架构MVC系列1 - MVC的概述(概念)
2015-04-03 Created By BaoXinjian
- mvc项目架构分享系列之架构搭建初步
mvc项目架构分享系列之架构搭建初步 Contents 系列一[架构概览] 0.项目简介 1.项目解决方案分层方案 2.所用到的技术 3.项目引用关系 系列二[架构搭建初步] 4.项目架构各部分解析 ...
- Asp.net mvc项目架构分享系列之架构概览
Asp.net mvc项目架构分享系列之架构概览 Contents 系列一[架构概览] 0.项目简介 1.项目解决方案分层方案 2.所用到的技术 3.项目引用关系 系列二[架构搭建初步] 4.项目架构 ...
- Asp.net mvc项目架构分享系列之架构搭建初步
copy to:http://www.cnblogs.com/ben121011/p/5014795.html 项目架构各部分解析 Core Models IDAL MSSQLDAL IBLL BLL ...
- 【ASP.NET MVC系列】浅谈ASP.NET MVC八大类扩展(上篇)
lASP.NET MVC系列文章 [01]浅谈Google Chrome浏览器(理论篇) [02]浅谈Google Chrome浏览器(操作篇)(上) [03]浅谈Google Chrome浏览器(操 ...
- 【ASP.NET MVC系列】浅谈ASP.NET MVC运行过程
ASP.NET MVC系列文章 [01]浅谈Google Chrome浏览器(理论篇) [02]浅谈Google Chrome浏览器(操作篇)(上) [03]浅谈Google Chrome浏览器(操作 ...
- 【ASP.NET MVC系列】浅谈Google Chrome浏览器(操作篇)(下)
ASP.NET MVC系列文章 [01]浅谈Google Chrome浏览器(理论篇) [02]浅谈Google Chrome浏览器(操作篇)(上) [03]浅谈Google Chrome浏览器(操作 ...
随机推荐
- Apache使用mod_deflate模块压缩页面优化传输速度
可以写为一行,也可以写多行,默认为gzip SetOutputFilter DEFLATE # Restrict compression to these MIME types AddOutputFi ...
- Javascript对象属性与方法汇总
Javascript对象属性与方法汇总 发布时间:2015-03-06 编辑:www.jquerycn.cn 详细介绍下,javascript对象属性与对象方法的相关知识,包括javascript字符 ...
- POJ-2152 Fire (树形DP)
题目大意:在一棵树中选出一些点,选每个点的代价为w(i),并且对于点 i ,在距离它lim(i)之内必须选一个点,使它作为 i 的依赖点.求最小代价. 题目分析:定义状态dp(u,k)表示使u为根节点 ...
- C中的基本数据类型和变量
C语言中的数据类型 基本数据类型 1) 整型 (int %d) 2) 字符型 (char %c) 3) 浮点型 %d ①. 单精度浮点型(float) ②. 双精度浮点型(double) 2.指 ...
- Android系统 小米/三星/索尼 应用启动图标未读消息数(BadgeNumber)动态提醒
http://www.51itong.net/android-badgenumber-9789.html Android系统 小米/三星/索尼 应用启动图标未读消息数(BadgeNumber)动态提醒 ...
- 利用caffe生成 lmdb 格式的文件,并对网络进行FineTuning
利用caffe生成 lmdb 格式的文件,并对网络进行FineTuning 数据的组织格式为: 首先,所需要的脚本指令路径为: /home/wangxiao/Downloads/caffe-maste ...
- sybase参数调整
- Android 中使用自定义字体的方法
1.Android系统默认支持三种字体,分别为:“sans”, “serif”, “monospace 2.在Android中可以引入其他字体 . <?xml version="1.0 ...
- Unity3D研究院编辑器之不影响原有布局拓展Inspector
今天无意间发现了一篇好文章,也让我解决了一个很久都没解决的难题.问题是这样的,假如我想去拓展Unity自带的inspector但是并不想影响原有布局. 比如下面这段代码: 1 2 3 4 5 ...
- C#基础:Lambda表达式
从委托的角度来看,Lambda表达式与匿名方法没有区别.在[C#基础:匿名方法]一文中,我使用了匿名方法来调用List<T>的FindAll方法.从C# 3.0开始,在使用匿名方法的地方, ...