2009年4月16日星期四

在Region之间传递Event


概述

本文主要介绍如何在ADF应用中实现不同Region之间的event的传递。

下面以RegionA和RegionB为例,详细说明如何实现在Region之间传递event。

需求:在RegionA中点击导航栏中的任意一按钮时,在RegionB中触发相同事件。


实现

1、新建ADF应用,并根据需要创建基于Employees和Departments两个表的BC(EO/VO/AM)。

2、在ViewController项目中创建两个Bounded-Task-Flow with Fragments,这里名字分别为RegionA-task-flow和RegionB-task-flow。

3、从“Component Pallete”中分别拖“View”到刚创建成功的两个Task-Flow中,名字分别为RegionA和RegionB,双击根据向导生成两个.jsff的fragments,生成后的名字应分别为RegionA.jsff和RegionB.jsff。



4、打开RegionA.jsff,从“Data Controls”中拖动EmployeesView1到该fragment,根据提示生成form,并带有导航按钮。

5、同样的,打开RegionB.jsff,从“Data Controls”中拖动DepartmentsView1到该fragment,根据提示生成带有导航按钮的form。

6、新建.jspx页面,这里命名为main.jspx,使用“Panel Splitter”Layout进行布局,将页面分割成为左右两部分。分别将RegionA-task-flow和RegionB-task-flow拖到两部分中,生成后的页面如图所示: 


7、双击打开RegionA.jsff的PageDef文件,为其导航按钮添加event,查看“Structure”面板,以First按钮为例:在First按钮上点击右键,在“Insert inside First”中选择events,继续在events中点击右键,在“insert inside events”中选择event,命名为FirstEvent,为其他按钮添加同样的操作。进而对RegionB.jsff的PageDef中的导航按钮也添加同样的操作,完成后保存。


8、打开main.jspx页面,在“Structure”面板中的PageDef上点击右键,选择“Edit Event Map”,如图设置event的mapping关系,将所有的event都进行设置。


9、保存以上设置,运行main.jspx页面。
最终运行结果:


详细代码请查看:howtopasseventbetweenregions.rar

2009年4月15日星期三

监听dialog的取消按钮事件

function openPopup(evt){

var dialog = AdfPage.PAGE.findComponent('dlg2');

dialog.HandleEvent = function(event) {

if (event.getType() == AdfDialogEvent.EVENT_TYPE) {

event.propagatesToServer = function(){

return true;

}

}

}

AdfUIDialog.superclass.HandleEvent.call(this, event);

}

Manage Bean中向客户端写js

private void addScript(String script) {

FacesContext fc = FacesContext.getCurrentInstance();

ExtendedRenderKitService erks =

Service.getRenderKitService(fc, ExtendedRenderKitService.class);

erks.addScript(fc, script);

}

Oracle 数据库打开时出现ORA-16038

Oracle
10g默认启用日志归档,db_recovery_file默认为2GB,不清理日志一般经过一段时间的使用闪回区便被占满,造成数据库无法归档,无法启动的错误。一般ORA-16038、ORA-19809、ORA-00312这三个错误会同时出现。

解决方法通常包括:

1. 提高参数db_recovery_file_dest_size

  • 使用sqlplus /nolog登录,SQL> connect /as sysdba;

  • SQL> startup mount;
  • SQL> ALTER SYSTEM SET
    DB_RECOVERY_FILE_DEST_SIZE=4G SCOPE=BOTH;

  • SQL> alter database open;

2. 关闭闪回功能(如果你确实不再需要该功能)

  • 使用sqlplus /nolog登录,connect /as sysdba;
  • SQL> alter system archive log
    stop;

3. 删除无用的归档文件并更新rman记录

  • 查看对应initxxx.ora,找不到的话可以在$ORACLE_HOME下搜索,找对应SID的即可

  • 在initxxx.ora中找到# File
    Configuration部分,可以看到db_recovery_file_dest=XXXXX,即为数据闪回区的日志文件记录位置。

  • 进入闪回区目录,查看对应SID下的archivelog文件夹内内容,删除旧的日志归档文件

  • 使用RMAN命令,RMAN> connect target /
  • 使用命令RMAN> crosscheck archivelog
    all,该操作将标明哪些归档文件已被删除

  • 使用命令RMAN> delete expired archivelog
    all,该命令将删除rman controlfile中相应的记录

2009年4月14日星期二

使用Google文档发布日志到Blogger

最近工作之余在研究Google离线应用,而Google Docs,即Google文档基于Gears技术实现了离线撰写文档的功能,研究了下,发现可以使用Google文档发布文章到自己的博客中,由于我的博客就是Blogger,因此实现起来非常简单,以下是一些步骤:
1、安装Google Gears
2、打开Google文档 ,撰写离线日志。
3、日志撰写完成后,等方便上网时同步到自己的Google文档。
4、打开文档,选择“共享”中的“以网页形式发布”。

5、选择“张贴到博客”,根据向导完成简单的配置。
在完成了以上步骤,就可以离线编写日志,然后再联网后同步到Google文档中,再非常方便地发布到博客中。

2009年4月7日星期二

Jdeveloper11g Update2发布

Jdeveloper11g Update2终于发布了,相比前一个版本来说,修复了很多Bug
期待Jdeveloper越来越好。

2009年3月30日星期一

在Task-Flow中实现页面间传值

概述

本文主要说明ADF中如何实现在Task-Flow中的页面之间传值。

在本示例中将创建两个页面,分别为PageAPageB,并完成PageAPageB中的传值。


实现

思路:

步骤一:使用set action listenerset property listener,设置fromtotypeset property listener,将当前页面的值设置到pageFlowScope中,例如设置在#{pageFlowScope.var1}

当然,在task-flow中传值时,可以在actionlistener里面设置值到pageFlowScope中。

步骤二:在页面中取值时,如果需要在一进入页面时就将该值取到并显示在页面中,可以将取值的相关代码写在页面对应的Backing Scope ManagedBean的构造方法中。

1、 创建应用,并基于EmployeesRegions两张表创建EO/VO,并将各自实例添加到AM中。

2、 创建Bounded Task-Flow,拖两个View到该Task-FlowId分别为PageAPageB,完成之间的导航设置。分别双击两个页面,用向导创建出PageA.jspxPageB.jspx

3、 PageA中,右键点击导航到PageB的按钮,在其中添加Set Action Listener,如图完成相关值的传递。

注:此时#{pageFlowScope.var1}会被标红,忽略此处。

4、打开PageB对应的Backing Scope ManagedBean,在其构造方法中添加如下代码:

RequestContext rc = RequestContext.getCurrentInstance();

String value = (String)rc.getPageFlowScope().get("var");

List list = ADFUtils.getBindingContainer().getAttributeBindings();

for (int i = 0; i <>

AttributeBinding abb = (AttributeBinding)list.get(i);

if (abb.getName().equals("FirstName")) {

abb.setInputValue(value);

}

}

rc.getPageFlowScope().clear();

5、保存以上更改和设置,运行该Task-Flow,查看结果:



相关代码请查看:howtopassvaluebetweenpages.rar