深入浅出Oracle之ADF学习笔记-Oracle EBS技术文档_第1页
深入浅出Oracle之ADF学习笔记-Oracle EBS技术文档_第2页
深入浅出Oracle之ADF学习笔记-Oracle EBS技术文档_第3页
深入浅出Oracle之ADF学习笔记-Oracle EBS技术文档_第4页
深入浅出Oracle之ADF学习笔记-Oracle EBS技术文档_第5页
已阅读5页,还剩109页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

DocRef:REFDocRefNumber<DocumentReferenceNumber>REFDocTitle信息技术最佳实践REFLastDateMarch9,2011STYLEREFHD2OpenandClosedIssuesforthisDeliverableIfSection2>1“DateAuthorVersionChangeReferenceCREATEDATE\@"d-MMM-yy"9-Mar-11<zhihao.dai>Draft1aNoPreviousDocumentReviewersNamePositionDistributionCopyNo.NameLocationLibraryMasterProjectLibraryProjectManagerNoteToHolders:Ifyoureceiveanelectroniccopyofthisdocumentandprintitout,pleasewriteyournameontheequivalentofthecoverpage,fordocumentcontrolpurposes.Ifyoureceiveahardcopyofthisdocument,pleasewriteyournameonthefrontcover,fordocumentcontrolpurposes.ContentsTOC\o"2-3"DocumentControl i1. 深入浅出ADF-入门 11.1. ADF简介 11.2. 环境搭建 11.3. 简单查询 12. 深入浅出ADF-基础 12.1. 简单增删改 12.2. 复杂增删改 12.3. 页面流PageFlow 12.4. 工作流Tastflow 12.5. 常用布局 12.6. 基本组件 12.7. 可视化组件 12.8. 操作组件 12.9. 样式 13. 深入浅出ADF-高级 13.1DataControl 13.2 安全性 14. OpenandClosedIssuesforthisDeliverable 1OpenIssues 1ClosedIssues 1PAGE10深入浅出ADF-入门ADF简介概述Oracle应用开发框架(OracleADF)是一个端到端的应用框架,它构建在J2EE标准及开源技术之上,简化并加速面向对象应用程序的构造。如果你准备开发企业级的应用,完成查找、显示、创建、修改及校验功能,并以WEB、无线、桌面或者WEB服务的形式来表现的话,OracleADF可以简化你的工作。以拖放的方式进行数据绑定,可视化的用户界面设计,支持团队开发。特征开发环境:大部分J2EE框架都没有与之配套的开发工具,ORACLE为ADF提供了JDEVELOPER开发工具,它和ADF实现了完美的结合,方便了程序的开发。2)平台独立:ADF能够运行在任何符合J2EE标准的应用服务器上。3)技术选择:对于应用程序的不同层,开发人员可以使用自己擅长的技术进行开发。4)端到端的解决方案:ADF不只关注应用程序的某一层,而是对应用程序的每一层,都提供了完整的解决方案。架构OracleADF也是基于工业标准J2EEMVC设计模式的,ADF把应用程序分成了四层BusinessService层BusinessService层包括三个小层,分别是持久层(PersistentBusinessObjects),数据访问层(DataAccess)和接口层(ADFApplicationModule)。这三层建立的顺序是这样的,先建立持久层的实体对象(EntityObject),然后建立数据访问层的视图对象(ViewObject),最后建立接口层。其中建立持久层的实体对象主要是和数据库的表或者同义词对象建立关联,数据访问层的视图对象(ViewObject)是基于实体层的实体对象建立的,主要是进行数据库的访问,而接口层是整个BusinessService层和Model层的接口,在数据访问层建立的视图对象需要注册到接口层中,这样在Model层中才可以访问。Model层该层包括两部分,分别是ADFBindings和ADFDataControl,其中ADFBindings是ADF提供的一种绑定技术,ADFDataControl是指我们已经在接口层中注册的视图对象(ViewObject)。这一层在实际开发中基本不需要开发者做太多的工作。Controller层ADF在Controller层中扩展了APACHE基金会的STRUTS框架,它为Struts提供了一个页面流转图,以简化应用程序的开发。开发者可以简单地拖拽Struts的组件到这个图表中,这个图表会自动地同步更新Struts-config.xml文件,其中我们最常用的是DataPage组件,该组件的作用主要是建立一个页面,并且自动为其建立一个DataForwardAction,如果我们有一些自定义的方法,也可以写一个Action,然后覆盖DataForwardAction。View层在View层可以采用ORACLE的UIX技术,它里面定义了大量功能强大的组件。OracleJdeveloper在View层提供了一个可视化的布局编辑器,开发者可以使用组件面板向应用程序添加可视化的组件,并可以运用属性编辑器(PropertyInspector)来定义这些组件的属性。可视化的编辑器是和源码同步的(类似微软的C#),所以开发者可以选择自己喜欢的开发方式。环境搭建安装JDeveloper11g下载地址:/technetwork/developer-tools/jdev/downloads/index.html在Windows系统的环境变量中配置JDEV_USER_HOME,值为F:\jdevADF\jdevhome\jdev配置数据库连接Oracle数据库链接配置配置mysql数据库路径:Oracle\Middleware\Oracle_Home\jdeveloper\jlib加入mysql的驱动jar路径:tool->perferences->database->jdbcdriveroption简单查询创建组件创建表(基于mysql数据库)Createtablecux_user(user_idint(11)

NOT

NULL

AUTO_INCREMENT

,Usr_namevarchar(200),Sexvarchar2(200),Ageint,birth_daydate,phone_numbervarchar2(200),

PRIMARY

KEY

(user_id));Insertinto"cux_user"("user_id","user_name","sex","age","birth_day","phone_number")values(1,'daizhihao','men','10','2014-12-12',);Insertinto"cux_user"("user_id","user_name","sex","age","birth_day","phone_number")values(2,'daizhihao','men','20','2014-12-12',);Insertinto"cux_user"("user_id","user_name","sex","age","birth_day","phone_number")values(3,'daizhihao','men','30','2014-12-12',);Insertinto"cux_user"("user_id","user_name","sex","age","birth_day","phone_number")values(4,'daizhihao','men','40','2014-12-12',);创建一个Application,并且创建一个Project创建完成后可以看到有两个文件Model和ViewController右键model创建业务组件输入表名和EO的名称,然后下一步选择NewFromTable6)如果表中存在组件的话,勾上主键标示,并且给一个序列如果是oracle数据库,可以在values填入(neworacle.jbo.server.SequenceImpl("序列名",adf.object.getDBTransaction())).getSequenceNumber()如果是mysql数据库,请参考:/blog/kcccss111/262870597)勾选上CreateMethod和RemoveMethod8)同时创建VO和AM,并修改包名9)点击完成创建查询右键ViewController新建一个JSF页面刷新DataControl添加查询条件:VO->QUERY->ViewCriterid->添加新建一个查询条件之后在DataControls下面会生成一个查询条件(本自动生成的是针对所有的字段进行查询的)拖拽查询条件到界面上结果8)运行页面,没有添加任何代码一个简单的查询就完成复杂的查询有时候上面的查询方式并不能满足更加灵活的查询需求,通过代码的形式查询。新建查询条件,和一个带有pannelCollection布局的Table双击搜索按钮添加一个事件给age绑定(binding)一个java变量自动生成set和get方法publicvoidsetAge(RichInputTextage){this.age=age;}publicRichInputTextgetAge(){returnage;}在生成的类的doQuery添加如下代码publicvoiddoQuery(){//Addeventcodehere...Stringq_age=(String)this.sex.getValue();//System.out.println(q_age);DCBindingContainerdc=(DCBindingContainer)BindingContext.getCurrent().getCurrentBindingsEntry();DCIteratorBindingiter=dc.findIteratorBinding("UserVO1Iterator");//获取VO的迭代器ViewObjectvo=iter.getViewObject();//获取VOvo.setWhereClause(null);vo.setWhereClauseParams(null);vo.setWhereClause("age>="+q_age);vo.executeQuery();}运行深入浅出ADF-基础简单增删改添加创建和删除功能ADF的DM相对于OAF的开发已经简化了很多,集成添加删除修改的事物的处理,本节介绍使用代码形式的增删改。在界面上添加删除、添加、保存三个按钮双击添加、删除、保存按钮,生成对应的方法publicvoiddoAdd(){//Addeventcodehere...}publicvoiddoDelete(){//Addeventcodehere...}publicvoiddoCommit(){//Addeventcodehere...}给AM和VO添加相关联的java类给添加、删除、保存按钮添加事件方法publicvoiddoAdd(){//Addeventcodehere...DCBindingContainerdc=(DCBindingContainer)BindingContext.getCurrent().getCurrentBindingsEntry();DCIteratorBindingiter=dc.findIteratorBinding("UserVO1Iterator");//获取VO的迭代器ViewObjectvo=iter.getViewObject();//获取VORowrow=vo.createRow();/*/*这里新增的时候主键是自动增长的oracle使用这种方法双击VO,打开Attribute标签页在弹出的窗口中选择DefaultValueType为“Expression”,value的值为:(neworacle.jbo.server.SequenceImpl("序列名",adf.object.getDBTransaction())).getSequenceNumber()使用mysql的序列方式参考:/blog/kcccss111/26287059*/*/row.setNewRowState(oracle.jbo.Row.STATUS_NEW);vo.insertRow(row);}publicvoiddoDelete(){//Addeventcodehere...DCBindingContainerdc=(DCBindingContainer)BindingContext.getCurrent().getCurrentBindingsEntry();DCIteratorBindingiter=dc.findIteratorBinding("UserVO1Iterator");//获取VO的迭代器ViewObjectvo=iter.getViewObject();//获取VOUserVORowImplrow=(UserVORowImpl)vo.getCurrentRow();row.remove();}publicvoiddoCommit(){//Addeventcodehere...ApplicationModuleam=Configuration.createRootApplicationModule(serviceDefinition,serviceConfig);AppModuleImplUserAM=(AppModuleImpl)am;am.getTransaction().commit();}运行复杂增删改新建三个表建表语句(基于oracles数据库)-员工表CREATETABLECUX.CUX_ADF_TEST_EMPLOYEE(EMPLOYEE_IDNUMBERNOTNULL,EMPLOYEE_NUMBERVARCHAR2(100)NOTNULL,EMPLOYEE_NAMEVARCHAR2(100)NOTNULL,EMPLOYEE_DESCVARCHAR2(240),EFFECTIVE_DATE_FROMDATENOTNULL,EFFECTIVE_DATE_TODATE,JOB_IDNUMBER,DEPARTMENT_IDNUMBERNOTNULL,CREATION_DATEDATEDEFAULTSYSDATENOTNULL,CREATED_BYNUMBERDEFAULT-1NOTNULL,LAST_UPDATED_BYNUMBERDEFAULT-1NOTNULL,LAST_UPDATE_DATEDATEDEFAULTSYSDATENOTNULL,LAST_UPDATE_LOGINNUMBER,ATTRIBUTE_CATEGORYVARCHAR2(30),ATTRIBUTE1VARCHAR2(240),ATTRIBUTE2VARCHAR2(240),ATTRIBUTE3VARCHAR2(240),ATTRIBUTE4VARCHAR2(240),ATTRIBUTE5VARCHAR2(240),ATTRIBUTE6VARCHAR2(240),ATTRIBUTE7VARCHAR2(240),ATTRIBUTE8VARCHAR2(240),ATTRIBUTE9VARCHAR2(240),ATTRIBUTE10VARCHAR2(240),ATTRIBUTE11VARCHAR2(240),ATTRIBUTE12VARCHAR2(240),ATTRIBUTE13VARCHAR2(240),ATTRIBUTE14VARCHAR2(240),ATTRIBUTE15VARCHAR2(240));ALTERTABLECUX.CUX_ADF_TEST_EMPLOYEEADDCONSTRAINTCUX_ADF_TEST_EMPLOYEE_PKPRIMARYKEY(EMPLOYEE_ID);CREATEUNIQUEINDEXCUX.CUX_ADF_TEST_EMPLOYEE_U1ONCUX.CUX_ADF_TEST_EMPLOYEE(EMPLOYEE_NUMBER)TABLESPACECUXIDX;CREATESEQUENCECUX.CUX_ADF_TEST_EMPLOYEE_SSTARTWITH10001;CREATESYNONYMAPPS.CUX_ADF_TEST_EMPLOYEE_SFORCUX.CUX_ADF_TEST_EMPLOYEE_S;CREATESYNONYMAPPS.CUX_ADF_TEST_EMPLOYEEFORCUX.CUX_ADF_TEST_EMPLOYEE;--部门表CREATETABLECUX.CUX_ADF_TEST_DEPARTMENT(DEPARTMENT_IDNUMBERNOTNULL,PARENT_DEPT_IDNUMBER,DEPARTMENT_NUMBERVARCHAR2(100)NOTNULL,DEPARTMENT_NAMEVARCHAR2(100)NOTNULL,DEPARTMENT_DESCVARCHAR2(240),CREATION_DATEDATEDEFAULTSYSDATENOTNULL,CREATED_BYNUMBERDEFAULT-1NOTNULL,LAST_UPDATED_BYNUMBERDEFAULT-1NOTNULL,LAST_UPDATE_DATEDATEDEFAULTSYSDATENOTNULL,LAST_UPDATE_LOGINNUMBER,ATTRIBUTE_CATEGORYVARCHAR2(30),ATTRIBUTE1VARCHAR2(240),ATTRIBUTE2VARCHAR2(240),ATTRIBUTE3VARCHAR2(240),ATTRIBUTE4VARCHAR2(240),ATTRIBUTE5VARCHAR2(240),ATTRIBUTE6VARCHAR2(240),ATTRIBUTE7VARCHAR2(240),ATTRIBUTE8VARCHAR2(240),ATTRIBUTE9VARCHAR2(240),ATTRIBUTE10VARCHAR2(240),ATTRIBUTE11VARCHAR2(240),ATTRIBUTE12VARCHAR2(240),ATTRIBUTE13VARCHAR2(240),ATTRIBUTE14VARCHAR2(240),ATTRIBUTE15VARCHAR2(240));ALTERTABLECUX.CUX_ADF_TEST_DEPARTMENTADDCONSTRAINTCUX_ADF_TEST_DEPARTMENT_PKPRIMARYKEY(DEPARTMENT_ID);CREATEUNIQUEINDEXCUX.CUX_ADF_TEST_DEPARTMENT_U1ONCUX.CUX_ADF_TEST_DEPARTMENT(DEPARTMENT_NUMBER)TABLESPACECUXIDX;CREATESEQUENCECUX.CUX_ADF_TEST_DEPARTMENT_SSTARTWITH10001;CREATESYNONYMAPPS.CUX_ADF_TEST_DEPARTMENT_SFORCUX.CUX_ADF_TEST_DEPARTMENT_S;CREATESYNONYMAPPS.CUX_ADF_TEST_DEPARTMENTFORCUX.CUX_ADF_TEST_DEPARTMENT;职位表CREATETABLECUX.CUX_ADF_TEST_JOBS(JOB_IDNUMBER,JOB_NAMEVARCHAR2(100),MAX_SALARYNUMBER,MIN_SALARYNUMBER);ALTERTABLECUX.CUX_ADF_TEST_JOBSADDCONSTRAINTCUX.CUX_ADF_TEST_JOBS_PKPRIMARYKEY(JOB_ID);CREATESEQUENCECUX.CUX_ADF_TEST_JOBS_SSTARTWITH10001;CREATESYNONYMAPPS.CUX_ADF_TEST_JOBS_SFORCUX.CUX_ADF_TEST_JOBS_S;CREATESYNONYMAPPS.CUX_ADF_TEST_JOBSFORCUX.CUX_ADF_TEST_JOBS;创建业务组建及关联创建数据库连接创建业务实体EO,VO,AM(注意主键,和sequence)创建EO关联,右键Model->newAssociation选择关联条件一路下一步到完成类似的方法创建VO关联双击AM,,将VO关联到AM右键AM->RUN,可以看到数据的关联创建页面创建一个JSF页面,使用Jevelop11G自带的模板修改模板的属性StartColumnSize设置为300界面展示在左边加入PanelAccordion布局(详细使用方法参考布局介绍),并将deptmentVO1的Criteria生成一个查询。在右边添加一个DecorativeBox和pannelHeader布局将DeptmentVO1以table的形式展示,并添加删除,新建,保存,取消等按钮修改EmpolyeeVO,添加员工职位信息给job_name添加lov设置lov修改job_nameUpdate属性是always将deptmentVO1下面的EmployeeVO2拖入到center中,并使用Pannel布局添加删除和添加按钮添加一个panneltabed布局添加Graphs组件在top上面(详细用法见2.6)运行界面页面流Flow创建页面流基于简单查询的应用,创建一个校验界面和一个错误页面双击建立页面导航,把三个页面拖拽到adfc-config里面使用布局中的ControlFlowCase连接页面,生成指向给验证按钮Action绑定一个值如果是success会跳转到emp查询界面如果是error跳转到error界面绑定事件针对上面给验证按钮绑定一个值,如果输入的员工号存在employee表中则可以进入查询界面否则到错误界面创建一个ManagerBeanValidate并注册到pageflow,Scope选view绑定给验证按钮的Action这是类Validate会自动产生一个方法validatePW()同理给口令也添加一个值,Validate会自动产生私有变量在Validate.java下面的方法添加校验publicStringvalidatePW()Stringvpw=(String)this.pw.getValue();System.out.println("Parameter:"+vpw);AppModuleImplam=(AppModuleImpl)ADFUtils.getApplicationModuleForDataControl("AppModuleDataControl");if(am==null){System.out.println("am.findByAttr(vpw)");}if(am.findByAttr(vpw)){return"error";}else{return"error";}}在AM的类AppModulImpl.java中添加方法publicbooleanfindByAttr(Stringpw){Mapattrs=newHashMap();attrs.put("EmpolyeeNumber",pw);Row[]row=queryDataByVO(this.getCuxEmpolyeeVO1(),attrs);if(row!=null&&row.length>0){returntrue;}else{returnfalse;}}/***根据条件取出数据**/publicRow[]queryDataByVO(ViewObjectvo,Mapattrs){if(attrs!=null){ViewCriteriavc=vo.createViewCriteria();ViewCriteriaRowvcr=vc.createViewCriteriaRow();//设定标准查询参数Set<Map.Entry<Object,Object>>mE=attrs.entrySet();Iterator<Map.Entry<Object,Object>>it=mE.iterator();while(it.hasNext()){Map.Entry<Object,Object>temp=it.next();System.out.println(temp.getKey().toString()+""+temp.getValue());vcr.setAttribute(temp.getKey().toString(),temp.getValue());}vc.addElement(vcr);RowIteratorrowIt=vo.findByViewCriteria(vc,-1,ViewObjectImpl.QUERY_MODE_SCAN_DATABASE_TABLES);rowIt.reset();vo.reset();returnrowIt.getAllRowsInRange();}else{returnnull;}}右键Validate.jsf如果员工编号存在会跳转到查询界面。ViewScope的范围简单的介绍一下ViewScope每个类型的生命周期ApplicationScope就从字面意思就可以看出,ApplicationScope是作用范围最广的,在作用于整个应用的运行周期内。通常情况下,ApplicationScope中的参数等都是在应用启动(webserver启动)时即被初始化,因此,一般对于独立于特定的职责和角色的,且需要在整个应用的周期内都需要的资源会定义在ApplicationScope的ManagedBean中。SessionScope仅次于ApplicationScope的是sessionScope,SessionScope作用于从用户登录开始到用户主动结束该session,一般来说,都会为session设置超时时间,若超过服务器设置的超时时间的话,则该session被自动释放。在实际的应用中,经常会将类似于用户信息,预置文件信息或授权信息等设置到Session中RequestScopeRequestScope的作用周期是在一次request之内,只要是在同一个request内,即使是在不同的页面也可以访问到作用在RequestScope的内容PageFlowScope在ADF中引入了Task-Flow的概念,

pageFlowScope作用于同一个TaskFlow中,例:分别有A,B,C三个页面,同属于一个TaskFlow,D页面不属于该TaskFlow,且A,B,C三个页面可以通过定义的action相互进行导航,同时也可以从这三个页面导航到D页面,建立pageFlowScope的ManagedBean此时,A,B,C三个页面可以同时访问到该ManagedBean中的属性ViewScopeViewScope是指viewid发生更改之前都可用,即作用于同一页面内,例如,在不同页面之间跳转时,ViewScope的ManagedBean中的数据都会丢失。NoneNone的意思是说,即使在同一个页面,也不能访问到彼此Nonescope的ManagedBean中的属性。工作流-Tastflow简介ADFTaskFlow是Jdeveloper11新加入的用于Controller层的技术。它比原来简单的JSFFlow功能更加强大,使JSF页面不仅仅只可以指向另一个JSF页面,还可以指向事件或者另一个ADFTaskFlow。ADFTaskFlow分为有边界和无边界的两种。Tastflow与pageflow的区别JSFPageFlowADFTaskFlowJSFpageflow的全部页面都集中在一个JSFpageflow页面faces-config.xml中ADFtaskflow的页面可以模块化成多个taskflows,并且taskflow之间可以相互调用JSFpageflow中节点都是JSF页面ADFtaskflow的节点可以是views,methodcalls,taskflowscallJSFpageflow的页面跳转在页面间ADFtaskflow的跳转可以是页面,以及其他的activitiesJSFpageflow不支持重用ADFtaskflow可以在相同或不同的application中重用JSFpageflow不支持sharedmemoryscope而ADFtaskflow支持在同一个taskflow的不同节点间传递数据,例如pageflowscope变量可以在同一个绑定taskflow作用域内保持值的一致性JSFpageflow不能作为另一个页面的RegionJSFpageflow可以作为另一个页面的RegionBoundTastfow示例创建应用并命名为TastFlow使用向导创建连接使用向导创建业务组件创建业务实体弹出来的选择框选择Model连接刚创建的Connnection,选择表.CUX_ADF_TEST_EMPLOYEE,一路下一步到完成创建一个BoundTastFlow,选着ADFTastFlow在创建页面命名为emp-update-flow,并且勾上下面的复选框一个新的taskflow创建好了在右边把组件框的View拖到刚建好的TastFlow使用Controlflowcase接双击Intro,保持默认值,点击OK在右面的组件框中选择Train,拖到Intro.jsff在弹出的对话框中选着默认值在组件框中选择TrainButtonBar,放入trainComponent中弹出的对话框接受默认值,拖入OuputText到trainComponent下面在右边的属性框中输入值建的好的页面是这样的同理在对ViewSearch,update做同样的动作Search.jsff中创建一个查询(首先在vo中常见一个Criteria)界面如下将VO拖入Update.jsff中创建更新页面在组件框中拖入在emp-update-flow设置Transaction组件框中选着TastFlowReturn,给tastflow设置出口用ControlFlowCase连接设置属性切换到update.jsff页面,给submit和calcel设置事件创建一个新的tastflow,命令为security拖入一个和将刚建好的emp-update-flow拖入其中,最终结果如下使用ControlFlowCase连接,如下双击Login,建立页面,并给password绑定一个变量打开router1的属性框,给默认值bad,点击加号设置新增的Expression给secure-flow添加一个Parameter拖拽一个OutputText

component到login.jsff界面设置属性修改error.jsff右键ViewControl创建一个jsf界面,使用page将secure-flow拖到中间弹出的对话框给一个用户名value填写#{'Scott'}右键master.jspx运行UnboundTastfow示例简要:这个示例是要创建一个菜单导航个人理解:UnboundTastfow不像BoundTastfow有一定的顺序,有开始有结束。它没有一定的顺序,没有固定的出口,一般用于菜单导航。创建一个应用创建一个ADFTastFlow,不要勾选选“createasBoundTastFlow”在刚创建的无边界的TastFlow上新建四个view同理再创建一个无边界的TastFlowadfc-products-config.xml在应用中打开adfc-config.xml在adfc-sale-config.xml右键CreateorUpdateADFMenu,并给菜单一个名称。同理对新建的剩下的两个同样的处理,结果刚建的无边界的TastFlow就会自动添加上导航线给菜单项添加层级关系,首先是sale_menu.xml给products_menu.xml添加层级关系,首先将ItemNpde_new拖到ItemNode_products下面然后创建一个share_node,因为它和sale_menu.xml公用一个sale菜单在弹出的对话框中选着同理在root_menu中把products_menu做为子菜单创建一个ADFPageTemplate在布局中拖入

PanelStretchLayout到页面中拖到布局

PanelHeader到Top中,并在menuBar中拖入导航布局

NavigationPane并修改属性,使其作为导航的第一级在结构窗中,右键af:navigationPane在布局框中拖入

NavigationItem到

nodeStamp,并修改属性在center中拖入

DecorativeBox布局组件,并且拖入

NavigationPane在

DecorativeBox的Top上,修改

NavigationPane属性重复上面16-17的步奏在center中拖入

DecorativeBox布局组件,并且拖入

NavigationPane在

DecorativeBox的Top上,修改

NavigationPane属性重复16-17的动作拖入一个

DecorativeBox在上一个

DecorativeBox的Center中,再拖入

BreadCrumbs到Top上,修改其属性重复16-17拖拽

PanelSplitter到上一个

DecorativeBox的Center中,再拖入

NavigationPane

into在它的first上,修改属性重复16-17拖拽

Facet

into到second中,在弹出来的界面中选着body在

adfc-config.xml双击home创建一个JSF界面,模板选着刚创建的模板创建后发现只有body这一块是变动的重复上面的动作对所有的页面做这个操作,最有右键home,运行BoundTastflow与UnboundTastFlow的区别BoundTastflowUnboundTastFlowUnbounded可以调用BoundedBounded不可以调用Unbounded有一个唯一入口和零到多个出口出口不固定,没有出口待发现。。。常用布局简介ADF提供了很多的布局,这里常用的布局做一些介绍。ADF布局组要集中在Layout这一块:DecorativeBox与PanelStretchLayoutDecorativeBox布局是一个上下结构的,PanelStretchLayout会把界面分成五块属性中可以每块的大小和其他属性PanelAccordion与PanelBox可伸缩的布局,PanelAccordion存在多个可伸缩内容而Panel只有一个右键PanelAccordion>insertinsdeaf:panelAccordion可以添加更多信息PannelSplitter与Decorativebox类似也是会把区域分成两块,不同的是它可以上上下结构亦可以左右结构,并且还带有伸缩PannelConnection与PanelHeader这个两个布局都可以在内部放数据表,同时提供toolbar区域可以对表进行数据操作,不同的是:PaelneHeader有多了一个menuBar可以新加Menu布局PannelConnection自带更多色操作,如自定义显示列,分离等操作NavigationPane与BreadCrumbs这两个布局都作为导航来使用,只不过导航的方式不一样。NavigationPane有五种展示类型展示效果:PanelList以类似Html<li>标签的展示方式PanelTabed通过PanelTabed>insetinsidaf:paneltabed>来添加tab页效果:PopupPopup是作为一种弹出式的窗口出现的,上面可以放PanelWindow、noteWindow、dialog展示效果:PanelGroupLayout听这个名字就差不多了解这个布局是存放各种布局的一个布局注意:layout如果horizontal则以横排显示,否则竖排显示。ShowDetial与showDetialHeader可隐藏的布局通过这个属性来初始时时展开还是关闭Train流程布局,配合TastFlow和TrainButtonBar使用TastFlow用来处理流程顺序TrainButtonBar用来处理流程的前进和后退基本组件简介ADF的组件包括常用组件、图标组件,拖拽组件,操作组件等。Input使用方式:InputNumberSprinbox,InputDate,InputText只需要绑定一个数据源就好了ListOfValue一般是在VO的ListofValue属性中先设置。在UIHints中可以选择是以ListOfValue(combobox)还是ListOfValue的形式展示然后在属性框就可以看到以下的属性使用代码获取组件信息inputText.getValue();Silder使用方式:Silder(number)和silder(range)Silder(number)绑定一个值就好了Silder(range)也需要绑定一个数据源的值,必须注意的是数据格式必须是“3,5”,否则会报错。Checkbox使用方式:单个的复选框绑个一个值就好了多选框一般用在table中OutputText使用方式:OuputText与OutputLabel在使用上并没有什么大的区别RichTextEdit提供了丰富的编辑工具,以标签的方式保存。代码获取outputText.setValue("Hello”);NavigationItem一般会放在NavigationPanel下面。通过取值显示导航内容和事件。Separator与Spacer使用方式:Separator是一个分割符Spaces是一个空白组件,用来调整组件之间的距离。Image使用方式:设置来源,一般是一个url.RadioButton与RadioGroup使用方式:RadioButton是单选按钮,RadioGroup是单选按组拖拽一个RadioButton,绑定的数据类型必须是Boolean拖拽一个DataControl的数据到界面效果Tree在DataControl中将数据拖入其中选择需要展示的内容可视化组件Gauge–范围组件使用方式:拖拽组件到布局,可以修改取值范围和绑定的值。修改颜色显示,如图:0-4显示为红色Graphs–图表组件从Data中拖拽一个数据源,然后选择Graphs,可以看到Graphs有很多种类型这里选择一种类型介绍下,选择bar->bar,并按确定从左边选择数据项做作为图表项,其中bars是显示项,必须包含一个Number的数据项,x_axis表示横坐标以什么作为分组.效果Map–地图组件XxxPivotTable–数据透视表组件在DataControl中将数据拖入其中点击下一步,拖拽你需要的行,列以及显示的值,下一步针对某行有多个纬度,是否可以使用嵌套,下一步配置组合公式,以某个组合对数据进行公式化处理,下一步配置排序方式预览,完成操作组件Drogsource与DropTarget–Operation如下图:拖拽ORACLE,可以将url赋值给左边的URL在左边新建一个Input,右边新建一个LinkLink添加一个attributedropsourceInput添加一个attributedroptarget结构如下ExportCollectionActionListener这个组件一般会绑定到button组件上,可以导出表格中的数据给一个button添加这个action选择要导出的table的ID效果ShowPopupBehavior顾名思义,就是会打开一个pop布局的界面效果:Validate是对界面的数据进行校验的组件,类似VO的EO中的Validate例如validatelength效果样式简介ADF提供了ADFSkin帮助开发者来自定义界面的外观,使用起来很方便。简单的例子Application中新建一个ADFskin命名为Myskin这是系统就会使用刚创建的Skin修改Button的样式修改颜色运行一下通过配置设置Skin对于一个Applicate可以有一个或多个Skin通过浏览器的F12功能,可以看出使用的是MySkin修改配置文件trinidad-config的Skin由Myskin到princess运行结果深入浅出ADF-高级3.1DataControl简介上面的介绍的DataControl的数据都是来源于基于EO创建的VO或者直接创建VO,但是ADF不仅仅支持以表或者sql创建的数据,同时也支持很多其他的方式.下面详细介绍了这三种方式。JavabeanasDataControl创建一个Application命名为MyBeanData一路下一步,输入project的名称,点击完成。创建两个类Contact,StoreContactContact是一个javabean,StoreContact是对Contact一个控制类代码1:packagecom.bean;publicclassContact{publicContact(){super();}privateStringname;privateStringemail;publicvoidsetName(Stringname){=name;}publicStringgetName(){returnname;}publicvoidsetEmail(Stringemail){this.email=email;}publicStringgetEmail(){returnemail;}publicContact(Stringname,Stringemail){=name;this.email=email;}}代码2:packagecom.bean;importjava.util.ArrayList;importjava.util.List;importjava.util.regex.Pattern;publicclassStoreContact{List<Contact>contacts=newArrayList();publicList<Contact>findAllContacts(){returncontacts;}//Returnallcontactsmatchingname(case-insensitive)publicList<Contact>findContactsByName(Stringname){StringnamePattern=".*"+(name!=null?name.toUpperCase():"")+".*";List<Contact>matches=newArrayList();for(Contactc:contacts){if(Pattern.matches(namePattern,c.getName().toUpperCase())){matches.add(c);}}returnmatches;}publicStoreContact(){contacts.add(newContact("Steve","steve@"));contacts.add(newContact("Charles","cyoung@"));contacts.add(newContact("Karl","kheint@"));contacts.add(newContact("Mik","mik_meir@"));contacts.add(newContact("Yvonne","yvonne_yvonne@"));contacts.add(newContact("Sung","superstar001@"));contacts.add(newContact("Shailyn","spatellina@"));contacts.add(newContact("John","jjb@"));contacts.add(newContact("Ricky","rmartz@"));contacts.add(newContact("Shaoling","shaoling@"));contacts.add(newContact("Olga","olga077@"));contacts.add(newContact("Ron","regert@"));contacts.add(newContact("Juan","jperen@"));contacts.add(newContact("Uday","udaykum@"));contacts.add(newContact("Amin","amin@"));contacts.add(newContact("Sati","sparek@"));contacts.add(newContact("Kal","kalyane.kushnane@"));contacts.add(newContact("Prakash","prakash01@"));}publicvoidsetContacts(List<Contact>contacts){this.contacts=contacts;}publicList<Contact>getContacts(){returncontacts;}}右键StoreContact,CreateDataControl,这是可以在DataControl上刷新。创建一个jsf页面,并将DataControl拖拽到里面将Parameter中的name拖拽到界面作为InputText,将方法findContactsByName拖入作为ADFButton。运行UrlServerasDataControl创建一个URLServiceDataControl一路下一步结束创建一个UrlServerDataControl设置Connection(/ocom/groups/public/@otn/documents/webcontent/132361.xml)点击下一步到DataFormat界面,输入读取url文件的模板点击完成刷新DataControl新建一个ViewControl,并且新建一个页面,将item拖拽到界面运行安全性简介这一章节介绍如何通过ADFSecurity实现对用户的安全,权限的控制。示例打开ApplicateMyBeanData在adfc-config.xml中添加WildcardControlFlowRule和两个View创建一个pageTemplate,左边是三个Link,Action依次是welcome,contract,contract2根据模板给上面的三个View创建页面页面一添加T

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论