2009年2月17日星期二

Partial Page Rendering

概述

本文主要描述在ADF开发中如何实现Partial Page Rendering

场景:

AJAX技术已经被广泛应用在Web开发中,通过使用AJAX技术实现局部刷新,从而避免整个页面的刷新,在ADF Faces中,这种应用又被称为Partial Page Rendering(后称PPR,详细说明请参考第7章,P129 b31973.pdf)。PPR在现实应用中具有重要意义,例如:字段的连动,LOV的相关性等。

在这里,将通过一个小工资平均值计算的例子简单介绍PPR的实现和设置步骤。

需求描述:

1、显示所有现有职位内容。

2、根据现实出的现有职位的最大薪水和最低薪水计算平均薪水并显示在页面上。

3、实现前后记录导航,并要求动态计算当前职位的平均薪水。

实现

1、基于Jobs表创建EO/VO/AM

2、为该VO添加非数据库项AverageSalary,为实现实时计算更新,设置该属性的Updatable属性为Always。由于该项是需要求MaxSalaryMinSalary的平均值,在这里通过EL表达式完成该计算,因此,选择Value TypeExpressionV

alue(MaxSalary + MinSalary) / 2

3、在完成了上述步骤后,就可以创建页

面了,新建页面,名为Main.jspx

4、将Data ControlsVO拖到页面中,选择生成Form,在向导中勾选生成导航按钮选项。

5、设置页面上MaxSalaryMinSalary项的AutoSubmit属性为true。并设置AverageSalary项的Partial Trigger属性为MaxSalaryMinSalaryid

6、保存并运行。

最终运行结果:

在改变MinSalaryMaxSalary或使用导航按钮导航到其他记录时,AverageSalary都将重新计算。

相关代码请查看:

howtoppr.rar

2009年2月6日星期五

在ADF中计算页面字段值

概述

本文主要描述在ADF开发中如何根据某些某些字段值计算页面某一其他字段数值。

需求:

hr数据库为例,实现以下需求:

1、实现Jobs表和JobHistory表的Master-Detail关系。

2、在Master部分中,实现字段MaxSalaryMinSalary的汇总。

3Detail部分以Table形式展现,并在Table的最后一列计算该条记录中EmployeeIdDepartmentId的和。

4、在Master部分中,汇总步骤3中所计算出的DetailTable最后一列值。

下面我们创建howtocalculatevalue应用实现以上需求。

实现

1、创建新应用,名为howtocalculatevalue,并基于JobsJobHistory表创建EOVO并将VO及自动生成的ViewLink添加到AM中。创建完成后Model项目应如图所示:

2、由于将在Master部分将有两个汇总字段,因此,在这里为JobsVO添加两个非数据库项,分别为SumSalarySumTestValue,分别用于计算Master部分Salary的汇总以及Detail部分最后一列值的汇总。并修改这两个字段的Updatable属性为Always。并为JobHistoryVO添加一个非数据库项,用于计算每行EmployeeIdDepartmentId的和,也修改。

3、分别为JobsVOJobHistoryVO生成对应的Java类。

4、打开JobHistoryVORowImpl.java,修改getTestValue方法如下:

public Number getTestValue() {

Number value = this.getEmployeeId().add(this.getDepartmentId());

return value;

}

5、打开JobsVORowImpl.java,分别修改getSalary方法和getSumTestValue方法:

public Number getSumSalary() {

List l = new ArrayList();

l.add(this.getMaxSalary());

l.add(this.getMinSalary());

for (int i = 0; i <>

if (l.get(i) == null) {

l.set(i, new Number(0));

}

}

Number value = new Number();

for (int i = 1; i <>

value = l.get(i).add(l.get(i - 1));

}

return value;

}

public Number getSumTestValue() {

RowIterator ri = this.getJobHistoryVO();

Number value = new Number(0);

while (ri.hasNext()) {

value = value.add((Number)ri.next().getAttribute("TestValue"));

}

return value;

}

6、新建页面,合理设置页面内显示属性的PPR,具体为:

Auto Submit:MinSalary, MaxSalary,EmployeeId,DepartmentId,TestValue

Partial Trigger:SumSalary(MinSalary,MaxSalary)

TestValue(EmployeeId,DepartmentId)

SumTestValue(TestValue)

注:括号内表示为括号前字段的PartialTrigger内应该设置的内容。

7、保存,运行页面。

最终的运行结果:

相关代码请查看:

howtocalculatevalue.rar


在ADF中使用Sequence

本文主要介绍如何在ADF中使用Sequence,具体步骤如下:

1、 选择EO中需要使用Sequence的属性,双击该属性

2、 Edit Attribute中选择Custom Properties选项

3、 新建Custom PropertiesNameSequenceNameValue为数据库中Sequence的名字,完成后单击Add

4、 选择EOImpl类,重写create方法,代码如下:

/**

* Add attribute defaulting logic in this method.

* @param attributeList list of attribute names/values to initialize the row

*/

protected void create(AttributeList attributeList) {

super.create(attributeList);

for (AttributeDef def : getEntityDef().getAttributeDefs()) {

String sequenceName = (String)def.getProperty("SequenceName");

if (sequenceName != null) {

SequenceImpl s =

new SequenceImpl(sequenceName, getDBTransaction());

setAttribute(def.getIndex(), s.getSequenceNumber());

}

}

}

2009年2月3日星期二

在不知道Map中key的情况下读取Map

Map map=new HashMap();
Iterator it=map.entrySet().iterator();
while(it.hasNext()){
Map.Entry tt = (Map.Entry)it.next();
System.out.println(tt.getKey());
System.out.println(tt.getValue());
}

在ADF中使用甘特图

概述

本文主要描述在ADF开发中如何使用甘特图组件(Gantt Chart)。

场景:

ADF开发过程中,有时会根据需要使用到甘特图,而在ADF中,甘特图组件共有三种:

1Project Gantt chart

2Resource Utilization Gantt chart

3Scheduling Gantt chart

这三种甘特图应用于不同的场景,详细说明可以参考文档:P585 b31973.pdf,在这里,我们以第一种,即Project Gantt chart组件为例说明甘特图组件的使用方法。

实现

1、创建新应用,并基于Job_Hitory表创建EOVO,并创建或添加到对应AM中。使用业务组件浏览器测试成功。

2、在ViewController项目中新建页面,并拖动Data Controls中对应数据源拖动到页面中,选择创建类型为“Gantts-Project”。

3、在创建向导中设置Task IdEmployeeIdStart TimeStartDateEnd TimeEndDate,点击OK完成。


4、在Structure面板中选择刚才添加的甘特图,编辑其属性:在其属性面板的Common项中分别设置StartTimeEndTime1990-02-022001-05-03,即甘特图中的起始时间和终止时间分别为1990-02-022001-05-03

注:这里,在设置StartTimeEndTime时由于时间和当前时间性相比跨度较大,因此若速度比较慢,IDE

“假死”状态,均属正常。

5、保存应用,运行该页面。

最终运行结果:




相关代码请查看:

howtoganttchart.rar

暂时解决Perm Space异常

概述

本文主要描述在ADF开发中如何暂时解决Perm Space异常。

场景:

J2EE应用开发过程中,相信很多开发人员都遇到过Perm SpaceOut of Memory异常,在使用Jdeveloper 11gWeblogic进行ADF开发时,也遇到了该问题,该问题的原因是由于SUN JVM把内存分了不同的区,其中一个就是permenter区用来存放用得非常多的类和类描述。本来SUN设计的时候认为这个区域在JVM启动的时候就固定了,但其没有想到现在动态会用得这么广泛。而且这个区域有特殊的垃圾收回机制,现在的问题是动态加载类到这个区域后,却无法回收。

解决方法:

1、不使用SUNJDK,而改用JRokit

2、适当加大Perm Space

3、其他

这里,我们通过配置文件的修改,适度增大Perm Space,以避免该异常的发生。

实现

1、找到Weblogic启动脚本。如果不知道该脚本的存放路径,可以在Jdeveloper 11g中运行某一应用,在控制台的第一行中会打印出该路径。

E:\Hand\Oracle\Middleware\jdeveloper\jdev\system11.1.1.0.31.51.88\

DefaultDomain\bin\startWebLogic.cmd

[waiting for the server to complete its initialization...]

.

.

JAVA Memory arguments: -Xms512m -Xmx512m -XX:CompileThreshold=8000 -XX:PermSize=96m -XX:MaxPermSize=256m.

WLS Start Mode=Development

2、根据步骤1中的路径找到startWeblogic.cmd文件,使用文本编辑器打开,而在startWeblogic.cmd中是通过调用setDomainEnv.cmd来设置的这些参数,因此,需要继续设置setDomainEnv.cmd

3、修改该文件中的如下内容:

set MEM_ARGS=-Xms512m -Xmx512m

set MEM_PERM_SIZE=-XX:PermSize=96m

set MEM_MAX_PERM_SIZE=-XX:MaxPermSize=256m

4、保存该文件,重新启动服务器

2009年1月29日星期四

理解ADF ManagedBean Scope

概述

本文主要说明ADFManagedBean中的不同Scope

由于ADF Controller是在JSF的基础上扩展而来的,因此,在ADF中,在包含了JSF的三种Scope的基础上,又扩展出了另外三种Scope,使ADF Controller在实际应用中更为灵活和方便。

JSF标准Scope

Applicati onScope

sessionScope

requestScope

ADF Controller扩展Scope

pageFlowScope

backingBeanScope

viewScope

下面将针对每种Scope进行详细说明,以作用域由大到小排列。


详细说明

1、applicationScope

就从字面意思就可以看出,applicationScope是作用范围最广的,在作用于整个应用的运行周期内。通常情况下,applicationScope中的参数等都是在应用启动(web server启动)时即被初始化,因此,一般对于独立于特定的职责和角色的,且需要在整个应用的周期内都需要的资源会定义在applicationScopeManagedBean中。

2、sessionScope

仅次于applicationScope的是sessionScopesessionScope作用于从用户登录开始到用户主动结束该session,一般来说,都会为session设置超时时间,若超过服务器设置的超时时间的话,则该session被自动释放。在实际的应用中,经常会将类似于用户信息,预置文件信息或授权信息等设置到session中。

3、requestScope

requestScope的作用周期是在一次request之内,只要是在同一个request内,即使是在不同的页面也可以访问到作用在requestScope的内容。

4、pageFlowScope

ADF中引入了Task-Flow的概念, pageFlowScope作用于同一个Task Flow中,例:分别有A,B,C三个页面,同属于一个Task FlowD页面不属于该Task Flow,且A,B,C三个页面可以通过定义的action相互进行导航,同时也可以从这三个页面导航到D页面,建立pageFlowScopeManaged Bean此时,A,B,C三个页面可以同时访问到该Managed Bean中的属性。

5、viewScope

viewScope是指view id发生更改之前都可用,即作用于同一页面内,例如,在不同页面之间跳转时,viewScopeManaged Bean中的数据都会丢失。

6、backingBeanScope

backingBeanScope多用于page fragmentsdeclarative components,由于同一个页面中可能会拥有多个page fragmentsdeclarative components,因此,为了避免相互之间数据冲突,可以考虑使用backingBeanScopeManaged Bean

7、none

none的意思是说,即使在同一个页面,也不能访问到彼此none scopeManaged Bean中的属性。

下面是上述六种Scope的生命周期示意图: