马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。如果您注册时有任何问题请联系客服QQ: 83569622 。
您需要 登录 才可以下载或查看,没有帐号?注册
x
1.1.1. The Controller
控制器响应用户的动作,控制应用进程的流转。
在“OAF开发课程第三章”中将会详细讨论控制器的实现细节。
控制器与视的region级发生关联(通常的解释是,任何OAF的web bean,只要实现了oracle.apps.fnd.framework.webui.beans.OAWebBeanContainer接口就可以与控制器建立关联)。
所有的控制器都继承自oracle.apps.fnd.framework.webui.OAControllerImpl类。
控制器类定义了web beans的行为。很明显,你可以编写控制器代码来实现:
ü 运行时操纵或初始化UI(包括无法在IDE静态生成的而需要编程实现的布局)
ü 捕获或者处理用户事件,比如点击按钮的动作。
请求处理
当浏览器发送一个对OA.jsp的请求:
1、 OAF页面处理类(oracle.apps.fnd.framework.webui.OAPageBean)依据页面名称来决定需要调用哪个rootAM,并且将这个AM从AM池中取出。这个AM也可以从JDBC连接池中获取一个数据库连接,然后建立对上下文页面的处理。
2、 用户会话被验证;如果有效,将显示一个登录页面(细节后面详述)。
3、 假设用户是合法的,则OAPageBean将获取请求参数来处理POST请求或GET请求。
Handling a GET Request
当浏览器发出一个GET请求时,OA Framework使用即定的UI定义来建立web bean层次:
1 OAPageBean调用页面顶级pageLayout bean的processRequest()方法,并且整个web bean的层次与初始化web bean时一样将被递归处理(包括所有关联的模型组件)。
(1)、每个web bean将会实例化其所关联的控制器,并调用控制器CO中的processRequest(OAPageContext pageContext,OAWebBean webBean)方法。可以通过这个方法来构建、修改页面布局,设置web bean的属性以及任何的手工数据初始化(如切换到某个页面时执行自动的数据库查询)。
(2)、一些复杂的web bean(比如oracle.apps.fnd.framework.webui.beans.table.OATableBean和oracle.apps.fnd.framework.webui.beans.layout.OAPageLayoutBean)通过调用prepareForRendering()方法来执行“控制器后”(POST-CONTROLLER)处理。该方法的描述请参考相应的bean Javadoc。
(3)、每个web bean都将调用其子成员的processRequest()。
2 oracle.apps.fnd.framework.webui.OAPageBean生成UIX展现所需要的web bean的层次,并传送到浏览器端。
Handling a POST Request
当浏览器发出一个POST请求到服务器时:
1. OAPageBean将会检测web bean层次是否在内存中。如果没有,它将依照上面处理GET请求的方式来进行处理。
2. OAPageBean调用层次中的所有bean的processFormData(OAPageContext pageContext,OAWebBean webBean)方法来将表单中的数据提交到模型中去(通常是调用pageLayout类型的region的processFormData(),并对其的子成员的processFormData进行递归调用)。将表单数据自动提交到对应的模型中调用属性和实体级的验证,并且如果抛出任何验证异常的话,处理过程将停止并且错误信息将会返回给用户。
3. 如果在执行processFormData()过程中没有抛出异常,OAPageBean将调用层次bean中所有层次上的processFormRequest(OAPageContext pageContext,OAWebBean webBean)。该过程中可以通过增加控制器代码来实现对用户事件的响应。
4. 如果没有JSP页面被服务器端重置(forward)或客户端重定向(redirect),抑或在执行processFormRequest()过程中有异常被抛出,则页面将被刷新。
OAPageContext
当OA Framework接收到一个OA.jsp请求时,OAPageBean将生成OAPageContext(oracle.apps.fnd.framework.webui.OAPageContext)。这个类只能存货在页面处理过程中。processRequest()、processFormData()、processFormRequest()三个方法俊将OAPageContext做为参数,并且任何你编写的控制器代码均可以利用这个重要的类。

上面的图示说明,OAPageContext对请求和rootAM均有引用关联。通过这些已有的关联,OAPageContext在每个你的控制器的响应-请求方法中传递。以下几个通常的工作就是如何利用OAPageContext的实例:
访问请求参数
OAPageContext可以通过调用getParameter(String name)来读取请求的参数值。在GET方式下,参数来自于URL地址串中的参数,而在POST方式下,参数名称来自于FORM中的域名,参数值来自于域值。
提示:在你页面上定义过的独立web bean(如button、fields等),通过getParameter(String name)返回响应的唯一ID值。比如你可以通过以下的控制器代码来捕获按钮的点击:
processFormRequest(OAPageContext pageContext,OAWebBean webBean)
{
If(pageContext.getParameter(“Go”) != null)
{
//The user pressed the “Go” button,do something...
}
}
访问 Root AM
OAPageContext保持了对rootAM(该AM提供对VO和事务的访问)的引用。如果需要访问AM的时候,来找OAPageContext吧 J
processFormRequest(OAPageContext pageContext,OAWebBean webBean)
{
OAApplicationModule am = (OAApplicationModule)pageContext.getRootApplicationModule();
}
发出导航指令
使用该类上的方法来指示OA Framework执行一个JSP的服务器端重置(forward)或者客户端重定向(redirect)操作。示例代码如下(细节部分见后):
processFormRequest(OAPageContext pageContext,OAWebBean webBean)
{
if(pageContext.getParameter(“CreateButton”)!=null)
{
//用户点击“新建供应商”按钮,执行一个JSP forward 到“新建供应商”页面
pageContext.setForwardURL(“OA.jsp?page=/oracle/apps/dem/employee/webui/EmpDetailsPG”,
null,
OAWebBeanConstants.KEEP_MENU_CONTEXT,
null,
null,
true,//Retain AM
OAWebBeanConstants.ADD_BREAD_CRUMB_YES,
//Show breadcrumbs
OAWebBeanConstants.IGNORE_MESSAGES);
}
}
访问应用上下文
类似模型(model)代码中的OADBTransaction,OAPageContext提供了对servlet会话级的Oracle应用的上下文信息,比如用户名、ID、当前职责等等。以下代码片断就是取用户名的例子:
processRequest(OAPageContext pageContext,OAWebBean webBean)
{
String userName = pageContext.getUserName();
}
附件:
|