2009年05月22日

EAM系统实施项目中的沟通管理

作者:贾毓

 

摘要:EAM

EAMEnterprise Assets Management)--企业资产和设备维护管理,是一种先进的管理思想。EAM的前身则是CMMSComputerized Maintenance Management System,计算机化的设备维护管理系统),只是在管理的广度和深度上更进了一步,在IT的应用上更加先进。它要求企业把资产和设备进行全面的管理,从资产属性到使用属性、从采购、使用到维护,进行统一的标准的跟踪控制。以提高资产和设备的使用寿命及使用效率,降低企业的管理和维护成本,保障企业的经营能够正常顺利地进行。

 

项目团队之间的相互交流在软件项目开发/实施过程中是十分重要和必要的,没有及时地和完全的沟通,项目组中的成员就不知道其他的成员在做什么,他们就不能互相帮助他们也不可能知道工作的进展情况。没有完全的和坦诚的交流,没有任何一个小组可以作为一个整体工作,这就是说这个小组配合不默契。

 

下面我就在大型软件项目实施过程中如何进行沟通谈谈自己的一点看法。

 

沟通管理的三个要素是透明性、聆听和协商。

 

透明性

透明性是小组的一种风格,每件事情都需要开诚布公和坦率吗?是否有隐藏的议程和任务,出色的小组知道将要发生什么事情,他们可以预见问题,并迅速进行调整,他们知道什么时候谁需要帮助。在配合默契的小组中,所有的成员都经常保持联系,每个人都知道工作的进展和将要做的事情。

在一个小型小组中,相互的交流通常是非正式的、简单的交流,当小组有6~8个成员或者有的成员与小组的工作地点不同时,小组就容易失去工作的一致性。所以没有坦率的交流,人们就会变得多疑、沮丧,进而失去对工作的热情和活力。

软件的开发/实施小组需要经常聚在一起讨论问题、解决问题、制定工作计划。事实上,工作效率高的小组通常是每周聚会一次,相互交流一下一周以来的工作进展情况。尽管经常性的聚会要花费很多时间,而且看起来不是那么有必要的,但是这正是一个项目小组配合默契所必需的。

 

聆听

往往在完成一个项目中,困难的不是项目中有什么跨越不了的技术难点,而是项目干系人之间的交流,我们在和客户沟通的时候我们可能还能耐心听客户讲述他的需求,这一点我们基本上都能做得到,但是当我们项目组内部进行沟通时,大家往往急于把自己的观点表达出来而增大声音的分贝,这样的最终结果很可能就是争吵不休,严重的可能还会出现项目组成员之间进行人身攻击的现象,这是千万要不得的。这时候我们需要什么?我们需要的是聆听,我曾经在一本关于沟通技巧的书中看到这样一句话,“优秀的沟通者应该是非常善于聆听的人,因为他明白只有学会聆听别人,当他阐述观点的时候,别人才会真正聆听他的发言”,的确,这句话明白地告诉我们一个道理,解决问题通常是从良好的聆听开始的。

全身心投入的聆听对于一个软件开发/实施小组是非常重要的,也是十分必要的。为了真正理解一个复杂的问题,完全理解讲演者所讲的内容是很必要的。尽管通过聆听来完全理解一个复杂的问题是很困难的,但是如果我们不去认真聆听的话,那问题只能还是问题,永远也解决不掉。

尽管全身心地聆听所花费的时间可能比想象的要长,但从长远的角度来讲,这是十分有效的。“曲解”是软件开发/实施过程中产生问题的主要原因,所以在软件项目中,聆听是绝对必要和有效的。

 

协商

对于在项目中出现的问题我们如何去解决?我们彼此明白对方需要什么,但是双方可能在某些问题上有分歧,怎么办?这时候就需要通过协商来解决。有些人比别人更会协商,并不仅仅是他们运气好,也不是他们有经验或接受过训练,好的谈判专家学会了运用有效协商战略。

有原则协商十分有效的主要原因是它可以使矛盾的双方得到调和。当矛盾使双方不能达到一致时,一方的胜利就意味着另一方的失败,解决这一困境的唯一手段就是发掘矛盾双方所共同感兴趣的东西,也就是所谓的共性。有原则的协商就是以共性为中心,把双方的矛盾逐渐向共性上靠拢,只有当分歧逐渐消失时,双发才可能得到一个比较满意地解决方案,也就是所谓的“双赢”。

项目的沟通管理的目标是及时而适当的创建、收集、发送、存储和处理项目的信息。项目的沟通管理过程包括:
沟通计划编制,决定谁需要什么信息,什么时候需要以及如何把信息发送给他们。
信息发送,包括及时向个项目干系人提供所需信息。
绩效报告,包括收集并发布有关项目绩效的信息如状态报告,进展报告等
管理收尾,包括生成、收集和发布信息来使阶段或项目的完成正规化。
在这四点当中,最关键的阶段的应该是沟通计划的编制,在这一阶段我们必须清楚什么人需要什么样的信息,如果连你想与人交流什么都不清楚又谈何沟通?高层的经理也许只有几分钟,他可不希望你在那喋喋不休,为此对他们也许几张图表把当前项目进展等情况表述出来是最重要的,而项目经理、职能经理、项目小组长、项目成员以及财务部门各自想要的都不同,你这时该做的就是向我们在机械制图学中学习到的一样,在不同的视角下向他们提供不同的视图。


下面就沟通管理的四个方面分别举例来说明:

 

沟通计划的编制

   在项目立项后,第一步就要制定《沟通计划》,《沟通计划》应包括以下内容:
  文件保存方式:在沟通计划中首先明确信息保存方式、信息读写的权限,明确用户信件、会议记录、工作报告、项目文档(需求、设计、编码、发布程序等)、辅助文档等的存放位置,及相应的读写权力。这样用于收集和保存不同类型的信息,有必要制定和遵循一个规定好了的统一规章制度,将与项目有关的重要工作建档。在XX港口的EAM项目实施中,我们用一台普通的PC机作为我们的文档服务器,由文档管理员负责维护,按照不同的文档类型分类存放,日常工作中的工作日报、周计划、会议纪要、需求报告等等。普通的用户只能访问共享的只读权限的文件夹,文档管理员可以以读/写权限访问所有的文件夹,日常的工作文档等通过安装的内部电子邮件系统发送给文档管理员,由文档管理员分类归档,从而保证了实施工作的顺利进行和文档资料的一致性和安全性。
  联系方式:应该有一个专用于项目管理中所有的相关的人员的联系方式的小册子,其中如项目组成员、项目组上级领导、行政部人员、技术支持人员、出差定房订票等系统中相关的人员,座机、手机、职能等等,应相应的一一列上,做到简洁又要明了,最好能有特殊人员的一些细小的标注,能够做到在一打开小册子的同时就能将所有的相关人员的资料了然于胸,正所谓知已知彼,这样一来,很多在平时大费周章的事,就能在养成的良好的习惯中,轻松做到。
  工作汇报方式:明确表达项目组成员对项目经理或项目经理对上级和相关人员的工作汇报方式,明确什么时间,什么形式。例如在XX港口EAM系统实施中,项目组成员对项目经理通过内部电子邮件系统发送工作日报和周计划;项目经理每周五召开周例会,对项目进展情况向项目组成员和客户方经理进行通报,让所有参加项目的成员时刻明白我们的当前的工作进展情况和下一步该做什么;紧急汇报通过电话及时沟通;每月项目经理对项目状况向客户方领导进行大约10分钟的汇报等等。
  统一项目文件格式:对于一个项目本身统一的文件模板,是正规管理的一部分,所以必须统一各种文件模板,并提供编写指南。
  《沟通计划》维护人:明确本计划在发行变化时,由谁进行修订,并对相关人员发送。
  由于《沟通计划》是同很多人员有相关的,必须保证计划是有相关干系人参于制订,并且保证《沟通计划》是相关人员已经正解接收及理解。计划是用来执行的,而不是为计划而计划束之高阁。

 

信息发送

  对于项目管理的信息正确传达到相应的人员,是相当重要并有一定的困难的,经常发生的事情是信息发送人感到自己把信息正确传达了,但实际的结果却是信息没有传达到或是被错误的理解了。太多的人还是不太习惯成堆的文件或者通篇的E-MAIL传送的邮件,如果能利用非正式的方式或者是双方会谈的方式来听取重要的信息,就来得又快又准确更能让人接受,就象传统里的一纸书信在某些场合还是比任一现代化的联系方式来得好一样,价值取向不同,沟通的方式也就在使用效果上全然不一样了。            
  我们在沟通中应遵循彼得.德鲁克提出的四个基本法则:
  沟通是一种感知
  沟通是一种期望
  沟通产生要求
  信息不是沟通
  本人在通过学习及结合实践的过程中得到以下的感受。
1
)沟通是一种感知
  沟通一定是双向,必须保证信息被接收者接到了。所有的沟通方式,必须有回馈机制,保证接收者接收到。比如:电子邮件进行沟通,无论是接收者简单回复已收到、OK”等,还是电话回答收到,但必须保证接收者收到信息,并回应信息已经接收到。
  信息收到必须保证理解是正确的,很多事情信息收到了,但被错误的理解了,很多信息是传达到了,但却被错误理解了。
  比如:A项目经理对B项目经理说今天我要去投标,不过我这边的现在人手少,你那边可否抽些人过来帮我壮壮声势
  B项目经理手中有一些程序员和系统分析员,而当前程序员有些空闲人手,系统分析员今天正好有些紧急工作,但B项目经理错误理解为A项目经理需要的人是系统分析员,到时协助答辩,所以回答不行,今天正好有紧急工作,没有办法帮忙
  A项目经理只好另想办法。
  以上就是典型的理解错误,发送方的正确表达、接收者的正确理解是非常重要的。比较简单的方式是发送者进行信息发送,接收者进行理解后进行细化并进行二次表达,但这种表达却是在确认自己理解了的同时去转叙或者执行的结果,而不是复述。
2
)沟通是一种期望
  在项目管理中,项目不同干系人是有不同的沟通需要的。
  项目组成员在具体的工作安排中他想明白那个职位是否符合他的意愿等等,上级要了解接收者的期望,向下属传达工作安排的同时还要了解他的意愿取向的问题,再采取相应的方法,调起其在工作上的热情,从而促使其在工作的高效付出,在项目管理中如让下属有反抗情绪的产生或者低效的工作,则是一个项目经理在沟通上不得法的一个失败实例。因此制定一个协调的沟通计划就更为重要了。
  而项目经理的上级和客户更加关心是进度的问题:时间是否会延期、是否要添加成本、质量是否有保障等等。这对于项目经理来说,就应即时的反馈这些时间,特别是将会有延期、将添加项目成本、质量将会有问题的苗头等等,更加必须提早汇报,使项目经理的上级和客户能及时并适时调整工作计划。
3
)沟通产生要求
  沟通是双向的,沟通必须能够符合接收者的利益,那样才有说服力。这就要求双方都要有良好的沟通方式,特别是良好的沟通又能达到双赢的目的,一致的沟通有助于组织促进项目更新。
  口头的沟通能力同时似乎又是职位提升的关键因素。于是,沟通又必然的产生要求,比如:职位上成功,项目的早日完成,对问题作出恰当的回应,小到假期薪金等等都要沟通来达到目的。
4
)信息不是沟通
  当前是信息时代,必须分清哪些是沟通哪些是信息,对于用于沟通的信息必须明确简练、醒目,避免沉没于信息之海中。
  信息也可用于沟通,但信息过于的生搬硬套,一个文字性的文件是并不能起到沟通的作用的,在项目中,项目经理并不是想集中于信息中而是想了解项目里工作的人员,并与之建立起相互信任的关系。而有效的发送信息,只能是依赖于项目经理和项目组成员的良好的沟通技能。
  我们现在就能通过上面的四个法则来进行有效的沟通,达到保证管理中信息有效传达的目的了。

绩效报告

实施情况报告一般有三种形式:定期报告,阶段审查,紧急报告。
  定期报告:就是在某一特定的时间内将所完成的工作量向上级汇报。在实际的项目管理中项目人员对项目经理按周报告,对于客户和项目经理的直接上级是按阶段或月进行统一的进展报告,从项目管理上讲,项目定期报告的主要内容就包括:当前是什么状态?在什么阶段?进度完成情况?当前有什么问题请上级(用户)协助解决?下周(下阶段或下月)的计划是什么等等。
  阶段评审:在项目进行到重要的阶段或里程碑似的项目发展阶段,就要进行阶段评审。阶段评审的意义就在于评审当前的项目情况,迫使人们对其工作负责;阶段评审可以提前发现问题,提前将问题解决在初期阶段。不过阶段评审也是最容易产生争执的地方,这主要是针对于问题严重性的定级,项目经理或项目管理委员会必须在全面了解项目发展进展的情况下及时找到问题的重点,从而就事论事的解决问题的真正症结所在,并进行后面的项目。
  紧急报告:在出现意外情况下,进行紧急报告。紧急报告包括以下内容:当前发现的问题,相关影响,需如何解决(动用什么资源),问题紧迫性(必须什么时间内进行反馈)。
在实际的项目管理过程中,质量管理的质量保证部门也将进行质量审计,按阶段提交质量审计报告。
 
项目干系人接到实施情况报告后也应即时的进行反馈,明确报告已经成功接收到。并让项目干系人一道解决执行中的问题。

 

项目的管理收尾

1) 项目客户验收
  项目收尾期间客户将根据合同对项目进行验收,一般是对最终成果《软件系统》,项目文档《操作手册》、《安装手册》、《软件光盘》、《维护计划》或《维护手册》进行验收,双方将产生双方《项目开发/实施总结报告》及《项目总结会议备忘录》不同的人都有不同的见解,这些报告都是极好的资源,对未来项目的平稳运行有很大的帮助。
2)
过程文件归档
  项目组内部将对项目过程中的计划、需求、设计、源代码、变更、会议纪要、客户信件等文档整理归档,为以后的查询及参考作为一定的依据。项目档案常常在结束多年以后还有用,良好的项目档案能为当前的项目节省时间和金钱,有时还能对组织进行审计等快速提供有价值的信息。
3)
项目总结
  很多项目没有能进行很好的总结,推脱的理由有项目总结时项目人员已经不足/不全、现在有新的项目要接没有时间、写了没人看等等。这些理由全不是正确的,无论如何也要进行总结,只能总结当前,才能提高以后。
  项目的成员应当在项目完成后,为取得的经验和教训写一《项目总结报告》,总结在本项目中哪些方法和事情使项目进行的更好、哪些为项目制造了麻烦、以后应在项目中避免什么情况、那些事情应在后面的项目中坚持等等。为以后的项目人员更好的工作提供一个极好的资源和依据。

 

结束语

项目管理涉及的范围还很多,本篇只就项目的沟通提出了一些看法。要想做好项目管理工作也不是一朝一夕的事情,它需要多个部门的配合,公司整体资源的优化。在项目管理领域还有许多问题值得去探讨,请多给出批评指正的意见。

 

参考文献:
1
罗伯特·K·威索基.有效的项目管理.李盛萍 常春.电子工业出版社,20028
2
詹姆斯.P.刘易斯.项目经理案头手册.王增东 任志忠 胡永庆.机械工业出版,

  2001年11月

3、 刘积仁 康晓东 饶友玲.软件开发项目管理.人民邮电出版社,20022

2008年12月19日
闭包 (closure)是啥?
 闭包:基本概念
 闭包是可以包含自由(未绑定)变量的代码块;这些变量不是在这个代码块或者任何全局上下文中定义的,而是在定义代码块的环境中定义。闭包一词来源于以下两者的结合:要执行的代码块(由于自由变量的存在,相关变量引用没有释放)和为自由变量提供绑定的计算环境(作用域)。在 SchemeCommon LispSmalltalkGroovyJavaScriptRuby Python 等语言中都能找到对闭包不同程度的支持。
 闭包的价值在于可以作为函数对象或者匿名函数,对于类型系统而言这就意味着不仅要表示数据还要表示代码。支持闭包的多数语言都将函数作为第一级对象,就是说这些函数可以存储到变量中、作为参数传递给其他函数,最重要的是能够被函数动态地创建和返回。
 
闭包的两个特点:
1、作为一个函数变量的一个引用当函数返回时,其处于激活状态。
2、一个闭包就是当一个函数返回时,一个没有释放资源的栈区。
 
Groovy语言中闭包(closure)是一个非常重要的概念,而且深入的理解了闭包对充分用好Groovy有很大帮助。对闭包比较书面的一种解释“闭包是可以用作函数参数和方法参数的代码块”。其实Groovy的闭包更象是一个“代码块”或者方法指针,代码在某处被定义然后在其后的调用处执行。
闭包基础来看一个例子:
def square = {it * it} // 定义一个叫square的闭包。it是默认的 参数名称
assert 4 == square(2) // 使用闭包
assert [1,4,9] == [1,2,3].collect(square) // 使用闭包
闭包类似Java的内类,区别是闭包只有单一的方法可以调用,但可以有任意的参数,闭包用“{}”括起,“->”前面是参数,后面是处理语句,可以直接调用,也可以使用call调用。不管那种调用,最后groovy编译器都会把编译成对doCall方法的调用,这是groovy对闭包的一个隐藏方法。
def closure = { param -> println("hello ${param}") }
closure.call("world!")

def closure = { greeting, name -> println(greeting + name) }
closure.call("hello ", "world!")

第一个例子演示了在字符串内使用参数的形式:${param}
第二个例子演示了多参数形式:用“,”分隔参数
如果你的参数少于2个,那么它可以直接忽略掉。如果只有一个参数,可以不写,而使用缺省的参数“it”,如下面的例子:
closure = { println "hello " + it }
closure.call("world!")
把闭包当作变量返回的例子:
def localMethod() {
 def localVariable = new java.util.Date()
 return { println localVariable }
}

def clos = localMethod()

println "Executing the closure:"
clos()

Groovy闭包中几个隐含变量
it:默认的参数名,调用是如果没有传参数,it为null
this : 跟Java一样,是定义闭包所在类的一个引用,不管有多少层闭包嵌套,this指向的都是最上层的类。
owner : 封闭闭包的对象(如果只有一层闭包就是this,如果有多层闭包嵌套就是含有此闭包的上层闭包)
delegate :缺省值是owner,但是可以改变,后面详说。
看例子:
class Class1 {
 def closure = {
  println " ============================== "
  println "this = "+ this.class.name
  println "owner = " + owner.class.name
  println "delegate = " + delegate.class.name
 def nestedClos = {
   println " ============================== "
   println "this = "+ this.class.name
  println "owner = " + owner.class.name
  println "delegate = " + delegate.class.name
 def thirdClos = {
  println " ============================== "
  println "this = "+ this.class.name
  println "owner = " + owner.class.name
  println "delegate = " + delegate.class.name
  }
   thirdClos()
   }
   nestedClos()
 }
}
def clos = new Class1().closure
//clos.delegate = this
clos()
执行结果:
==============================
this = Class1
owner = Class1
delegate = Class1
==============================
this = Class1
owner = Class1$_closure1
delegate = Class1$_closure1
==============================
this = Class1
owner = Class1$_closure1_closure2
delegate = Class1$_closure1_closure2
闭包实现接口
前面说了用闭包实现类,或继承其他类。现在看看怎么实现接口。
interface Test
{
def test()
}

def test = {
 println’ok’
} as Test

test.test()
如果接口只有一个方法需要实现,比如Comparator,Runnable等接口就可以直接实现方法后加上 as Runnable接口名就可以。

多方法接口,groovy用Map的方法实现。
interface MultiFuncTest
{
    def test1()
    def test2(str)
}

def impl = [test1:{println'test'},
    test2:{str -> println str}] as MultiFuncTest

impl.test1()
impl.test2(‘ok’)
delegate委托的用法
delegate委托在是一种常用设计模式,但在java中实现相对比较繁琐,groovy直接在GroovyObject中已经实现了delegate模式,所以在groovy中应用delegate很方便。
class Dog{
 def play = {
  "wang wang!"
  }
 def childmind = {
    println    delegate.play();
    }
}
class Cat {
 def play = {"mi mi !"}
}
def dog = new Dog()
def cat = new Cat()
dog.childmind()
dog.childmind.delegate = cat;
dog.childmind()
上面的例子是狗爸爸让老猫帮忙照看他的狗儿子玩游戏。
作为方法参数的闭包

当一个方法的最后一个参数是闭包的时候,我们可以将闭包紧随其后定义,如
Java代码
def list = ['a','b','c','d']
def newList = []
list.collect(newList){
 it.toUpperCase()
}
println newList //["A","B","C","D"]
def list = ['a','b','c','d']
def newList = []
 
list.collect( newList ) {
 it.toUpperCase()
}
println newList           // ["A", "B", "C", "D"]

上一个例子也可以用下面的方法实现,就是稍显冗长。

Java代码
def list = ['a','b','c','d']
def newList = []
def clos = { it.toUpperCase() }
list.collect(newList,clos)
assert newList == ["A","B","C","D"]
def list = ['a','b','c','d']
def newList = []
 
def clos = { it.toUpperCase() }
list.collect( newList, clos )
 
assert newList == ["A", "B", "C", "D"]
 
闭包是Groovy一种核心技术,也是现在比较流行的动态语言的核心技术,所以全面稳定的掌握闭包是非常必要的
2008年12月16日

看了天涯网友的 《10分钟让你全面了解当前世界金融危机》的文章,再结合自己的理解增加了一些内容上去,画了一张逻辑关系图,请大家看看。
  
  原文如下
  
  对金融危机最普遍的官方解释是次贷问题,然而次贷总共不过几千亿,而美国政府救市资金早已到了万亿以上,为什么危机还是看不到头?有文章指出危机的根源是金融机构采用“杠杆”交易;另一些专家指出金融危机的背后是62万亿的信用违约掉期(Credit Default Swap, CDS)。那么,次贷,杠杆和CDS之间究竟是什么关系?它们之间通过什么样的相互作用产生了今天的金融危机?在众多的金融危机分析文章中,始终没有看到对这些问题的简单明了的解释。本文试图通过自己的理解为这些问题提供一个答案,为通俗易懂起见,我们使用了几个假想的例子。有不恰当之处欢迎批评讨论。
          
      一。杠杆。目前,许多投资银行为了赚取暴利,采用20-30倍杠杆操作,假设一个银行A自身资产为30亿,30倍杠杆就是900亿。也就是说,这个银行A以30亿资产为抵押去借900亿的资金用于投资,假如投资盈利5%,那么A就获得45亿的盈利,相对于A自身资产而言,这是150%的暴利。反过来,假如投资亏损5%,那么银行A赔光了自己的全部资产还欠15亿。
          
      二。CDS合同。由于杠杆操作高风险,所以按照正常的规定,银行不运行进行这样的冒险操作。所以就有人想出一个办法,把杠杆投资拿去做“保险”。这种保险就叫CDS。比如,银行A为了逃避杠杆风险就找到了机构B。机构B可能是另一家银行,也可能是保险公司,诸如此类。A对B说,你帮我的贷款做违约保险怎么样,我每年付你保险费5千万,连续10年,总共5亿,假如我的投资没有违约,那么这笔保险费你就白拿了,假如违约,你要为我赔偿。A想,如果不违约,我可以赚45亿,这里面拿出5亿用来做保险,我还能净赚40亿。如果有违约,反正有保险来赔。所以对A而言这是一笔只赚不赔的生意。B是一个精明的人,没有立即答应A的邀请,而是回去做了一个统计分析,发现违约的情况不到1%。如果做一百家的生意,总计可以拿到500亿的保险金,如果其中一家违约,赔偿额最多不过50亿,即使两家违约,还能赚400亿。A,B双方都认为这笔买卖对自己有利,因此立即拍板成交,皆大欢喜。
          
      三。CDS市场。B做了这笔保险生意之后,C在旁边眼红了。C就跑到B那边说,你把这100个CDS卖给我怎么样,每个合同给你2亿,总共200亿。B想,我的400亿要10年才能拿到,现在一转手就有200亿,而且没有风险,何乐而不为,因此B和C马上就成交了。这样一来,CDS就像股票一样流到了金融市场之上,可以交易和买卖。实际上C拿到这批CDS之后,并不想等上10年再收取200亿,而是把它挂牌出售,标价220亿;D看到这个产品,算了一下,400亿减去220亿,还有180亿可赚,这是“原始股”,不算贵,立即买了下来。一转手,C赚了20 亿。从此以后,这些CDS就在市场上反复的抄,现在CDS的市场总值已经抄到了62万亿美元。
          
      四。次贷。上面 A,B,C,D,E,F….都在赚大钱,那么这些钱到底从那里冒出来的呢?从根本上说,这些钱来自A以及同A相仿的投资人的盈利。而他们的盈利大半来自美国的次级贷款。人们说次贷危机是由于把钱借给了穷人。笔者对这个说法不以为然。笔者以为,次贷主要是给了普通的美国房产投资人。这些人的经济实力本来只够买自己的一套住房,但是看到房价快速上涨,动起了房产投机的主意。他们把自己的房子抵押出去,贷款买投资房。这类贷款利息要在8%-9%以上,凭他们自己的收入很难对付,不过他们可以继续把房子抵押给银行,借钱付利息,空手套白狼。此时A很高兴,他的投资在为他赚钱;B也很高兴,市场违约率很低,保险生意可以继续做;后面的C,D,E,F等等都跟着赚钱。
          
      五。次贷危机。房价涨到一定的程度就涨不上去了,后面没人接盘。此时房产投机人急得像热锅上的蚂蚁。房子卖不出去,高额利息要不停的付,终于到了走头无路的一天,把房子甩给了银行。此时违约就发生了。此时A感到一丝遗憾,大钱赚不着了,不过也亏不到那里,反正有B做保险。B也不担心,反正保险已经卖给了C。那么现在这份CDS保险在那里呢,在G手里。G刚从F手里花了300亿买下了 100个CDS,还没来得及转手,突然接到消息,这批CDS被降级,其中有20个违约,大大超出原先估计的1%到2%的违约率。每个违约要支付50亿的保险金,总共支出达1000亿。加上300亿CDS收购费,G的亏损总计达1300亿。虽然G是全美排行前10名的大机构,也经不起如此巨大的亏损。因此G 濒临倒闭。
          
      六。金融危机。如果G倒闭,那么A花费5亿美元买的保险就泡了汤,更糟糕的是,由于A采用了杠杆原理投资,根据前面的分析,A 赔光全部资产也不够还债。因此A立即面临破产的危险。除了A之外,还有A2,A3,…,A20,统统要准备倒闭。因此G,A,A2,…,A20一起来到美国财政部长面前,一把鼻涕一把眼泪地游说,G万万不能倒闭,它一倒闭大家都完了。财政部长心一软,就把G给国有化了,此后A,…,A20的保险金总计1000亿美元全部由美国纳税人支付。
          
      七。美元危机。上面讲到的100个CDS的市场价是300亿。而CDS市场总值是62万亿,假设其中有10%的违约,那么就有6万亿的违约CDS。这个数字是300亿的200倍。如果说美国政府收购价值300亿的CDS之后要赔出1000 亿。那么对于剩下的那些违约CDS,美国政府就要赔出20万亿。如果不赔,就要看着A20,A21,A22等等一个接一个倒闭。无论采取什么措施,美元大贬值已经不可避免。
          
      以上计算所用的假设和数字同实际情况会有出入,但美国金融危机的严重性无法低估。

今天早上,做了一个决定,跑去银行套了些现金购买瑞郎,还打算在下个星期把手头的资金全部转成瑞郎。
    
    缘由是最近一些日子,脑子比较混乱,不是脑子出问题了,而是许多头绪纠缠在一起,想来想去理不顺。虽然理不顺,但所有的信息引发的思考,都指向同一个结局:3年内我们很可能都将面临困境,以美国为首的西方经济陷入大萧条(和二三十年代那个萧条差不多),中国虽然会好一些,但在头几年的调整中,会导致我们的生活水平急剧下降。
    
    缘由一:美国经济。在07年,美国经济应该是冲到了一个顶点,以互联网和IT信息等等新技术带来的第三次技术革命所引发的经济高潮,目前已经到达峰顶。峰顶之后是什么?回顾一下历史,当年以T型车横扫美国的福特汽车公司跟今天的微软英特尔是何等的相似,但短短半年,经济大萧条几乎毁了福特。07年美国的次贷危机只不过是前奏,美元的狂贬之路目前遥遥无期。美国政府的巨额赤字,除开贬值之外,美国人难道真的用黄金来代替绿色废纸偿还给各国?大家仔细思考一下现在美国经济的实际状况吧,高科技究竟占了美国GDP的多少比例?而婴儿潮这一代人的消费高潮目前已经进入尾声,该买的房买完了,该买的车也买完了,该提前消费的也彻底超额提前消费了,于是实际需求的萎缩诱发出的表面现象就是巨额赤字,不仅是外贸上的巨额赤字,更惊心和揪心的是国债和政府预算的巨额赤字。应对次贷危机本应加息,可美国目前的对策却是一次又一次的减息,为什么?为什么?大家仔细想吧。
    
    缘由二:石油。15美元到40多美元,再到8美元;20多美元冲到50多美元,再冲到103美元,接下来呢?200美元或20美元?这几天网络上大家正为石油是否会回到20美元而争吵不休。我个人的看法是,短期内石油极有可能先是暴涨,然后暴跌,然后将连续2到4年时间维持在35美元左右的价格(这个35美元是指现在的市值),其后将开始新一轮泡沫。我的预测根据是,连续三年和未来两年在石油领域的巨额投资会导致石油供给远超过现在,而席卷西方国家的经济危机恰恰导致石油需求骤减,一增一减的后果会是什么呢?不要跳出来说我脑子进水,也不要说什么欧佩克的伟大力量,大家先搜一搜这三年中石油和中石化的砸钱举动,再查一查伊朗俄罗斯委内瑞拉等等国家最近三年的石油投资吧,还有,沉睡了8年的伊拉克总不能永远沉睡下去吧?
    
    缘由三:政治。台海的局大家都说没问题,都说朝廷接受不起过海打台而导致的经济倒退的代价。可是,大家有没有逆向思维过,因为经济倒退要转移矛盾,朝廷选什么做转移点呢?东海之争,钓鱼岛之争,西沙群岛之争,南沙群岛之争,藏南之争等等纠纷,这些年全是靠播放录音机播过来的,可所有的矛盾终归是要解决的,能谈判下来的早就谈完了。正因为谈不下来才拖着,拖着拖着难不成会拖出一个和谐大同?至于什么和美国摊牌的预测我不敢做,但前面列举的一堆小牌,总不能全留在手里打十三幺吧?政治的风险最难预料,那就姑且不计吧。
    
    缘由四:国内。这些年的繁荣说穿了全是靠血泪外来工的袜子鞋子制造,由此而引发的房地产等等行业的泡沫以及国内贫富悬殊等等问题,终归要解决吧?环顾四周,越南印度等国家的低成本人力资源正在引发新一轮的资本转移,而中国不可避免不情愿也得进行经济结构调整,再加上美国的萧条导致的出口受阻,将会引发什么局面?长久来说,我们应该比美国舒坦,经济高速增长应该可以维持到2020年,但其间会如何调整呢?
    
    缘由五:经验。不要否认,我们只不过刚刚走向富裕,我们根本没有过富裕的经验,更没有过应付经济危机的经验。其实,经济衰退并不是那么可怕,真正可怕的是逆境中人心的绝望,对未来无法判断的恐慌。回忆一下这次的雪灾吧,仅仅只是断了一条高速和一条铁路,于是物价横飞城市成孤岛……,大家再想一想大批企业倒闭大批失业外来工涌向回家路之时的社会状况吧。
    
    LP催睡觉了,明晚再来折腾吧。

2008年11月27日
最近受身边哥们的影响,开始学习Groovy和Grails,首先从最基本的配置做起(^_^,听起来弱弱地),下面分别列出基本的配置方法(咱们现在先别管它能做啥,先学会安装):
因为Groovy是运行在Java虚拟机上的脚本语言,所以嘛,安装Java虚拟机也就成了我们的首要任务。
一、下载和安装Java虚拟机
1、 下载Jdk
最新的jdk为1.6.10,可以从官方去下载
http://www.java.net/download/jdk6/6u10/promoted/b32/binaries/jdk-6u10-rc2-bin-b32-windows-i586-p-12_sep_2008.exe
2、 配置环境变量
安装Jdk1.6以后,需要配置->属性->高级->环境变量->系统变量中添加以下环境变量(假定你的Jdk安装在C:\Jdk1.6):
JAVA_HOME= C:\Jdk1.6
classpath=.;%JAVA_HOME%\lib\dt.jar;%JAVA_HOME%\lib\tools.jar;(.;一定不能少,因为它代表当前路径)
path=%JAVA_HOME%\bin
一下环境变量,在我的电脑
3、 测试JVM安装是否正常
在开始->运行中输入cmd然后回车,在DOS窗口下输入java –version,如果显示类似如下,表示Jdk安装成功:
C:\Documents and Settings\xp>java -version
java version "1.6.0_10"
Java(TM) SE Runtime Environment (build 1.6.0_10-b12)
Java HotSpot(TM) Client VM (build 10.0-b19, mixed mode, sharing)
二、下载和安装Grails
Java Web应用程序框架是企业Java得以成功的重要原因之一。人们怀疑如果没有Apache Struts框架Java EE是否能够如此成功。虽然底层编程语言很重要,但通常是框架使编程语言成为引人注目的中心的。如果您经常访问讨论论坛,就会注意到Ruby语言和Ruby On Rails框架之间也是这种情况。Ruby已经出现十多年了,然而只是在Ruby On Rails框架流行之后,开发人员才开始注意到Ruby语言。

诸如Ruby、PHP和Python之类的脚本语言最近几年越来越流行,因此,需要开发一个Java脚本备选语言和类似Rails的针对Java环境的框架。Groovy就是这个脚本语言,而Grails就是这个框架。

1、 下载Grails
最新的Grails版本是1.0.4,可以从以下链接下载:
http://dist.codehaus.org/grails/grails-bin-1.0.4.zip
2、 配置环境变量
将下载完的grails-bin-1.0.4.zip解压缩到C:\ grails-1.0.4目录下
Windows系统上右击“我的电脑”/“属性”/“高级”/“环境变量”,点击新建环境变量GRAILS_HOME,值为C:\ grails-1.0.4
Windows系统上右击“我的电脑”/“属性”/“高级”/“环境变量”,修改path的值,在最后面增加%GRAILS_HOME%\bin;
3、 测试Grails安装是否正常
打开window命令提示符窗口,输入grails
C:\Documents and Settings\xp>grails
 
Welcome to Grails 1.0.4 – http://grails.org/
Licensed under Apache Standard License 2.0
Grails home is set to: c:\grails-1.0.4
 
No script name specified. Use ‘grails help’ for more info or ‘grails interactive
‘ to enter interactive mode
测试成功!!
三、下载和安装Groovy
    Groovy是什么?

Groovy是一种语言,其语法类似于Java,但比Java更简单。它通常被视为脚本/灵活/动态的语言,但是我不喜欢这类形容词,因为我认为它们只会令人困惑。如果说Java是一位明智的中年男子,那么Groovy就是他十几岁的儿子。Groovy具有父亲的许多特点,但是更为狂野且更为有趣。他们也可以很好地合作。

Groovy的规则比Java少得多。例如,要在Java中获得标准的"Hello World"输出,您需要编写一个类、一个具有合适参数的主方法,等等。但是在Groovy中,如果不想编写所有样板代码,您可以抛开类定义和主方法,仅编写一行代码即可打印出"Hello World"。

以下是打印Hello World的文件 Hello.groovy的内容:

println "Hello World"

 
1、 下载Groovy
我下载的版本是1.5.4,可以到一下链接下载:
http://refcardz.dzone.com/refcardz/groovy
2、 配置环境变量
将下载好的groovy-binary-1.5.4.zip解压,例如解压安装到c:\groovy-1.5.4,然后配置运行Groovy所需要的系统环境变量:
Windows系统上右击“我的电脑”/“属性”/“高级”/“环境变量”,点击新建环境变量GROOVY_HOME,值为c:\groovy-1.5.4
Windows系统上右击“我的电脑”/“属性”/“高级”/“环境变量”,修改path的值,在最后面增加%GROOVY_HOME%\bin;
3、 测试Groovy安装是否正常
打开window命令提示符窗口,输入groovy -v
C:\Documents and Settings\xp>groovy -v
Groovy Version: 1.5.4 JVM: 10.0-b19
测试成功!!!
2008年11月03日

近期因为要使用Jdeveloper 10.1.2开发,当中用到了LovList(也就是弹出列表),弹出列表的标题(中文)总是显示乱码,后来检查才发现,url中的中文经过escape函数编码处理后,不能直接调用显示,而java本身又不具备类似于Javascript的unescape函数来实现解码,本来打算自己写方法来实现,但当中遇到了一点问题,所以就开始上网查找,结果还真发现了一个哥们写的现成的函数,幸甚!代码粘贴如下:

    /**
   * 对经过escape函数加密的url中的字符串进行解密
   * @return 解密后的正常字符串
   * @param src
   * 参数说明 例如:%u5339%u914D%u8BBE%u5907或者\u5339\u914D\u8BBE\u5907
   */
    public static String unescape(String src) {
         StringBuffer tmp = new StringBuffer();
         tmp.ensureCapacity(src.length());
         int lastPos = 0, pos = 0;
         char ch;
         while (lastPos < src.length()) {
            pos = src.indexOf("%", lastPos);
            if (pos == lastPos) {
               if (src.charAt(pos + 1) == ‘u’) {
                  ch = (char) Integer.parseInt(src.substring(pos + 2, pos + 6), 16);
                  tmp.append(ch);
                  lastPos = pos + 6;
               }
               else {
                  ch = (char) Integer.parseInt(src.substring(pos + 1, pos + 3), 16);
                  tmp.append(ch);
                  lastPos = pos + 3;
               }
            }
            else {
               if (pos == -1) {
                  tmp.append(src.substring(lastPos));
                  lastPos = src.length();
               }
               else {
                  tmp.append(src.substring(lastPos, pos));
                  lastPos = pos;
               }
            }
         }
         return tmp.toString();
      }

大家一起共享!

2008年10月06日

话说毒奶粉事件后,一日无意在网上看见这样两则笑话,摘录如下:

网上段子1:在追查三鹿事件责任人时,三鹿说是奶农责任,奶农说是奶牛责任,奶牛支吾了半天,说出了一个字:草。草很委屈,含泪道:怪也怪我妈生了我,终于揪出幕后凶手——草他妈。草他妈极其冤枉地大声哭道:怪也得怪我妈生了我,最终挖出真正罪魁祸首:草他奶奶。

网上段子2:蚊子饿极,见一小姐双乳高挺,遂一头扎入猛咬,发现嘴里全是硅胶,于是仰天长叹:“唉!食品安全太成问题了,上哪能吃到放心奶啊……”

虽然看着是笑话,或许看完后我们是笑笑罢了,但是这笑话创作者背后的无奈和对这个社会的讽刺溢于言表,可能比直接攻击某些不作为的机构来的更能让人记忆犹新滴!古人尚且知道民以食为天,但是目前的食品安装状况如此,你让老百姓做何感想?

我最后也想问一句:什么时候老百姓能够真正和谐生活在社会主义的祖国???深思中。。。。。

2008年09月04日
本章先將 ADF Framework 的說明暫停一下,我們先來說一下 Oracle JDeveloper Struts 的關係,接下來的章節,再來繼續的說 ADF Framework的其餘功能包括一些 Custom Method包括一些更加進階的示是本章先來談一下有關 Apache Group 所包含的一項 ProjectStrutsADF Framework 也是基於 Struts 的基礎,來進行 Developer 的開發。
 
 
Apache Struts 是一個實 MVCModel-View-Controller Framework以前我們可能可以用 JSP + Servlet + JavaBeans 來實 MVC但是也許有太多東西需要 Implement Apache Strtus 將一些基礎打好,Developer Follow Strtus 的模式進行開發,就可以開發一個 MVC Application
 
 
有關於 Struts 的細節,不論於 Javaworld@TW或是書籍都有很多參考資或許文章中會提到一些概念,但是細節部分,需要您再去參考一下相關書籍,本章節會做一個登入系統的簡單示範。
 
 
因為我們需要示範登入和登出,所以我們先來建立一個使用者 Table我們先切到 Oracle JDeveloper Connection 的區域,我們先來展開 Database Node目前我已經將Oracle DB中的兩個最常用的SchemaHROE建立好Oracle Database Connection,如果不清楚,可以參閱前面的章節。
 
 
 
 
 
 
 
 
 
 
 
 
 


 
 
 
 
我們接下來使用 OE 這個使用者,所以先需要有 CreateTable 的權力,接下來我們先將 Table Node展開,會 List OE 這個使用者的所有 Table
 
 
 
我們先按一下【NewTable,來建立一 Table
 
 
 
 
 
 
 


 
 
 
 
 
Oracle JDeveloper 顯示CreateTableWizard,可以直接按一下【下一步
 
 
 
 
 
我們選好相關 Owner,在這裡我們選擇 Owner OE,建立的 Table Name
 
Users,順便養成習慣建 Comment
 
 
 
 
 
 
 
 
 


 
 
 
 
 
接下來,我們建立 Table 的相關 Column,可以直接按一下綠色+
 
 
 
 
 
我們建立一個 Column名稱USER_IDDataTypeVARCHAR2Size10該欄位不能有空值,所以選 Cannot be NULL習慣上,建立 Column Comment
 
 
 
 
 
 
 
 
 


 
 
 
 
 
一樣的,我們建立第二個欄位,名稱為 PASSWORD,其餘設定如下圖。
 
 
 
 
 
一樣的,我們建立第三個欄位,名稱為 TEL_NUM,其餘設定如下圖。
 
 
 
 
 
 
 
 
 
 
 


 
 
 
 
接下我們繼續建立 Table 的相 Key我們先來建立 Primary Key所以我們 USER_ID選到右邊,可以建立以 USER_ID Primary Key
 
 
 
 
 
如下圖,可以建立 USERS_PK1 Primary Key,按下一步。
 
 
 
 
 
 
 
 
 


 
 
 
 
 
繼續建立 Table Unique Key,在這裡,我們不需要建立,按下一步。
 
 
 
 
 
看看 Table需不需要建立 ForeignKeys,在此我們不需要建立,按下一步。
 
 
 
 
 
 
 
 
 
 
 


 
 
 
 
 
可以建立額外的 Constraints,在此我們不需要建立,按下一步。
 
 
 
 
 
Oracle JDeveloper CreateTableWizard會將剛剛進行過的設產生 Preview SQL Statement可以按一下 Save將相關的 SQL我個人是建議最好進行存檔,會比較好。
 
 
 
 
 
 
 


 
 
 
 
 
會跳出檔案儲存視窗,我們可以輸入名稱為 users,接下來按 Save
 
 
 
 
 
可以回到 Table Lists 中,看 USERS Table 的建立。
 
 
 
 
 
 
 


 
 
 
 
 
我們點兩下 USERS這個 Table,可以看到剛剛建立的 Table 結構。
 
 
 
我們為了下面範例的方便,所以我們先來建立一筆資料,所以我們回到 OE Connection部分,我們右鍵按一下,選 SQLWorksheet,可以讓我們針對 OE個使用者,可以下 SQL,視同用 OE 的帳號登入 SQL*PLUS
 
 
 
 
 
我們輸入 InsertInto SQL,我們可以新增一筆資料。


 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
10 
 


 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 


 
 
 
 
 
我們按一下左上角的 SQL 圖示,可以看到 1 row affected
 
 
 
 
 
我們可以看到已經有一筆資料輸入。
 
 
 
 
 
 
接下來,我們開始來示範一下如何用 Oracle JDeveloper來撰寫 Struts 的程式,我們接下來寫一下 Struts所常常示範的程也就是使用者登出登我們會建立欄位,來和資料庫中剛剛所建立的 Data,進行比對。
 
 
我們新增一個 ApplicationWorkspace,所以在 Application 按一下右鍵,選 New
 
ApplicationWorkspace


 
 
 
 
 
1
 


 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 


 
 
 
 
 
我們在 Application Name 取名為LoginWS ApplicationTemplateWeb
 
Application[Default],可以開發WebApplication
 
 
 
 
如下圖所示,Oracle JDeveloper 將會建立一個新 ApplicationWorkspace


 
 
 
12 
 


 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 


 
 
 
 
 
可以看到已經建立 LoginWS 這個Application
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
LoginWS 共分為兩個 ProjectModel Project 可以建立相關 Business Component
 
的相關 Model,而 ViewController可以建立 View 端和 Controller 端的程式。


 
 
 
13 
 


 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 


 
 
 
 
如上 ViewController 上按一下右 Open Struts Page Flow Diagram,可以開啟 Struts Diagram,讓您開發 Struts 的應用程式。
 
 
 
 
我們看到右上角的 Component Palette,可以看到之前所提過的相 Struts
Component,我們這個例子中,會慢慢介紹和解釋。先點一下 Page,並且拖拉到 Struts Page Flow Diagram
 
 
 
可以看到 Struts Page Flow Diagram新增一個/untitled.jsp Component可以協助您建立一個簡單的 JSP Page


 
14 
 


 
 
 
 
 
 
 
 
 
 


 
 
 
 
 
我們將 untitle1.jsp 更改 index.jsp
接下來我們回到 Component Palette Action Struts Page Flow Diagram
 
 
如下圖,已經拉入一個 Action,預設上,會取名 action1
 
 
一樣我們將 action1 更名成 LoginAction注意一都需要在名稱前面加上
 
/


 
 
 
15 
 


 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 


 
 
 
 
 
回到 Component Palette,繼續拉 Page Struts Page Flow Diagram
所以我們繼續拉了 untitled1 untitled2 這兩 Page
 
 
一樣的,我們持續將名稱更改成 success failure


 
 
 
 
 
16 
 


 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 


 
 
 
 
 
我們可以直接點 index.jsp 兩下,可以直接建立 index.jsp
 
 
如下圖,可以看到 ViewController有實體的 index.jsp 的建立。
 
 
 
我們為 index.jsp 增加 CSS 的檔所以我們選到 CSS 類, index.jsp 中。


 
 
 
 
 
 
 
17 
 


 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 


 
 
 
 
 
所以我們將 JDeveloper 拉到 index.jsp 中,可以將 Page 增加 CSS 排版。
 
 
 
我們為了新增文字欄位,將 Component Palette 選到 Struts Html 或是單純的
 
HTML
 
 
 
我們先新增一個 HTML Form,一樣的拉到 Struts Page Flow Diagram


 
 
 
18 
 


 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 


 
 
 
 
 
此時會跳出 Struts html form的屬性設定標籤,我們可以進行設定。
 
 
 
 
 
我們設定該 form所以需要做的 Action,也就 LoginAction.do Action
 
 
 
 
 
按下確定。


 
 
 
 
 
 
 
19 
 


 
 
 
 
 
 
 
 
 


 
 
 
 
 
我們選到 HTML 分類,準備拉相關的 HTML Component
 
 
我們拖拉 Table 到剛剛建立 HTML Form中。
 
 
當您拖拉入時,可以看到預設會跳出 Table 的屬性設定視窗,可以設 Table


 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
20 
 


 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 


 
 
 
 
我們需要建立三列兩欄的表格,所以我們 Rows 選擇 3,而 Columns 選擇 2,其餘設定都採預設即可。
 
 
 
 
如下圖所示,Oracle JDeveloper 已經建立好您所需要的表格。
 
 
 
我們需要建立使用者帳號和使用者密碼兩個欄所以我們先輸入提示文下圖所示,我們輸入使用者帳號和使用者密碼。
 
 
 
 
接下來,我們切到 Strtus Html 中,並且準備建立欄位。


 
 
 
 
21 
 


 
 
 
 
 


 
 
 
 
 
我們可以選擇文字欄位(TextField,準備拖拉到 HTML Form內。
 
 
會跳出文字欄位屬性設定視窗,我們將 Property 設定為 user_id
 
 
 
 
按下 OK,可以看到使用者帳號已經建立文字欄位。


 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
22 
 


 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 


 
 
 
 
 
一樣的,我們建立一個新欄位是 passwd 的欄位,如下圖所示。
 
 
 
 
我們的表單需要一個按鈕,所以我們拖拉 submit 到表格內。
 
 
如下圖,我們將 HTML Page 建立,可以將使用者帳號和使用者密碼接收,去後端檢查相關 Table 資料。


 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
23 
 


 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 


 
 
 
 
 
我們加入一個網頁說明,我們打入【使用者登入頁面
 
 
我們將剛剛的字全我們可以選取 Paragraph可以選到 Heading1好比選 H1
 
 
可以看到剛剛說明的字已經變大了。
 
我們回到Struts Page Flow Diagram我們直接點/success.jsp協助建立success.jsp
 
我們建立好 success.jsp 後,我們先打入成功的訊息,所以 success.jsp 中打入成功的訊息。


 
 
 
 
 
 
 
 
 
24 
 


 
 
 
 
 
 
 
 
 
 


 
 
 
 
 
一樣的,我們讓提示成功的訊息變大一點字型。
 
 
 
 
同樣的動作,我們點 failure.jsp,建立 JSP 檔案。
 
 
 
 
 
 
輸入 failure.jsp 中的文字,我們輸入錯誤提示訊息。
 
 
 
 
我們將字型再度變大。
 
 
 
 
 
可以很明顯看到,錯誤提示訊息的字,已經變大了。


 
 
 
 
 
 
 
 
 
 
 
 
 
25 
 


 
 
 
 
 
 
 
 
 
 
 
 
 
 


 
 
 
 
我們回到 Struts Page Flow Diagram,因為我們已經在 HTML Form中建立了相關 Action,所以我們在空白地方按一下右鍵,如圖 Refresh Diagram fromAll Pages,可以看到該 Diagram會有虛線連結。
 
 
 
 
可以看到 /index.jsp  /LoginAction 之間已經有一條虛線連結。


 
 
 
 
 
 
 
 
 
 
 
 
26 
 


 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 


 
 
 
 
 
 
 
我們點一下 Forward並且拖拉到 Struts Page Flow Diagram並且從 Action拉到
 
success.jsp,可以建立該 Forward
 
 
 
 
 
 
如下圖,我們將該圖拉好相關的 Forward且將其中對於 success.jsp Forward
 
的名稱更改成 success


 
 
 
 
 
 
 
27 
 


 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 


 
 
 
 
 
 
 
 
一樣的,我們將剛剛的 forward1 的名稱更改為 failure
 
 
 
 
 
接下來,我們準備來寫相關的 Action 動作,所以我們直接點兩下 LoginAction
 
 
 
 
會跳出建立 Action的視窗,預設上,傳統的 Action extends org.apache.strtus.Action,接下來,按一下 OK


 
 
 
 
 
 
 
28 
 


 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 


 
 
 
 
可以看到 LoginAction.java 的程式已經建立 OK,等會我們可以來新增我們的程式。
 
 
 
 
 
我們回到 Struts Page Flow Diagram,選一下 Page Link 並且拖拉 Diagram中。
 
 
拖拉方式如下圖示:


 
 
 
 
 
 
29 
 


 
 
 
 
 
 
 


 
 
 
 
 
因為當導到 Failure分,需要能夠連回 index.jsp所以新增一個 Page Link 回到
 
index.jsp
我們看一下左下角的 Structure 區,我們已經建立兩個文字欄位,所以我們建立
 
ActionForm來承接,所以我們在Struts-Config按一下右鍵,NewFormBeans
 
 
繼續在 Form Beans 按一下右鍵,選 FormBean


 
 
30 
 


 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 


 
 
 
 
 
 
我們將 Form Beans 的名稱更改成 login接下來我們進行一些設定,所以我們點 login 上,並且 PropertyInspector 內。
 
 
 
 
我們為 login 選擇一種 Type,所以我們按一下 … 
 
 
 
 
 
我們點到 org.apache.struts.action 的部分,也就是 FormBean需要去 extend某種型別。


 
 
 
 
 
 
 
 
31 
 


 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 


 
 
 
 
 
所以我們將 FormBean extend DynaActionForm可以當作我們的 ActionForm
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
我們需要去新增 FormProperty,因 DynaActionForm不需要產生 FormClass只需要在 Struts-Config.xml 設定,所以以下動作也就是在進行設定。
因為我們有兩個文字欄位,所以我們為 FormBean建立兩個 form-property


 
 
 
32 
 


 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 


 
 
 
 
 
 
 
我們一樣到 PropertyInspector進行設所以我們 form-property1 的名稱更
 
 
 
 
我們將名稱更改成 user_id
 
 
 
 
一樣的,我們像之前的更改名稱。
 
 
 
 
我們將 form-property2 更改名稱為 passwd


 
 
 
 
 
 
 
 
 
33 
 


 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 


 
 
 
 
 
我們回到主畫面,我們在Strtus-config.xml中按一下右鍵,Edit Strtus-Config.xml
 
 
我們看到 Strtus Configuration Editor,我們可以來定義一些設定值。


 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
34 
 


 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 


 
 
 
 
我們在 Action Mapping中將/LoginAction ActionMapping,在FormBean部分,選 login 這個 FormBean
 
 
 
 
 
我們可以看一下程式,可以透過轉型,可以抓到前面網頁所輸入的資料。


 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
35 
 


 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 


 
 
 
 
 
因為我們需要比對之前所輸入資料庫資料,所以我們先建立 JDBC Driver
 
 
可以看到找不到 OracleDriver,所以我們需要加 Oracle JDBC Library 中。
 
 
所以我們在 ViewController 按一下右鍵, Project Properties


 
 
36 
 


 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 


 
 
 
 
 
我們可以切到 Libraries中,可以加入我們需要的 Library
 
 
 
 
 
所以我們選到 Oracle JDBC,並且選到 Selected Libraries中。


 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
37 
 


 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 


 
 
 
 
 
當我們已經加入 Oracle JDBC 後,可以看到已經可以認到 Oracle JDBC
 
 
 
 
 
因為我們有新增 Action Class也就是 LoginAction.java們可以先按一下右選一下 Make,可以先將 Class 先編譯。


 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
38 
 


 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 


 
 
 
 
以下是該 Action Class中的程式碼,可以下一段 SQL Select 資料庫資料,如果回傳筆數是 1,則代表帳號密碼正確,但是如果等於零或是超過 1,則代表帳號密碼驗證錯誤。
 
 
        Stringuser_id =(String)((DynaActionForm)form).get("user_id");
        Stringpasswd = (String)((DynaActionForm)form).get("passwd");
        int numColumns = 0;
    Connection conn;
        try {
                DriverManager.registerDriver(new oracle.jdbc.driver.OracleDriver());
        }catch(SQLException e){
                System.out.print("Driver Error");
        }
 
 
        try {
                conn = DriverManager.getConnection("jdbc:oracle:thin:@localhost:1521:homedb","oe","ho medb");
                Statement stmt = conn.createStatement();
                ResultSetrs =stmt.executeQuery("select count(1) counter fromusers where user_id="+user_id+"and password = " + passwd + "");
                ResultSetMetaData rmeta = rs.getMetaData();
                numColumns= rmeta.getColumnCount();
                System.out.println(numColumns);
                conn.close();
                if(numColumns == 1)
                {
                    return mapping.findForward("success");
                }
                else
                {
                    return mapping.findForward("failure");
                }
        }catch(SQLException ce){
                        System.out.print(ce);
        }


 
39 
 


 
 


 
 
 
 
 
完成後,我們點一下/index.jsp 按一下右鍵,並且 Run,可以執行 Strtus
程式。
 
 
我們可以看到已經開啟 index.jsp 的頁面。
 
 
 
我們先行輸入 tingnet/12345,確定是否可以成功登入。


 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
40 
 


 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 


 
 
 
 
 
因為我們的正確帳號密碼是 tingnet / oracle以經過 Action Class 理,
 
Strtus 會導 Failure.jsp 中。
 
我們點剛剛的 linkto/index.jsp,可以回到 /index.jsp可以改一下密碼,將密碼改成 oracle
 
 
如下圖,我們的帳號和密碼為 tingnet / oracle
 
 
 
 
如下圖,系統成功登入。
 
在上一章,我們已經談過 ADFView Object Application Module,那到底怎麼用,我們怎麼利用 OracleADF 來開發前端的介面,這些前端可以是Web 介面或 JClient畫面,所以本章我們先來談前端的設計,如何將已經弄好的 Model 示出來,先看一下畫面,會比較有信心,我們接下來會實做範例。
 
 
我們先來建立一個 Master-Detail 的畫面,體會一下,ADF Framework怎麼來開發,看一下整個流程。
 
 
 
 
回想一下上一章最後的結果,我們建了一個 HrAppModule,裡面有一個
 
Master-Detail的結構,分別是 ManagersView1是代表 Master EmployeesView2
 
則是裡面扮演 Detail 的角色,接下來繼續看喔。
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 


 
 
 
 
 
我們先從 Oracle Business Components Browser來看一下 Master-Detail,選一下
 
Test
 
 
我們可以看到 MasterManagersView1
 
 
 
 
 


 
 
 
 
 
同時間,來看一下單純的 Employees檔,接下來看一下 EmpManagerFkLink1
 
 
 
 
View Link 則是一個 Master-Detail的關係,當 Master Data 已經更改,則
 
Detail 的資料也會同步變更,接下來我們看如何 JSP Page
 
 
 


 
 
 
 
 
我們可以看一下有兩個 Project分別是 Model ViewController如果只有 Model
 
Project,則需要自己新增一Web Project
 
 
建好選一下 ViewController 按一下右 Open Struts Page Flow Diagram
 
 
 


 
 
 
 
 
這樣 Oracle JDeveloper 則會開啟 Struts-config Diagram提供您一個開發 Struts
 
的圖形式介面,提供您流程設計。
 
 
 
看一下全畫面,右上角會顯示 Component Palette則可以看到 Struts Pages Flow 的分類,可以提供您拉 Data Page 等等,供您拖拉到 struts-config.xml 中。還有旁邊的 Data Controls,可以提供 ADF Framework Object,會於後面來詳述。
 
 
 
 
 
 
 
 
 


 
 
 
 
 
以下的相關 Component 可以提供你拉 Struts-config.xml,可以讓您在
 
struts-config.xml Diagram
 
1.   Page可以代表一個 JSP Page一般來說是給傳統 Struts使用,不會用於 ADF Framework,除非有拉出 Forward,否則不會新增設定到 Struts-config.xml
2.   Data Page:可以代表一 JSP Page 或是 UIX Page,但是可以拉入 ADF Object,作 ADF Data Model 的前端使用者介面(User Interface,可以將 Data Controls ADF Object 拉入。
3.   Action:代表是一個傳 Action,可以提 Struts Action,它是延伸 org.apache.struts.action.Action以提供傳統 Struts 的邏輯設決定某一些Action,並且導向哪一 Forward
4.   DataAction:相同的,DataAction則是代表某種 Action,但是 Action 卻可以使用 ADF Object,一般來說,DataAction是拿來 Query Data,但是在一些複雜的 ADFApplication需要將 DataAction開,某些拿來建立資料,刪除資料或是查詢資料,而它是延伸 org.adf.controller.struts.DataAction
 
5.   Forward:這是標準 Struts forward,可以連結任兩 Data Page 或是 Data
 
Action,可以經過某一種邏輯,利 Forward 導向不同的 Data Page
 
6.   Page Link:代表一個 Struts HTMLLink,可以導到不同的 Page
7.   Page Forward:是一個 Page 的連結,至於 Page Forward Forward 會很容易混,Forward 一般來說是某 Avtion 可以有多 Forward Page Forward 則是某個 Action 只有一 Forward,只是純粹導向。
 
8.   Note:就是說明的圖示。
9.   Attachment:則是兩個 Note 的連結等等。 PS:本部分解釋或許不是很清楚,如果有錯,請指正,不然也可以參考 Oracle JDeveloper10gHandbook
 
 
 
 
 
 


 
 
 
 
 
首先我們先新增一個 Note,來說明 Struts-config.xml 的說明,選一下,拉到
 
struts-config.xml 這個 Diagram
 
 
如下圖,我們已經拉了一個 Note,並且進行相關文字輸入。
 
 
如下圖所示,可以調整一下該 Note 的長度,應該會比較好看。
 
 
一樣的,拉 Data Page Struts Diagram,準備建立 JSP Page Query Data
 
 
 
 
 
 
 


 
 
 
 
 
如下圖,拉出一個圖,可以看到預設會 /dataPage1我們可以改一下名稱
 
 
我們改一下 Data Page 的名稱,更改名稱為 /browse
 
 
有沒有注意圖上有一個驚嘆號,代表實體的 JSP Page 尚未建立,可以直接點兩下該圖,可以跳出 Create Page Diagram,預設會帶 Data Page Name
 
 
可以在導覽區看到 browse.jsp 已經被建立,並且預設是編 browse.jsp 這個檔案,準備來建立相關的 ADF Object
 
 
 
 
 
 
 
 
 


 
 
 
 
 
在繼續看範例之前,先來說一些基本觀念。
 
 
 
 
 
JSP Page                                             JSP Page
 
 
 
Binding Context
 
 
 
Binding Container                           Binding Container
 
 
 
 
 
 
 
 
 
 
 
Data Control                                    Data Control
 
 
 
 
 
 
 
 
 
 
 
ADF BC                              Other Business Services
 
 
 
本圖來自於 OracleJDeveloper10gHandbook


 
 
 
z     Data Control
 
                      tionADFApplica


 
 
 
 
一般來說,前端的 View應該不會直接去 AccessADF


BC 或是其餘的 Business Services,所以 Data Control 應該可以算 Business Services 的一個前端介面,如果沒 Data Control 話,需要使用不同的 API AccessADF BC 但是 ADF Framework提供一個 Data Control固定式的 API 端對 Data Control 其餘和後端 ADF BC 的處就交給 Data Control 來處理。
 
z     Binding Containers


 
本身可以將其想成是一


 Page 的區塊,每一個 Binding Containers  可以代


表一些功其中一部份可以是去瀏覽 DeptTable(部別檔 Page 另一塊可以有另一個 Binding Container以瀏覽 EmployeeTable(員工檔)且員工檔可以進行編輯,達成 Master-Detail   Page,所以本身 Binding
 
 
 
 


 
 
 
 
Container  是一個 Java Object,可以提供 ADF Framewor在一個 Page  Form Binding
 
¾     IteratorBindings
此種 Binding 是代表一組 Collection Data,可以從頭到尾瀏覽相關資
料,一般而言,通常代表一個 ADFView Object,而這個Binding 則是其餘型態 Binding 的基礎。
 
¾     Range Bindings
也就是上述的 Iterator Bindings 的一個延也就是 Collection 的一個
 
區段的資料,也就是侷限的 Collection,也就 Range Bindings
 
¾     AttributeBindings
在一筆資料中,代表我們的 Attribute Name,也就是 Metadata,所以通
 
常代表是 Label(標籤
 
¾     ListBindings
代表是給予一個 LOVList OfValue件, LOV  的資料可以來
 
自於固定值或是一個 Collection
 
¾     ActionBindings
送一個 Comman Business Services如更改目前存取資料列或是
 
Commit RollbackTransaction
 
看完了上的說大致針對 AD的概念進行說以下我們會來示範相關的
範例,都會間接和直接用到上述的 Binding,所以接著看下去吧。我們先來選一下 ManagersView1 View Object,並且於屬性上 Read-Only
 
Form,先建立 ManagersViewForm,直接拖拉到 JSP 空白面上。


 
 
10 
 


 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 


 
 
 
 
 
可以看到 JSP Page 已經建立一個 ManagersView Read-Only Form
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
接下來,我們可以看 Oracle JDeveloper Structure 區,可以看 ADF已經建立一個 html form,可以在 Structure 區看到JSP Page 結構。


 
 
 
 
 
以下是可以看到 JSP Page UIModel                                    以下您可以看到幾個重
 
1. ManagersView1Iterator


 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
首先可以看到
 
 


也就是 IteratorBinding,會將整個 View Object 建立一 Collection Data,可以 ADF Framework 整個從頭到尾瀏覽一遍。
 
2. ManagersView1
 
代表是 Range Binding,也就是可以說是代表一個侷限的範圍,因為從 View
 
Object 的角度來說,你會限制某一些資料。
 
3. EmployeeIdLastNameSalaryJobId  NumReports 等等:
這些都是屬於 Attribute Binding,也就是欄位的 Label,也可以說是 Metadata所以等會我們來看一下 JSP 的程式。


 
 
1
 


 
 
 


 
 
 
 
 
 
 
 
 
 
Iterator Binding
 
 
Range Binding
 
 
Attribute Binding
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
ManagersView1Iterator


 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
12 
 


 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 


 
 
 
 
 
ManagersView1
 
 
 
 
 
 
Attribute Binding


 
 
 
 
 
 
 
 
 
 
 
 
13 
 


 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 


 
 
 
 
 
我們可以直接點一下 EmployeeId這個 Attribute Binding,會幫我們開啟 Attribute
 
Binding Editor,您可以再來決定是不是需要額外有新增的欄位等等。
 
 
 
我們回到 JSP Page 中,可以看到剛剛建立的 Read-Only Form,也就是一個唯讀 Data Form,左邊是標籤,而右邊是實際欄位。


 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
14 
 


 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 


 
 
 
 
 
我們剛剛建立一個 Read-Only Form,接下來,我們需要操作這個 Read-Only
 
Form所以我們必須要加入動作,所以我們選到ManagersView1同層的                nsOperatio
 
中的 First,屬性選 Button,並且將其拖曳 Form的上方。
 
 
如下圖,會產生一個 First 按鈕的動作,可以操作 Read-Only Form


 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
15 
 


 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 


 
 
 
 
 
接下來,我們一樣的將 Previous拉到剛剛的 First 後面。
 
 
如下圖所示,我們依序將 FirstPreviousNex Last依序拉好。
接下來,我們來看到 JSP Page browseUIModel,看到多 4 個動作。


 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
16 
 


 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 


 


 
 
 
 
我們來看一下 FirstFirstPreviousNext  Last       本身


 
 
 
Action Binding


 
所以我們直接在 First上點兩下,可以開啟 Action Binding Editor
 
 
可以看到我們正選到 ManagersView1 的動作,並且選到 First,不需要做任何動作,直接按取消。


 
 
 
17 
 


 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 


 
 
 
 
 
我們可以看其中一個動作 NextADF 會使用EL 語法,其中寫法如下。
 
 
我們先來看結直接在 ViewController 右鍵按一 Rebuild程式編譯一下


 
 
18 
 


 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 


 
 
 
 
我們回到 Struts-config.xml 的圖,在 Data Page/browse的圖上按右鍵,並選一 Run,即可以執行該 Data Page,注意,不要直接 Run browse.jsp,因為 Struts 必須要透過 Action去執行。
 
 
 
可以看到 OracleJDeveloper 已經開始啟 Embedded OC4J並且完成初始,準備執行該 Data Page
 
 
如下圖,已經成功執行該 Data Page已經將 ManagersView給顯示出來,可以看到所有主管的資料。


 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
19 
 


 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 


 
 
 
 
 
我們可以點 Next即可以顯示下一筆紀錄 Previous即可以顯示前一筆紀錄
 
 
 
 
當然,First可以直接跳到第一筆,而 Last 則可以跳到最後一筆。
 
 
 
第一個範例已經示範完,關於 ADF Framework 應該有一個基本認識,我們要一 Table Read-Only Report是不是蠻簡單其實 ADF Framework 就是這樣的概念,你應該更加將時間和精神集中於 Model Business Rule,其 ADF幫你做,所以接下來,我們繼續看上一個例子的進階。
 
 
我們切回 browse.jsp,我們來新增一些功能。


 
 
 
20 
 


 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 


 
 
 
 
 
剛剛我們建立了 ManagerView1 Read-Only Form,接下來,我們選
EmployeeView2 這個 View Object EmployeeView2 則是代表 View Link 的另一 View Object,是整 Master-Detail 中的 Detail 部分。
 
選到 EmployeesView2,並且確定 Drag and DropAs:是選到 Read-OnlyTable
 
 
 
 
我們將剛剛選擇的,拉到 ManagerView1下面,如下圖所示:


 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
21 
 


 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 


 
 
 
 
 
我們可以看到 UIModel 中看到加入 EmployeesView2這個 View Object
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
我們將 EmployeesView2 點兩下,可以看到 Table Binding Editor,該
EmployeesView1是在 ManagerView1 的子項目,意味兩者建立一個 View Link可以做出 Master-Detail關係,你可以決定顯示多少欄位,這裡我們不做變更。


 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
22 
 


 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 


 
 
 
 
 
我們同時也加入一個 EmployeesView2Iterator每一個 View Object           生對都會產
 
Iterator Binding
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
我們可以將該 EmployeesView2IteratorRange Size即可以設定一次顯示幾
 
筆,目前設為 10,我們可以更改成 8,則一會顯示 8 筆。
 
 
 
 
如下圖,我們將 Range Size 更改 8


 
 
 
 
 
23 
 


 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 


 
 
 
 
我們為 DetailTable 加入該有動作,我們進行跳動作,所以加 Previous Set意:需要用 EmployeesView2下面的 Options因為是要操控 EmployeesView2
 
 
 
 
一樣的,我們一樣的拉取 Next Set DetailTable 的上方。


 
 
 
 
 
24 
 


 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 


 
 
 
 
 
接下來,我們將現有Table加上一個欄位,所以Table處按右鍵,Table ->Insert
 
Rows Or Column,可以新增欄位。
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
所以我們選 Column,並且選數目是 1


 
 
25 
 


 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 


 
 
 
 
 
如下圖,我們新增一個欄位。
 
 
 
 
 
 
 
 
 
 
 
 
 
ADF 中,有一項動作,可以代表是某一筆資料的 Key,也就是 setCurrentRowWithKey所以我們選擇 setCurrentRowWithKey(String)且該屬性 Find Row Link,並且將其拉到我們剛剛新增的欄位中。


 
 
 
 
 
 
 
 
 
26 
 


 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 


 
 
 
 
 
如下圖,我們已經拉取進來,預設會取名是 Select,可以自行更改。
看一下程式碼,剛剛拉取的部分,新增一行 EL 的程式碼。
 
 
接著,我們將動作 Create 拉進來,預備需要建立一筆新的資料。
 
 
 
如下圖所示,Create 按鈕已經新增好了。


 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
27 
 


 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 


 
 
 
 
 
一樣的,我們將資料刪除動作 Delete,一樣的加入。
 
 
如下圖,我們已經將 Delete 按鈕加入。
 
 
將剛剛修改的 browse.jsp 重新編譯一下,看看是否有錯,一般而言,利用 ADF
 
所拉取的,都應該要是正常可以編譯。


 
 
 
28 
 


 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 


 
 
 
 
 
我們回到 Struts-config.xml,在 browse Action 上按一下右鍵,選擇 Run
 
 
可以看到整個 Master-Detail 的畫面已經建立好,可以開始使用看看。


 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
29 
 


 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 


 
 
 
 
當你點到 EmployeeId 121 按一下 Select會看到游標星星移 121我們目前正選到 121,等會我們就可以透過這個方式連到編輯畫面。
 
 
 
所以你可以試著動一下 MasterTable 料,應該可以看到 DetailTable 也會一起變


 
也可以動一下 DetailTable 所以建立一       asM


ter-Detail HTML Form


 
ADF Oracle JDeveloper 幫助之下,變成非常非常簡單。
 
 
 
 
接下來,我們再來新增一些功能,我們先回到 browse.jsp,請切到 Design 區。


 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
30 
 


 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 


 
 
 
 
 
回到 Data Control Palette,我們來新增一個欄位 List,讓我們可以快速挑選到主
 
管的方式,所以我們選 ManagersView1,並且選擇屬性為:                 ListNavigation      
 
 
我們將 ManagersView1拖拉到 browse.jsp 中,放 Last 後面。


 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
31 
 


 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 


 
 
 
 
我們回到 Components 的區塊,選到 HTML 模組,我們將 Submit Button拉到剛剛所新增的 List 旁邊。
 
 
 
如下圖,我們將 Submit Button拉到該位置放好。


 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
32 
 


 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 


 
 
 
 
看到 Structure 區,已經新增一個元 ManagersView1 List 元件,其中當然也包含一個 Iterator
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
我們直接點兩下,可以開啟 List Binding Editor,看到相關資訊。


 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
33 
 


 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 


 
 
 
 
 
在上圖,我們不需要那麼多欄位,所以將 DisplayAttributes 只選到 EmployeeId


 
LastName            欄位即可,其餘都選這兩個


AvailableAttributes


 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
所以這個 List Binding是使用 ManagersViewIterator,所以我們先選到他。


 
 
34 
 


 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 


 
 
 
 
我們看一下 ManagersViewIterator原來是設 Range Size10可以設定一顯示幾筆,預設是 10
 
我們將 Range Size 更改 -1,意味所有資料都出來。
我們先儲存一下。
 
 
因為我們可以將 Transaction 加入,當我資料有進行異動,可以加入是否需要
 
Commit,所以我們在最外層的 Options,將Commit browse.jsp 中。


 
 
 
35 
 


 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 


 
 
 
 
 
如下圖,我們將 Commit 拉到 First 前面。
 
 
 
 
一樣的,我們將 Rollback 拉到 browse.jsp 中,可以 Transaction進行回復。


 
 
 
 
 
 
 
 
 
 
36 
 


 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 


 
 
 
 
 
如下圖,我們將 Rollback 按鈕新增到         e.jspbrows     
 
 
為了版面美觀,我們新增一行,以區分按鈕屬性。


 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
37 
 


 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 


 
 
 
 
 
可以看到多了兩個 Action Binding,包含 Commit Rollback
 
 
我們先來測試一下,所以先到 Struts-config.xml/browse 按一下右鍵, Run


 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
38 
 


 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 


 
 
 
 
 
可以看到 Page 已經產生,注意已經有多一個 List
 
 
我們可以看到該 List 有員工編號和姓名,我們可以選 123 的主管。
 
 
 
 
按一下 Submit,我們可以看到如何驅動資料。


 
 
 
 
 
39 
 


 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 


 
 
 
 
我們看到 Master Detail 部分,都是跳到主管 123 的資料,也就是我們可以快速跳到主管是 123 的資料。
 
 
我們按一下 Create,雖 Create按鈕目前沒有作用,但是可以觸動 Transacion
 
 
我們看到CommitRollback的按鈕都變成可以按了,可以針對動作進Commit
 
或是 Rollback


 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
40 
 


 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 


 
 
 
 
 
我們回到 Struts-config.xml 中,我們將編輯畫面建立起來。
 
 
我們再來拉一個 Data Page 進來 Struts-config.xml 中。
預設上,會取名為/dataPage1
 
 
我們將 Data Page 名稱更改成/edit
 
 
接下來,我們拉 Forward 連結/browse /edit之間。


 
41 
 


 
 
 
 
 
 
 


 
 
 
 
 
如下圖,由/browse /edit,可以看到一 Forward 就拉出來了。
 
 
我們將 Forward Name success更改成 Create
 
 
接下來,我們繼續加入一個 Forward
 
如下圖所預設上 Forward Name success可以將 Forward Line會比較美觀。
 
 
我們將Forward Namesuccess更改成setCurrentRowWithKey注意任何Forward
 
Name 都會程式習習相關,所以注意大小寫。
 
 
我們先來建立 edit.jsp,直接點兩下來建立 edit.jsp


 
 
42 
 


 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 


 
 
 
 
因為我們需要建立 Detail 部分的編輯畫面,所以我們先選 EmployeesView2並且屬性選到 Input Form,並且拖拉到 Edit.jsp
 
如下圖,預設會建立編輯畫面。


 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
43 
 


 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 


 
 
 
 
 
我們可以看到 Structure 區,會自動幫我們建立相關元件,包括 Iterator 等等。
 
因為我們最後兩列不需要,所以我們點到第五列,並且按右鍵並選 Select Row可以選擇該列。


 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
44 
 


 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 


 
 
 
 
 
當我們已經選到整我們可以按右Table->Delete Row以刪除該列
 
 
一樣的動作,我們將最後一列刪掉。


 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
45 
 


 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 


 
 
 
 
 
如下圖所示,最後兩列已經刪除。
 
 
我們切到 Structure 區,看 ManagerEmpId ManagerName 這兩個Attribute
 
Binding,所以我們必須也要進行刪除。


 
 
 
 
 
46 
 


 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 


 
 
 
 
 
我們按下右鍵,選 Delete,可以讓我 Delete Attribute Binding
 
 
 
我們選 Yes,可以來刪除 ManagerEmpId 這個 AttributeBinding
 
 
 
 
同樣的,我們將 ManagerName AttributeBinding 刪除。


 
 
 
 
 
47 
 


 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 


 
 
 
 
 
一樣的,我們選一下 Yes,可以將該 AttributeBinding 刪除。
 
 
 
 
 
因為我們需要新增一個 Lov,所以我們需要新增一個 Iterator Binding,如下圖,我們可以先選 CreateBinding->Data->Iterator


 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
48 
 


 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 


 
 
 
 
 
如下圖,我們會打開 Iterator Binding Editor,準備建立喔。
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
我們名稱輸入 ManagerIterator,然 Data Collection ManagersView1,可以建立所有主管資料的 Data Iterator


 
 
49 
 


 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 


 
 
 
 
 
Structure 區所示,我們已經建立一個新的 Iterator
 
 
 
 
預設 Range Size 10
 
 
我們先將其變更成 -1,意味所有資料都秀出來。


 
 
 
 
 
 
 
50 
 


 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 


 
 
 
 
 
我們先切回 edit.jsp我們想要建立一個 ListOf Value所以我們將第四個欄位先
 
選起來,然後刪除它。
 
 
如下圖,該文字欄位已經刪除了。


 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
51 
 


 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 


 
 
 
 
 
我們回到 EmployeesView2 這個 DetailView Object,我們找到其中 ManagerId
 
的欄位,然後屬性選擇 List OfValues,並且拖拉到剛剛刪掉欄位的地方。
 
 
 
 
如下圖所示,我們已經將 LOVComponent 拉到 edit.jsp中。


 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
52 
 


 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 


 
 
 
 
 
我們可以看到 edit.jsp中的 Structure 區,有多一 ListBindingManagerId1
 
 
 
我們可以直接將剛剛 ManagerId1點兩下,可以開啟 ListBindingEditor,可以來設定 LOV 的相關設定。


 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
53 
 


 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 


 
 
 
 
 
我們預設需要秀出所有主管資料,所以 LOV Source Iterator ManagerIterator
 
Target Data Collection則是選 Detail 中的主管員工編號欄位,即,當我畫面選到另一個主管,會去 Update Detail 所對應的主管員工編號欄位。


 
 
 
54 
 


 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 


 
 
 
 
 
我們來設定 LOVDisplayAttributes,設定需要顯示多少資料在 LOV 欄位。
我們只要欄位顯示員工編號和姓名,所以只需要 EmployeeId LastName


 
 
55 
 


 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 


 
 
 
 
 
我們先將之前修改的儲存一下。
 
 
我們回到原來的 Struts-config.xml 部分,要設定 Edit browse Forward
 
 
一樣的,我們選 Forward,準備拉到流程圖中。
 
 
一樣的,我們如下圖看到已經拉好了。


 
 
 
56 
 


 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 


 
 
 
 
我們將Forward Namesuccess更改成Submit因為edit.jsp中的按鈕Submit所以對應上我們需要將 Forward Name 更改成 Submit
 
 
我們一樣的,在/browse 中按下右鍵,選 Run,準備執行程式。


 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
57 
 


 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 


 
 
 
 
 
我們看到 JSP Page 已經開起來,可以看到 Master-Detail Page
 
 
 
 
我們選到員工編號是 122 的,準備幫他改所屬直管,點一下 Select
 
 
會切換到 122 的編輯畫面,我們可以將 ManagerId 更改一下,拉下來會顯示所有主管資料,我們將其選到 101 的主管,並且按下 Submit


 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
58 
 


 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 


 
 
 
 
 
可以看到員工編號 122 已經不屬於主管 100 的管轄範        們已經為員工所以我
 
號是 122 的員工,更改了主管,是不是很方便呢。
 
 
 
本章以經結示範了 ADFApplication 的作可以看 ADFApplication方便,建立一個 Master-Detail非常方便,所以利 Data Control 來幫我們建立Application可以充分利用 Oracle JDeveloper ADF 的結合,快速建立整個Web Page 的框架,就可以加快開發速度。
 
 
PS:持續努力喔,期待下一章喔。

    在上一章,我們說到了 Entity Object 和一些基本 Entity Validation 的制訂,所以我們可以將一些相關的 Check,在 ADF Entity 中進行實作,然後如果發生相關 Exception可以透過 ADF Framework 丟給前端的 JSP 或是 JClient 來顯示相關的錯但是在這章我們將要來介紹 ADF 的另一項元就是 Data Model Component其中包含 View ObjectView Link Application Module以下我們將會慢慢針對這些主題一一說明,並且舉出一些例子。

 
 
首先針對之前的範例進行一下版本 Update因為在寫到第 8 前,Oracle 已經最
 release最新版的 Oracle JDeveloper 10g10.1.2,並且已經將原來的 9.0.5.2
的部分修正達 800  Bug所以從這章起,將使用新版的 Oracle JDeveloper 10g
 
 
轉換 Oracle JDeveloper 10g
先到 Oracle OTN 網站下載最新版的 Oracle JDeveloper 10g,網址為: http://www.oracle.com/technology/software/products/jdev/index.html,可以先行下載,一樣的先Unzipc:\ojdev1012的資料夾下,如下圖轉換。
 
先到 c:\jdev9052\jdev\mywork,找到mywork這個資料夾,這個資料夾是所有你之前所做的範例存放區,所以先行將此資料夾複製。
 
 
 
我們到剛剛才 unzip 好的資料夾。
c:\ojdev1012\jdev下按下貼上,將剛剛所複製的mywork 複製到此目錄下,
 
c:\jdev1012\jdev\bin下的 jdevw.exe 捉到桌面當捷徑。
 
 
 
 
目前已經將之前所開發的相關 Project 移轉到新的 Oracle JDeveloper  版本。
打開你的 Oracle JDevloper 10g,點 Applications 中按下開啟舊檔的圖示。
 
選到  mywork 資料夾,Oracle JDeveloper Default  會存放相關的Workspace
 
 
 選到之前的Workspace,一一的開啟起來。
 
例如,點到 AdfOverviewWSWorkspace 中,選到 AdfOverviewWS.jws 這個檔案,這是關於Workspace 的相關主要檔案。
 
 如果你是從舊版的 Oracle JDeveloper 所做的Workspace,來到新版 Oracle
JDeveloper  中打開,則 Oracle JDeveloper會自動幫你做相關的 migrate
 
 
Oracle JDeveloper 自動進行相關程式檔案修正。
 
 如下圖所示,可以將之前的Workspace 做相關的 Import
 
 
 
請剩餘的Workspace 陸續的自行開啟,這樣檔案才能進行mirgate如下圖所示,將之前已經做過的範例一一開啟。
 
 
 
 以上是轉換到 Oracle JDeveloper 1012 版本的作法,轉換到這個版本,可以修
 
Oracle JDeveloper 9052  這個版本將近 800 Bug,所以轉換過來後,我們可
 
以繼續往下看。
 
關於這一章,我們會來談有關於 OracleADF 中的 Data Model Component,在
 
前,我們談到 OracleADF 中含有幾個 Component,之前談過 Entity Object
 
Association等等,接下來,我們會來談有關於 View Object 部分,所以這章結束
 
後,應該可以對於 ADF Framework 有多一點的認識。
 
 
之前談過 Entity Object,會建立和後端 DB 的關係,當然會不會是和 DB Column 則是看你對於 Entity Object是不是選擇 Persistent(持續我們會在 ADF 中建立一個 Entity Cache,暫時 Cache Entity Object 的資料,至於我們本章的重點,Data Model Component,則是可以替我們去 Entity Cache 中去蒐集資料,以便提供給前端的 MVC程式使用,OracleADF 中,並不希望你直接去存取 Entity Object Association 你需要建立 View ObjectView Link Application Module才能給前端介JClient JSP使用,所以我們會漸漸來做說明。
 
 
View Object 中,包含了兩種形式的 View Attribute,分別是 Entity-derived
SQL-only 兩種,Entity-derived view attribute是代表基於 Entiy Object 中的 attribute換言是和 Entity 會有所關其餘的都是 SQL-onlyviewattribute只是一段 SQL去找出你所需要的資我們會在範例中說View 端也有 View Cache,所以在 ADF中會有兩段 Cache,主要是要增加 Performance,所以 ADF 會幫你管理,將資料 Cache Memory中,會提早存取的效能。
 
 
為了能趕緊有所感覺,我們先來看一個例子。
 
 
我們先介紹一下如何用之前所建的 ADF BC  PS本章例子參考 10g Handbook
 
 
先建立一個 ApplicationWorkspace
 
 
 
請輸入名稱:HRAppPrefixhrapp,以及 WebApplicationDefault
 
 
 
如下圖,可以先行 New 出一個新的 ApplicationWorkspace
 
 
 因為我們需要 Import 之前我們所建的 ADFBC,所以我們先在 Model Project
中,按下右鍵並且選擇 Project Properties
 
 
 
如下圖,選到 Paths,並且在 Additional Classpath,選擇  Edit
 
 
 
 
因為我們必須 Import 額外的 ADF BC 進來  Model Project Add Entry
 
因為我們要去 Import HR Project   ADF BC所以我們選到 HR\Model\classes
 
 
 
 
按一下 Select
 
 
確定一下相關路徑,如果沒有問題,可以直接按下 確定。
 
 
接下來,直接點選 FileÎ Import  Import 已經有的 ADF BC
 
 
選擇我們需要 Import 的類型,例如我們需要 ImportADF BC,我應該去選擇
Business Components
 
 
如果還沒有連線,會需要先行建立。
 
選擇好後,可以直接按下確定。確認一下使用者帳號和密碼,也就是 D的帳號密碼。
 
下一步,需要 Import 相關的 XML  檔,所以請將目錄切到之前的 HR Project
下,切換到 HR\Model\classes\hr\model\businessdomain  下選 businessdomain.xml
 
 
 
出現 Impor確認的對話方塊,選擇是否需要將 Object  加入你的新 Project
 
所以我們可以 Import bussinessdomain  Component接著我們來 Import 已有的 Data Model   Component一樣的,我們選一下 檔案 Î Import
 
 
選擇 Business Components 這種類型。
 
 
一樣的,我們選到 HR Project  HR\Model\classes\model  下的  model.xml
 
 
選一下 YES,確定加入 Project
 
 
如下面的圖顯示,因為 HR Project  Model  並沒有建立,所以只會 Import businessdomain  這個  Package
 
 
接著,我們接著建立 DataModel  的相關 Component,所以我們來建立一個
Business Component Diagram,在  Model 上按右鍵,選擇 New
 
 
選擇 Business Components 中的 Business Components Diagram
 
 
 
輸入 NameData Model DiagramPackagehrapp.model.datamodel
 
 
如下圖,我們已經為了 DataModel 部分建立一個 ADF BC UMLDiagram
 
 
 
 
我們之前示範是如何從另一個 Project   ImportADF BC 進入一個新的 Project然你也可以重新建只是說明如何共一般來我個人都是建一份我系統所需要的 ADF BC
 
 
接下來,我們來看一下一些範例,請往下頁看。
 
 
 第二個範例:建立一個簡單的 View Object,包含不同型態 Attribute接著,我們選到 View Object,可以建立一個 View Object
 
 
 
點一下 View Object,並且拉到 Business Component Diagram,如果沒有和資料庫連線,會跳出確認對話方塊,輸入一下密碼確認。
 
 
 
 
我們將 View Object 拉到 Data Model Diagram中,我們可以看到這樣圖示,預設會顯示 ViewObject1
 
 
接著我們將 ViewObject1 改成 JobsView,因為我們必須建立一個 View Object來關連 Job  Entity Object
 
所以我們看到導覽區中的ADFBC中的businessdomainJobs這個Entity Object
向右拉取到 JobView 圖示中(注意:是圖示內)
 
 
拉取好後,如下圖顯示,會看到有一個 Entity Object UsageJob1,所謂 EntityObject Usage 則是在 View Object加入一個 Entity Object則該 Entity Object 則稱 Entity Object Usage,在此引入一個觀念:
1.   Entity-derived view attribute則是該 View Attribute 是基 Entity attribute,也就是說該 View attribute 是和該資料庫有直接關係。
2.   SQL-only view attribute:則是該 View attribute 只是提供 Select,除了
Entity-derived view attribute以外,都可以稱為 SQL-only view attribute
 
將圖放大一點。
 
 
Job1 點兩下,將名稱更改成 Job
 
直接將 JobView 點兩下,可以打開 View Object Editor,如下圖。
 

 

選到 Attributes,預設會將 Jobs View Object View attribute 全選。
 
 
 
JobTitleMinSalary MaxSalary 的欄位選到 Available,僅僅留下JobId
 
 
 
JobId 本身 Entity-derived view attribute為他是基於 Jobs 這個 EntityObject而接著我們來建立一個 SQL-only view attribute我們點下面 New
 
 
 
輸入 NameJobTitleTypeString
 
在下面的Query Column請輸入AliasJobTitleTypeVARCHAR2(35)Expression則是:Job.JOB_TITILE
 
 
 
看一下 Query,其實 View Object另一個層面是在建立一段 SQL,所以剛剛我們
 
 


2
 
 


 
 
 
 
兩個欄位屬性不同,其實是在建立該 SQL,可以按一下 Test,來測試該段 SQL
是否正確,或是看一下 ExplainPlan,可以去看一下 SQLPerformance
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
接下我們來看一下結所以我們必須要建立 Application module好將 View
Object 包裝起來,所以選到 Application Module 並且拉到左邊。
 
如下圖,我們將一個 ApplicationModule 建立好。
 
 


2
 
 


 
 
 
 
 
 
 
 
 
我們將名稱 ApplicationModule1更改成為 TestModule
 
 
 
 
 
 
 
 
 
 
 
 
 
 
JobsView 拉到 TestModule ApplicationModule 中,如下圖。
 
 


2
 
 


 
 
 
 
 
 
 
 
 
如下圖,已經將 JobsView 移到 ApplicationModule 中,可以開始進行測試。
 
 
 
 
 
 
 
 
 
 
 
 
我們到導覽區,可以看到已經有 TestModule加入導覽區,我們選一下右鍵,並
 
 


2
 
 


 
 
 
 
且選擇 Test
 
 
看一下 DB連線資訊,按一下 Connect
 
 
 
 
 
 
 
 
 
 
 


2
 
 


 
 
 
 
我們已經打開 Oracle Business Component Browser我們可以看到兩個欄JobId
可以進行更改,但是 JobTitle 則是單純 Select
 
 
 
所以看一下幾筆,JobId 可以修改,也就是 Entity-derived view attribute JobTitle
則是代表 SQL-only view attribute,接下來繼續看一下例子。
 
 
 


3
 
 


 
 
 
 
 
 
剛剛我們已經示範了一個例子,該 View Object 包含兩個 Attribute,包括 JobId
是和底層的 Entity Object 是互相同另一個 Attribute 則是採用 SQL-only
 Attribute,所以該欄位只能 Select
 
 
 
 
 
 
 
 第二個範例:建立一個簡單的 View Object
當我們點到我們剛剛建立的 DataModel Diagram,我們應該可以在 JDeveloper 右邊看到這個 Component Palatte,如果看不到,可以在最上排的 View 中選到 Component Palatte這個東西打開,我們可以選到 View Object接著將該項拉
 DataModel Diagram
 
 
 
 
 
如下畫面,預設是會帶預設名稱,我們可以將名稱改為 DepartmentView
 
 
 
 
 
 
 
 
 
 
 


3
 
 


 
 
 
 
我們將 DepartmentView點兩下,可以打開 View Object Editor且選 Query
 
 
我們輸入以下的 Query Statement以下是將 EMPLOYEES DEPARTMENTS兩個 Table Join,並且抓出相關欄位。
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 


3
 
 


 
 
 
 
我們按了一下 Test,可以去檢查該 SQLStatement 是否格式正確,以及指出相關問題點發生在哪。
 
 
 
 
先提供一下以下 Query Statement
 
 
SELECTDepartment.DEPARTMENT_ID, Department.DEPARTMENT_NAME, Department.MANAGER_ID, Manager.LAST_NAME
FROM    DEPARTMENTS Department, EMPLOYEES Manager
WHERE Department.MANAGER_ID = Manager.EMPLOYEE_ID
 
 
正確的話,可以看到 Query is vaild,代表 SQLStatement 是格式正確。
 
 
 
 


3
 
 


 
 
 
 
請選一下套用。
 
我們可以將 Attribute可以看到 DepartmentIdDepartmentNameManagerId
 LastName,先選到 DepartmentId,注意,要選上圖的套用喔。
 
 
 
 
 
 
 


3
 
 


 
 
 
 
因為該欄位是 SQL-onlyAttribute,你必須要在整個 View Object Cache 中分辨每一筆資料列的不同,所以在 SQL-only  M,你必須要選 KeyAttribute,使得 DepartmentId 成為一個 Key 欄位,可以進行分辨資料列,接著,按一下確定。
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
我們將該 DepartmentView View Object 圖示,拉到我們的 TestModule 中,方
便我們將 View Object包裝成 Application Module
 
 
 
 
 
 
 
 
 
 
 
 


3
 
 


 
 
 
 
接著,我們在 TestModule 按一下右鍵,選一下 Test
 
 
 
選一下 Connect,可以連接到 Oracle 資料庫。
 
 
 
 
 
 
 
 
 


3
 
 


 
 
 
 
我們看到 DepartmentsView1,可以看到我們剛剛所設的 SQLStatement,已經成功的 Select因為我們 DepartmentId有勾 KeyAttribute所以我們才能分辨不同的資料列。
 
 
 
我們找到 DepartmentId 90 的,將 DepartmentNameManagerial更改名稱。
 


3
 
 


 
 
 
 
DepartmentName 更改 plural,並且選擇 Commit,將資料 Commit
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
接著我們關掉 Oracle Business Component Browser,我們再來開啟一次,可以找
 DepartmentId 90的,可以看到結果為:
資料不變,因為我們是實做 SQL-OnlyViewObject,所 ADF BC不會幫你
Commit,所以本例子介紹 SQL_Only 的用法。
 


3
 
 
 


 
 
 
 
剛剛我們看到了兩個例子,包括我們建立兩個 View Object,其中一個是示範該 View Object 包含 Entity-derived view attribute SQL-only view attribute,另外一個例子,則是單純我們直接輸入 Query Statement,建立 SQL-only view Object示範如何使用。
緊接我們要來示範一個例我們建立一個 View Object 包含兩個 Entity
Object Usage,看看如何使用。
一樣的,我們選一下 View Object,並且將其拉到 Data Model Diagram中,所以可以協助我們建立 View Object
 
 
如下圖,我們將 View Object 拉好,並且定義名稱為 EmployeesView,且我們到導覽區看一下,我們可以看到已經建立一個 EmplyeesView,接著,我們即可以開始加入 Entity Object成為 Entity Object Usage
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 


3
 
 


 
 
 
 
我們先選到導覽區的 Employees Entity Object,並且拉到剛剛所建立的
EmployeesView中,預設時,Entity Object Usage 會命名成 Employees1
 
 
 
一樣的,我們將 Entity Object Usage 重新命名為 Employees
 
 
 
一樣的動作,我們再去導覽區拉一個 Employees EntityObject 進來
EmployeesView中,並且更名成為 Manager,如下圖。
 
一樣的,我們在 EmployeesView上直接點兩下,可以協助我們開啟 View Object
Editor,我們可以繼續看以下內容。
 
 
 
 
 
 
 
 
 
 
 
 
 


4
 
 


 
 
 
 
打開 View Object Editor 後,可以看到已經有兩個 EntityObject 已經被選擇,其中兩個都是屬於 Employees這個 Entity Object
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
我們點到 Manager(Employees)上,因為我們是用了兩次 Employees這個 Table
所建立的Entity Object所以View Object本身就是在建立一段SQL所以本View Object 是在建立員工和主管的關係,所以必須拿員工檔中的主管員工編號欄位和另一個員工檔的員工編號欄位進行 Join,建Where 條件。
所以確認 Association End ManagerIdE… Reference 的勾勾要打勾。因為當主管員工編號異動,則所有對應會立即更動,就需要打這勾勾。
 


4
 
 


 
 
 
 
接著,我們選到 Attributes 上,可以看到預測上,所有欄位都會全選,所以會看到那麼多欄位,但是我們並不需要那麼多,所以選全部向左,移除掉欄位。
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
當已經選好,會跳出警告訊息,因為至少需要選擇一個欄位,所以按一下 OK
選擇你所需要的欄位。
 
 
 
 
 


4
 
 


 
 
 
 
所以我們選幾個欄位,包括 Employees中的 EmployeeIdLastNameEmail
ManagerId,選擇向右選擇,可以將這些欄位拉到右邊。
 
一樣的,我們針對 Manager 這個 Entity Object Usage 中,我們選兩個欄位,包括
EmployeeId LastName
 
其實以上的動作,就是在建立 SQL 中的 Select XXX,XXX fromtable where…..
其中 XXX即為我們所選的欄位。
 
 


4
 
 


 
 
 
 
我們將剛剛所選好的欄位選到右邊,如下圖所示:
 
 
我們切到該 Attributes 的選項,我們可以看到剛剛已經選到的欄位,我們可以看到一個欄位 EmployeeId1因為已經有一個 EmployeeId所以該欄位才會更名成這樣名稱。
 
 
 
 
 


4
 
 


 
 
 
 
所以我們將該名稱更名成:ManagerEmpId
 
 
 
同樣的,我們將 LastName1 更名 ManagerName,以便於辨識該名稱。
 
 
 
 
 
 
 


4
 
 


 
 
 
 
我們切到 Query 選項,我們可以看到產生的 SQLStatement,其實我們之前的動作,都是在建立這段 SQL,這是很重要的觀念。
 
 
 
確定我們看到 hrapp.model.datamodel 中有一個 View ObjectEmployeesView先行進行存檔。
 
 


4
 
 


 
 
 
 
我們回到 Data Model Diagram我們已經完成建立 View Object們接著需要將
 View Object 加入 Application Module,所以我們將該 View Object 拉到
ApplicationModule
 
 
 
 
 
 
 
如下圖,我們已經將該 View Object 拉入 Application Module
 
 
 
 
 
 
 
 
 
 


4
 
 


 
 
 
 
我們直接 Run Oracle Business Component Browser,可以看到該畫面,我們看到其中一個 View Object則是 EmployeesView1,我們先行選擇該 View Object
 
 
 
我們去找到 EmployeeId 201,我們注意一下,我們的 ManagerId
ManagerEmpId應該是需要同步,因為該欄位互相 Join,所以應該一樣。
 
 


4
 
 


 
 
 
 
我們將 ManagerId 更改 101因為該 View Object 是基 Entity Object 的,應該會和 DB 同步,所以更改完後,我們先行 Commit,並且關掉視窗。
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
我們重新打開 Oracle Business Component Browser,找到員工編號是 201 的,因
為剛剛我們更改已經 Commit進入資料所以當我們再次要就已經是我們新改的值,且 ManagerId ManagerEmpId 是一樣的。
 
 


4
 
 


 
 
 
 
我們再來看一下另外的例子,我們也可以使用專家模式,直接撰寫 SQL 來建立我們的 View Object,接下來,就是相關的範例。
我們可以從 Component palette中將 View Object  Data Model Diagram
 
 
 
我們可以在 Data Model Diagram中看到已經拉好圖示,意,我們已經將 Default
的名稱改掉,改成 ManagersView
 
我們回到導覽區,將剛剛的 Employees Entity Object 選好,直接拉到
ManagersView中。
 


5
 
 


 
 
 
 
如下圖所示,我們已經拉好相關 Entity Object,這裡我們稱為 EntityUsage
 
Entity Usage的名稱 Employees1更名成為 Manager
 
我們直接在 Data Model Diagram中的 ManagersView點兩下,可以打開 View
Object Editor
 
 
 


5
 
 


 
 
 
 
我們選到 Attributes可以看到 Employee 這個 Enitty Object 所有欄位,但是我們不需要那麼多,所以我們移除全部欄位,除了 EmployeeId以外。
 
實務上,我們會全部移除,再來新增,我個人認為比較好。
 
 


5
 
 


 
 
 
 
如下圖,只剩下一個 EmployeeId,這是透過 Entity Object 取的。
 
切到 Query 選項,可以看到實際 SQL 如下,準備來使用專家模式。
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 


5
 
 


 
 
 
 
我們勾了 Expert Mode,接下來我們輸入以下 SQLStatement
 
 
 
 
 
輸入以下的 SQLStatement
 
 
SELECTManager.EMPLOYEE_ID, Manager.LAST_NAME, Manager.SALARY, Manager.JOB_ID,
COUNT(Reports.EMPLOYEE_ID)AS NUM_REPORTS FROM EMPLOYEES Manager, EMPLOYEES Reports
WHERE Manager.EMPLOYEE_ID = Reports.MANAGER_ID GROUPBYManager.EMPLOYEE_ID,
Manager.LAST_NAME, Manager.SALARY, Manager.JOB_ID
 
我們另外 Join 一個 Employee Table,將 EmployeeId ManagerId 進行 Join並且進行 Group By,如上 SQLStatement 所示。
 
 
 
 


5
 
 


 
 
 
 
寫完後,我們可以選一下 Test,測試一下 Query 正不正確。
 
接下來,我們來建立 Attribute Mapping
 
 


5
 
 


 
 
 
 
因為我們剛剛在於 Entity Object 我們只選到 EmployeeId所以只有該欄位是 Entity ObjectAttribute其餘都是 SQL-onlyAttribute我們可以重新定義 Attribute Mapping所以我們將 LastName拉下來,可以選到 Managers下的 LastName,換言之,就是該欄位變成 Entity Object Related,不再是 SQL-only attribute
 
一樣的,JobId 也一樣進行更動 Attribute Mapping
 
 
 


5
 
 


 
 
 
 
接下來,我們必須將該 View Object 進行包裝,所以我們需要將 View Object 拉到
TestModule中。
 
 
 
如下圖所示,可以看到已經大致包裝好。
 
一樣的,我們選一下 Test,去啟動 Oracle Business Component Browser
 
 
 
 
 


5
 
 


 
 
 
 
選一下 Connect,來進行測試。
 
選到 ManagersView,我們找到 employeeId 101 的,我們看到 LastName
Kochhar,因為該欄位已經是 Entity Related,所以我們更動一下值。
 


5
 
 


 
 
 
 
我們將 LastName 更改成為 Kochhar2,並且進行 Commit,我們切回
EmployeesView1中。
 
可以看到 LastName 已經可以更改成為 Kochhar2,因為該欄位是 Entity Object
Attribute,而其他欄位則是 SQL_only,所以改值也不會更動。
 


5
 
 
 


 
 
 
 
接下我們來談 View Link ApplicationModuleView Link 可以說是底層就
 Association何謂 Association就是兩個 Entity Object的關係,一般來說,
FK View Link 是兩個 View Object的關之前提View Object 本身就是一段 SQL所以 View Link 是兩段 SQL Join Master-Detail的關係。其中有包括 1 對多、1 1、多對多等等,詳細請參閱 Database Design
 
 
關於 Application Module簡單的說,就是將所有 EntityObjectAssociationView Object View Link 的東西,全部打包成一包,包成一個 Aopplication Module可以提供給予前端 View 作為 Model其中 Application Module 可以是巢狀式,以是 Application Module 包另一個 Application Module以可以因應需求使用,基本上,你應該不用針對 Application Module做任何事,除非需要進階使用,之後,我們也會看到相關的範例。
我們來看一下一個簡單範另外的進階範請參考 OTN 或是 10g handbook我們持續使用前面範例的東西,我們之前共建立了 4 View Object和一個
ApplicationModule,我們接下來示範一下 View Link ApplicationModule
 
 
 
 
 
 
 
 
 
 


 
 
Data Model Diagram
我們先於 Component 中選到View Link,並且拉到
 
 


6
 
 


 
 
 
 
我們從 ManagerView EmployeesView,來建立 View Link
 
 
如下圖所示,Default View Link 已經建立好,接下來,我們進行修改。
 
 
 
 
 
 
 


6
 
 


 
 
 
 
我們點到該線,可以看到該View Link名稱和SourceAccessor NameDestination
Accessor Name,所以我們可以將 ViewLink1 點兩下,讓該處可以變成編輯。
 
如下圖,我們將 View Link Name 更改一下。
 


6
 
 


 
 
 
 
我們將 View Object 更名為 EmpManagerFkLink
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
我們直接將 EmpManagerFkLink點兩下,可以打開 View Link Editor
 
 
 


6
 
 


 
 
 
 
這兩個 View Object 的關係,可以於 Cardinality 選取相對的關係,因為
ManagerView EmployeesView是適用 0…1 to *,所以我們選第一個。
 
 
 
我們看一下 View Link SQL,這邊是表示 SQLWhere,也就是條件句,也就是員工檔中的主管員工編號去 Join 主管員工編號,可以達成 Master-Detail關係。
 
 
 


6
 
 


 
 
 
 
看一下 View Link Properties,因為我們選 0…1 to *所以 Accessor Name 只有一邊可以編輯,有時候,這個名稱是蠻重要的。
 
 
 
我們可以將 DestinationAccessorName 更名 ReportsView
 
 
 
 
 


6
 
 


 
 
 
 
我們之前的 TestModule,是我們上一個範例的測試 ApplicationModule,所以我們先去除掉,再建立一個新的,所以我們先在 TestModule 中按一下右鍵,選一
 Erase fromDisk,可以將 TestModule 清除掉。
 
 
 
接下我們可以在 Component 中選到 Application Module拉到 Data Model
Diagram
 
 
 
 
 
 
 
我們將 DefaultApplication Module Name 更名 HrAppModule
 
 


6
 
 


 
 
 
 
將剛剛所拉好的 Model,拉到 HrAppModule,即可以建立好 HrAppModule
 
 
 
一旦拉好,如下圖所示:
 
 
 
 
 
 
 
 
 
 
 
 
 
 


6
 
 


 
 
 
 
在導覽區按一下 HrAppModule,並且按右鍵選一下 Test
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
選一下 Connect
 
 


6
 
 


 
 
 
 
你可以看到 EmpManagerFkLink1 這個 Node可以看到相關的 Master-Detail的關係,當然之後這些都可以提供 View 端,成為 Model
 
 
 
一樣的,在 HrAppModule 中,不止有 EmpManagerFkLink Model,同時也有單純的 EmployeesView1 View Object,都可以提供前端 View 使用。
 
 


6
 
 


 
 
 
 
在這 8 章完成ADFBC已經大致告一段不敢說所有觀念都但是希望可以讓大家對於 OracleADF BC有多一點認識,接下來的章節中,我們會來介紹 View 端,至於其餘進階章節會陸續加入,希望大家持續加油。