AIM
MD.070A PPLICATION
E XTENSION T ECHNICAL D ESIGN
Helpdesk公告用户显示开发实例
Author: Peng.Yang
Creation Date: January 28, 2010
Last Updated: June 26, 2010
Document Ref:
Version: 1.0
Approvals:
_____
No.
Copy
Document Control
Change Record
Date Author Version Change Reference
28-Jan-2010 Peng.Yang 1.0 No Previous Document
Reviewers
Name Position
Distribution
Copy No. Name Location
1Library Master Project Library
Manager
2Project
3
4
Note To Holders:
If you receive an electronic copy of this document and print it out, please write your
name on the equivalent of the cover page, for document control purposes.
If you receive a hard copy of this document, please write your name on the front
cover, for document control purposes.
ii / 26
Contents
Document Control .................................................................................................................. i i 开发介绍 .. (1)
概述 (1)
完成的目标 (2)
步骤1:创建页面模型组件 (3)
步骤2:创建初始页 (4)
步骤3:自动客户化查询 (6)
步骤4:创建公告明细页面 UI (10)
步骤5:实现试图对象查询 (14)
步骤6:实现下钻到 NotifyShowDetailsPG (15)
步骤7:程序部署到EBS应用服务器中 (18)
步骤8:OAF控制器中的日志查看 (21)
步骤9:如何找到页面所对应的源文件 (21)
Open and Closed Issues for this Deliverable (23)
Open Issues (23)
Closed Issues (23)
iii / 26
开发介绍
概述
本文当讲述了如何实现OAF公告页面显示功能。
1 / 26
完成的目标
完成此开发之后,需要掌握如下的课题:
z OAF开发环境搭建了解
z OAF框架的了解
z OAF开发规范遵循
z OAF页面的基本布局
z通过编写必要的程序实现页面直接的 JSP Forward
z启用 "Warn About Changes" 功能,帮助用户减少不必要的数据丢失工作
z实现实体对象、实体属性和行级的业务逻辑(包括抛出属性和行级的验证异常)
z在业务逻辑中使用视图对象验证和应用模块验证
z在基于实体对象的视图对象中添加一个新的行
z处理按钮的动作
z确保应用程序在使用浏览器中的 Back 按钮是安全的
2 / 26
步骤1:创建页面模型组件
任务1.1: 创建视图对象(VO) NotifyShowVO,主要用于直接查询,不对数据进行任何操作
为了满足搜索结果表的要求,需要创建一个包括了搜索所需要的所有属性的汇总视图。
z从导航栏中选择oracle.apps.cux.helpdesk.server BC4J 包,右键从上下文菜单中选择New View Object...进入New View Object...向导
z跳过欢迎页
z在Name页中,指定连接视图对象的Name为NotifyShowVO,并保证 Package 的值为oracle.apps.cux.helpdesk.server
z下一步直到第5步,直接输入以下 SQL 语句
SELECT ROWNUM line_no,
NOTIFY_ID,
SUBJECT,
NOTICE_DATE,
Content,
NOTICE_USER_TYPE_DESC,
NOTICE_USER_DESC
FROM (
SELECT NotifyEO.NOTIFY_ID,
NotifyEO.SUBJECT,
NotifyEO.NOTICE_DATE,
NotifyEO.Content,
fl.MEANING NOTICE_USER_TYPE_DESC, decode(NotifyEO.NOTICE_USER_TYPE,'C',
cux_helpdesk_oaf_pkg.get_segment_desc(NotifyEO.NOTICE_USER_CODE,'segment1'),
'D',cux_helpdesk_oaf_pkg.get_segment_desc(NotifyEO.NOTICE_USER_CODE,'segment2'),
cux_helpdesk_oaf_pkg.get_segment_desc(NotifyEO.NOTICE_USER_CODE,'segment3')
) NOTICE_USER_DESC
FROM CUX_HELPDESK_NOTIFICATIONS NotifyEO,
Fnd_Lookups fl
WHERE NotifyEO.notice_user_type = fl.LOOKUP_CODE
AND fl.lookup_type = 'CUX_NOTICE_USER_TYPE'
AND trunc(nvl(NotifyEO.End_Date,SYSDATE+1)) >= trunc(SYSDATE+1)
3 / 26
ORDER BY trunc(NotifyEO.NOTICE_DATE) DESC,NotifyEO.Exigence_Type DESC,NotifyEO.Notify_Id DESC
)
z select the Generate Java File for View Object Class: NotifyShowVOImpl and View Row Class:
NotifyShowVORowImpl
z完成修改后选择 Test 按钮进行验证测试
z选择下一步按钮两次
z完成
任务1.2: 添加视图对象到 UI 应用模块根节点
实体对象只能够在包含它的应用模块的上下文中使用,在你页面中使用NotifyVO之前必须先将它加入到页面的 UI 应用模块根节点
中。
z从导航栏中选择NotifyAM,右键从上下文菜单中选择Edit NotifyAM...进入DATA Module...向导
z选择Data Model页,将Available View Objects列表中的NotifyShowVO实体对象移到两次到Data Model列表中确定完成,即Data Model中分别为NotifyShowVO1 和 NotifyShowVO2
步骤2:创建初始页
此步骤的任务是创建一个页标题为Notify的页面,并带有提示文本信息。
任务2.1: 创建 NotifyShowPG页
在包oracle.apps.cux.helpdesk.webui中创建一个新的 UI 页
z从导航栏中选择CUX_Helpdesk_OAProject.jpr项目,右键从上下文菜单中选择New…
4 / 26
z在New窗口中,展开Web Tier层次选择OA Components
z在OA Components Items列表中选择Page
z选择确定继续
z在New Page对话框中,输入Name的值为NotifyShowPG;Package的值为oracle.apps.cux.helpdesk.webui(此目录存页面)
z选择确定创建页面
任务2.2: 更改页面布局(Top-Level)区域
z在结构窗口中选择NotifyShowPG中的region1
z设置和验证以下的属性值
属性值
ID PageLayoutRN
Region Style pageLayout
Form True
AM Definition oracle.apps.cux.helpdesk.server.NotifyAM
Window Title 公告显示页面
Title 公告显示页面
AutoFooter True
任务2.3: 运行页面进行测试
5 / 26
步骤3:自动客户化查询
任务3.1: 添加查询结果表到 PageLayoutRN
z在结构窗口中选择PageLayoutRN区域,右键从上下文菜单中选择New > Region Using Wizard
z跳过欢迎页
z在BC4J Objects页中,选择NotifyAM (oracle.apps.cux.helpdesk.server.NotifyAM),然后在Available View Objects列表中选择视图对象实例NotifyShowVO1
z选择下一步按钮
z在Region Properties页中设置Region ID的值为ResultsTable;Region Style的值为table
z选择下一步按钮
z在View Attributes页中,选择Available View Attributes列表中的下列属性到Selected View Attributes列表中
LineNo
NotifyId
6 / 26
Subject
NoticeDate
NoticeUserTypeDesc
NoticeUserDesc
z选择下一步按钮
z在 Region Items 页中,设置如下的属性值:
ID Prompt Style Data Type Attribute Set
LineNo 行号messageStyledText NUMBER
NotifyId 发布标识formValue NUMBER
Subject 发布主题messageStyledText VARCHAR2
NoticeDate 发布日期messageStyledText DATE
NoticeUserTypeDesc 发布者类型messageStyledText VARCHAR2
NoticeUserDesc 发布者messageStyledText VARCHAR2
z选择完成按钮结束
任务3.2: 设置和验证查询结果表区域属性值
z在结构窗口中选择Result Table区域,设置和确认如下的属性值:
属性值
ID ResultsTable
Region Style table
AM Definition 必须为空,如果有值必须删除
Additional Text 公告显示表格
Rendered True
Records Displayed 20
Width 100%
7 / 26
这里设置ResultsTable下的LineNo、Subject、NoticeDate、NoticeUserTypeDesc、NoticeUserDesc的Sort Allowed都设成yes 任务3.3: 在NotifyShowVOImpl中增加自动查询代码
import oracle.apps.fnd.framework.OAException;
import oracle.jbo.domain.Number;
…
public void NotifyQuery(String NotifyId)
{
Number Notify_Id = null;
if (NotifyId != null && (!("".equals(NotifyId.trim()))) )
{
try
{
Notify_Id = new Number(NotifyId);
}
catch(Exception e)
{
throw new OAException("CUX", "CUX_NOTIFY_INVALID_NOTIFY_ID");
}
setWhereClause("NOTIFY_ID = :1");
setWhereClauseParams(null); //Always reset
setWhereClauseParam(0, Notify_Id);
}
else
{
setWhereClause("1 = 1");
setWhereClauseParams(null); //Always reset
}
executeQuery();
}
8 / 26
任务3.4: 在NotifyAMImpl中增加如下代码
public void NotifyShow()
{
String NotifyId = null;
NotifyShowVOImpl vo = getNotifyShowVO1();
vo.NotifyQuery(NotifyId);
} // end NotifyShow()
任务3.5: 为明细页创建控制器
z在结构窗口中选择NotifyShowPG中的ResultsTable,右键从上下文菜单中选择Set New Controller ...
z在New Controller对话框中,指定Package Name的值为oracle.apps.cux.helpdesk.webui;Class Name的值为NotifyShowCO
z选择确定按钮完成控制器创建
任务3.6: 增加控制器逻辑以在页面被请求的时候初始化公告自动查询
为了使NotifyShowPG页面在被请求的时候能够自动的查询NotifyShowVO试图对象下的数据,需要添加如下的代码到NotifyShowCO.processRequest()方法中。
import oracle.apps.fnd.framework.OAApplicationModule;
...
public void processRequest(OAPageContext pageContext, OAWebBean webBean)
{
super.processRequest(pageContext, webBean);
String showdetailflag = pageContext.getParameter("showdetailflag");
if (showdetailflag == null)
{
OAApplicationModule am = pageContext.getApplicationModule(webBean);
am.invokeMethod("NotifyShow", null);
9 / 26
}
}
任务3.7: 测试页面
步骤4:创建公告明细页面 UI
本步骤创建一个简单的只读页,页中的公告明细信息在用户点击公告主题的时候系统自动查询得出。
任务4.1: 创建页
在oracle.apps.cux.helpdesk.webui包中创建一个新的 UI 页面
z从导航栏中选择CUX_Helpdesk_OAProject.jpr项目,右键从上下文菜单中选择New...
z在New窗口中,展开Web Tier层次选择OA Components
z在 OA Components Items列表中选择Page
z选择确定继续
z在New Page对话框中,输入Name的值为NotifyShowDetailsPG;Package的值为oracle.apps.cux.helpdesk.webui
z选择确定创建页面
10 / 26
任务4.2: 更改 pageLayout 区域
z在结构窗口中选择NotifyShowDetailsPG中的region1
z设置和验证以下的属性值
属性值
ID PageLayoutRN
Region Style pageLayout
AM Definition oracle.apps.cux.helpdesk.server.NotifyAM
Window Title 公告查询明晰
Title 公告查询明晰
AutoFooter True
任务4.3: 创建主内容区域
为了使项目显示出合适的缩进,在PageLayoutRN区域中添加defaultSingleColumn区域,由于此区域中所有的项目都和NotifyShowVO2视图实例相对应,使用区域向导快速创建。
z在结构窗口中选择PageLayoutRN区域,右键从上下文菜单中选择New > Region Using Wizard
z在BC4J Objects页中选择NotifyAM (oracle.apps.cux.helpdesk.server.NotifyAM) ,并从Available View Objects列表中选择NotifyShowVO2视图对象实例
z选择下一步到Region Properties页,设置Region ID的值为MainRN;Region Style的值为defaultSingleColumn
z下一步到View Attributes页中,从Available View Attributes列表中选择如下属性列到Selected View Attributes列表中LineNo
NotifyId
Subject
NoticeDate
Content
NoticeUserTypeDesc
NoticeUserDesc
11 / 26
z选择下一步到Region Items页,设置如下的项目属性:
ID Prompt Style Data Type Attribute Set
LineNo 行号messageStyledText NUMBER
NotifyId 发布标识formValue NUMBER
Subject 发布主题messageStyledText VARCHAR2
NoticeDate 发布日期messageStyledText DATE
Content 发布内容messageTextInput VARCHAR2 NoticeUserTypeDesc 发布者类型messageStyledText VARCHAR2
NoticeUserDesc 发布者messageStyledText VARCHAR2
z确定创建数据表
z在结构窗口中选择MainRN,设置Hide Header属性值为True;Text属性值留空
任务4.4: 设置 MainRN 区域的属性
打开MainRN区域下的项目进行如下的属性值设置:
LineNo
属性值
CSS Class OraDataText
Subject
属性值
CSS Class OraDataText
NoticeDate
12 / 26
属性值
CSS Class OraDataText
Content
属性值
CSS Class OraDataText
Read Only True
Height 100
Length 15
NoticeUserTypeDesc
属性值
CSS Class OraDataText
NoticeUserDesc
属性值
CSS Class OraDataText
任务4.5: 增加一个 ”Return to Notify Show” 链接
在NotifyShowDetailsPG页面的底部增加一个”Return to Notify Show”链接
z在结构窗口中选择PageLayoutRN,右键选择New > returnNavigation
z选择自动创建在pageComponents文件夹下的returnNavigation link项目,设置如下的属性值:
13 / 26
属性值
ID ReturnLink
Destination URI OA.jsp?page=/oracle/apps/cux/helpdesk/webui/NotifyShowPG&showdetailflag=Y&retainAM=Y
Text 返回公告显示页面
步骤5:实现试图对象查询
任务5.1: 添加 initShowDetails() 方法到 NotifyAMImpl 类中
后面将会从 UI 控制器调用此方法(OA Framework的编码标准:直接与在控制器中的OAApplicationModule接口进行交互,不要
直接和视图对象进行交互),此方法委派你在NotifyShowVOImpl类中创建的NotifyQuery方法
public void initShowDetails(String NotifyId)
{
NotifyShowVOImpl vo = getNotifyShowVO2();
if (vo == null)
{
MessageToken[] errTokens = { new MessageToken("OBJECT_NAME", "NotifyShowVO2")};
throw new OAException("AK", "FWK_TBX_OBJECT_NOT_FOUND", errTokens);
}
vo.NotifyQuery(NotifyId);
} // end initShowDetails()
任务5.2: 保存并编译
14 / 26
步骤6:实现下钻到 NotifyShowDetailsPG
本步骤中,在上一课中学习的查询结果表中 Subject 列上面添加一个链接,链接导航到一个新的明细页。
任务6.1: 配置 Subject 项目成为一个链接
当用户选择公告主题链接时,显示一个新的明细页。这是属于一个 GET 请求,我们需要做:
z添加NotifySubject参数到 URI,这些参数的值来源于NotifyShowPG的NotifyShowVO1中的Subject
z意味着在NotifyShowDetailsPG打开使用过程中,NotifyShowPG所属的应用模块实例必须保持原有的状态,保证这些页面可以共享一个根应用模块
在NotifyShowPG下选择ResultsTable区域中的Subject项目,设置 Destination URI 的属性值为:
OA.jsp?page=/oracle/apps/cux/helpdesk/webui/NotifyShowDetailsPG&NotifyId={@NotifyId}&NotifySubject={@Subject}&re
tainAM=Y&addBreadCrumb=Y
在运行的时候,OA Framework 自动替换在两个大括号之间的视图属性的具体值。例如:&NotifyId={@NotifyId}变为&NotifyId
=1234
任务6.2: 为明细页创建控制器
z在结构窗口中选择NotifyShowDetailsPG中的PageLayoutRN,右键从上下文菜单中选择Set New Controller ...
z在New Controller对话框中,指定Package Name的值为oracle.apps.cux.helpdesk.webui;Class Name的值为
NotifyShowDetailsCO
z选择确定按钮完成控制器创建
任务6.3: 增加控制器逻辑以在页面被请求的时候初始化公告查询
为了使NotifyShowDetailsPG页面在被请求的时候能够自动的查询NotifyShowVO试图对象下的数据,需要添加如下的代码到
NotifyShowDetailsCO.processRequest()方法中。
15 / 26
其中引用了NotifyId参数的值
import java.io.Serializable;
import oracle.apps.fnd.framework.OAApplicationModule;
...
public void processRequest(OAPageContext pageContext, OAWebBean webBean)
{
// Always call this first.
super.processRequest(pageContext, webBean);
// Get the NotifyId parameter from the URL
String NotifyId = pageContext.getParameter("NotifyId");
// Now we want to initialize the query for our single Notify
// with all of its details.
OAApplicationModule am = pageContext.getApplicationModule(webBean);
Serializable[] parameters = { NotifyId };
am.invokeMethod("initShowDetails", parameters);
}
任务6.4: 通过编程来实现页标题文本的动态显示
按照 BLAF UI Guidelines on Header Components 准则,需要在明细页的标题上显示当前被选择的公告主题,为此需要覆盖上一步NotifyDetailsCO.processRequest() 的方法,以下添加红色部分内容或直接覆盖processRequest方法
假设 CUX_NOTIFY_HEADER_TEXT 消息已经在系统中创建,其消息定义的内容为公告主题: &NOTIFY_SUBJECT
import https://www.doczj.com/doc/b29383582.html,mon.MessageToken;
import https://www.doczj.com/doc/b29383582.html,yout.OAPageLayoutBean;
...
public void processRequest(OAPageContext pageContext, OAWebBean webBean)
{
// Always call this first.
super.processRequest(pageContext, webBean);
// Get the NotifyId parameter from the URL
String NotifyId = pageContext.getParameter("NotifyId");
// Code from Step 4.3 ommitted for clarity... The following should be
// added after the code you added above.
16 / 26
// Get the NotifySubject parameter from the URL
String NotifySubject = pageContext.getParameter("NotifySubject");
// Always use a translated value from Message Dictionary when setting
// strings in your controllers.
// Instantiate an array of message tokens and set the value for the
// NOTIFY_SUBJECT token.
MessageToken[] tokens = { new MessageToken("NOTIFY_SUBJECT", NotifySubject)};
// Now, get the translated message text including the token value.
String pageHeaderText =
pageContext.getMessage("CUX", "CUX_NOTIFY_HEADER_TEXT", tokens);
// Set the Notify-specific page title (which also appears in
// the breadcrumbs). Note that we know this controller is
// associated wit the pageLayout region, which is why we cast the
// webBean to an OAPageLayoutBean before calling setTitle.
((OAPageLayoutBean)webBean).setTitle(pageHeaderText);
// Now we want to initialize the query for our single Notify
// with all of its details.
OAApplicationModule am = pageContext.getApplicationModule(webBean);
Serializable[] parameters = { NotifyId };
am.invokeMethod("initShowDetails", parameters);
}
任务6.5: 保存测试
17 / 26