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浏览器(操作 ...
随机推荐
- spark共享变量
boradcast例子代码: scala版本 spark共享变量之Accumulator 例子代码: scala版本
- phpwind8.7升级9.0.1过程(四)20130207升级到20141228
每一次升级前都要注意备份 1.网站根目录的所有文件 2.网站的数据库 根据phpwind官方教程 更新到20130702版本成功并备份 更新到20140428版本成功并备份 20141228版本的更新 ...
- C# TcpClient TcpListener 简单练习01
下面是读<Visual C#.Net 网络编程>整理的练习代码. 客户端发送命令给服务端,从服务器端获取所有人员的成绩或者指定人员的成绩. 命令格式为 GET 0|1 [Name].0为获 ...
- 黑马程序员——JAVA基础之简述面向对象,类,变量,匿名对象
------- android培训.java培训.期待与您交流! ---------- 面向对象: 面向对象是相对面向过程而言 面向对象和面向过程都是一种思想 面向过程 强调的是功能行为 面向对象 将 ...
- C++中的单例模式
单例模式也称为单件模式.单子模式,可能是使用最广泛的设计模式.其意图是保证一个类仅有一个实例,并提供一个访问它的全局访问点,该实例被所有程序模块共享.有很多地方需要这样的功能模块,如系统的日志输出,G ...
- JQuery之滑动幻灯片插件Easy Slider初体验
Easy Slider 是一个滑动幻灯片插件,支持任何图片或内容,可以实现横向或纵向滑动.它拥有一系列丰富的参数设置,可通过CSS来进行完全的控制.基本上只需要引入这个插件后,设置好内容,然后样式化C ...
- 一个非常简单的RPC服务
1.servicefunctions.php <?php class ServiceFunctions { public static function getDisplayName($f,$l ...
- share point 读取 List数据
SPSecurity.RunWithElevatedPrivileges(delegate() { using (SPSite oSite = new SPSite(siteUrl)) { forea ...
- PHP实现动态规划背包问题
有一堆货物,有各种大小和价值不等的多个物品,而你只有固定大小的背包,拿走哪些能保证你的背包带走的价值最多 动态规划就是可以记录前一次递归过程中计算出的最大值,在之后的递归期间使用,以免重复计算. &l ...
- vs2010编译lua-5.3.2
lua-5.3.2.tar.gz 解开在 D:\lua 1. 启动VS命令行 2. c:\program files\microsoft visual studio 10.0\vc\bin>cd ...