Mastering Oracle ADF Bindings

  • View
    1.306

  • Download
    5

  • Category

    Software

Preview:

Citation preview

1  

About me

3

Ski Route

4

Let’s Go!

5

6

Bindings?

7

Application Layers

8

Layers Interaction

9

Fundamental Theorem of Software Engineering (FTSE)

We  can  solve  any  problem  by  introducing  an  extra  level  of  

indirec8on.    

…except  for  the  problem  of  too  many  levels  of  indirec8on  

10

Model Layer

10

ADF Model

12

ADF Model

Why ADF Bindings?

12

•  A  core  part  of  Oracle  ADF  •  Powered  by  Oracle  •  Declara8ve  programming    

approach  •  Common  UI  tasks  out-­‐of-­‐

the-­‐box                  –    Naviga8on                  –    Range  fetching                    –    State  Management  •  ADF  Bindings  API  

Ski Route

13

UI Component Binding

15

 <af:inputText  value="#{bindings.FirstName.inputValue}"                                                        label="#{bindings.FirstName.hints.label}"                                                        required="#{bindings.FirstName.hints.mandatory}"                                                      …  

EmpViewPageDef.xml  

16

ADF Model Artifacts

17

 

² PageDef.xml  ² Binding  metadata  

² DataBinding.cpx  ² Page  defini8on  map  ² Data  Controls    

² Adfm.xml  ² DataBinding.cpx,  DataControls.dcx,    ² bc4j.xcfg,  *.jpx  

² Web.xml  ² ADFBindingFilter  

² ADF  libraries  

Page Definition File

18

       <executables>                  <iterator  DataControl="EmployeesAMDataControl”                                                    Binds="VEmployees"                                                      RangeSize="25"                                                      id="VEmployeesIterator"/>          </executables>          <bindings>                  <acributeValues  id="EmployeeId”                                                                                IterBinding="VEmployeesIterator”>                          <AcrNames>                                          <Item  Value="EmployeeId"/>                          </AcrNames>                  </acributeValues>                  <acributeValues  id="FirstName”                                        IterBinding="VEmployeesIterator”>                          <AcrNames>                                          <Item  Value="FirstName"/>                          </AcrNames>                  </acributeValues>                  …          </bindings>  

<af:inputText  value="#{bindings.FirstName.inputValue}”                                                        label="#{bindings.FirstName.hints.label}"          

Page Definition File. Executables

19

² Iterator  <iterator>  ² Method  Iterator  <methodIterator>  

² Variable  Iterator  <varaibleIterator>  ² Invoke  Ac8on  <invokeAc8on>  ² Page  <page>  ² Search  Region  <searchRegion>  ² Task  Flow  <taskFlow>  ² Mul8task  Flow  <mul8TaskFlow>  

Page Definition File. Bindings

20

² Ac8on  bindings  ² Ac8on  <ac8on>  ² Method  ac8on  <methodAc8on>  

² Value  bindings  ² Current  Row    

² Acribute  value  <acributeValues>  ² Boolean  value  <bucon>  ² List  <list,  listOfValues>  

² Row  Set  ² Tree  <tree>  ² DVT  <graph>  

 

Ski Route

21

22

Binding Context vs Binding Container

23

JSF Lifecycle vs ADF Page Lifecycle

24

Bindings in ADF lifecycle. ADF Binding Filter

25

Bindings in ADF lifecycle. Restore View •  Restore  View  •  Apply  Request  Values  •  Process  valida8ons  •  Update  Model  Values    •  Invoke  Applica8on  •  Render  Response  

26

Bindings in ADF lifecycle. Restore View •  Restore  View              -­‐  Init  Context                  -­‐  Prepare  Model  •  …  

Binding Container at Prepare Model

27

² Page  Parameters  ² Task  Flow  Parameters  ² Executables  with  Refresh=prepareModel  

² Iterators,  Invoke  Ac8ons      ² Page  Template    ² Task  Flow  bindings    

28

Bindings in ADF lifecycle. Render Response •  Restore  View  •  Apply  Request  Values  •  Process  valida8ons  •  Update  Model  Values    •  Invoke  Applica8on  •  Render  Response                    -­‐  Prepare  render  (render  Model)  

Iterator Refresh Attribute

29

² default  (deferred)  ²  On  demand  

² always  ²  Prepare  Model,Update  Model,            Render  Model    

² ifNeeded      ²  Prepare  Model,  Render  Model  

² never    ² prepareModel  ² prepareModelifNeeded  ² renderModel  ² renderModelifNeeded  

#{viewScope.reallyNeedToRefresh}  

Ski Route

30

Accessing Binding Container

31

public  BindingContainer  getBindingContainer()  {                  BindingContext  bindingContext  =  BindingContext.getCurrent();                  return  bindingContext.getCurrentBindingsEntry();  }  

²  Get Binding Context instance ²  Get Current Binding Container  

Executing Method Action

32

²  Get Operation Binding from Binding Container ²  Set up parameters ²  Execute ²  Check for errors

 

public  void  raisePay(Integer  employeeId)  {                  BindingContainer  bindings  =  getBindings();                  Opera8onBinding  op  =  bindings.getOpera8onBinding("raisePay");                  op.getParamsMap().put("employeeId",  employeeId);                  Object  result  =  op.execute();                  if  (!op.getErrors().isEmpty())  {                          //Do  something  with  this  list  of  JboExcep8ons                          List  errorList  =  op.getErrors();                  }          }  

 <methodAc8on  Ac8on="invokeMethod”    MethodName="raisePay”  id="raisePay”        ...  

Accessing Attribute Binding

33

 public  String  getEmailValue()  {                  BindingContainer  bindings  =  getBindings();                  AcributeBinding  emailBinding  =                            (AcributeBinding)  bindings.getControlBinding("Email");                  return  (String)  emailBinding.getInputValue();          }  

²  Get Binding Container ²  Find Attribute Binding by Id ²  Return Input Value    

<bindings>          <acributeValues  IterBinding="VEmployeesIterator"  id="Email">                              <AcrNames>                                      <Item  Value="Email"/>                              </AcrNames>            </acributeValues>  …  

Accessing LOV Binding

34

²  Get Binding Container ²  Find JUCtrlListBinding by Id ²  Get Selected Row ²  Return Attribute Value

       

 public  String  getDepartmentName()  {                  BindingContainer  bindings  =  getBindings();                  JUCtrlListBinding  lov  =                            (JUCtrlListBinding)  bindings.getControlBinding("DepartmentId");                  //  Get  the  selected  row                  Row  selectedRow  =  (Row)  lov.getSelectedValue();                  return  (String)  selectedRow.getAcribute("DepartmentName");  }            

<bindings>    <list  IterBinding="VEmployeesIterator"  Sta8cList="false"                      DTSupportsMRU="true"  SelectItemValueMode="ListObject"                    Uses="LOV_DepartmentId"  id="DepartmentId”/>  …  

Accessing Iterator Binding

35

²  Get Binding Container as DCBindingContainer ²  Find DCIteratorBinding by Id ²  Execute VO query ²  Get Current Row (ViewRowImpl) ²  Get View Object Instance

         public  void  workWithIterator()  {                  DCBindingContainer  bindings  =  (DCBindingContainer)  getBindings();                  DCIteratorBinding  iter  =  bindings.findIteratorBinding("VEmployeesIterator");                  //Execute  RowSet  query                  iter.executeQuery();                  //Get  current  row                    Row  r  =  iter.getCurrentRow();                  //Get  View  Object                  ViewObject  vo  =  iter.getViewObject();  }  

 <iterator  Binds="VEmployees"  RangeSize="25"                                        DataControl="EmployeesAMDataControl"  id="VEmployeesIterator"/>  

Ski Route

36

Composite ADF page

37

38

Composite ADF page

²  Everything  in  one  page  ²  Regions  with  task  flows  ²  Dynamic  declara8ve  component  

39

Composite ADF page ²  Everything  in  one  page  

²  Regions  with  task  flows  ²  Dynamic  declara8ve  component  

40

Composite ADF page ²  Everything  in  one  page  ²  Regions  with  task  flows  

²  Dynamic  declara@ve  component  

Dynamic Declarative Component

41

²  Uses Binding Container of the parent page ²  Doesn’t have own Binding Container  

…  <af:gridCell  ...>            <af:declara8veComponent  viewId="/fragments/Approvals.jsff"  id="dc1"/>  </af:gridCell>  ….  

<ui:composi8on  xmlns:ui="hcp://java.sun.com/jsf/facelets"    ...    <af:componentDef  var="acrs"  componentVar="comp">                  <af:panelBox  text="Approvals"  id="pb1">                          <af:listView  value="#{bindings.Approvals.collec8onModel}"  var="item”                                                                      fetchSize="#{bindings.Approvals.rangeSize}"  id="lv1”>  …  

MainPage.jsf  

Approvals.jsff  

Bindings for Declarative Component

42

²  Create Page Def file for the fragment ²  Add mapping to the DataBindings.cpx

 <pageMap>                <page  path="/fragments/Approvals.jsff”  usageId="dashboard_view_ApprovalsPageDef"/>      </pageMap>      <pageDefini8onUsages>                  <page  id="dashboard_view_ApprovalsPageDef"                              path="com.adfprac8ce.dashboard.view.pageDefs.ApprovalsPageDef"/>      </pageDefini8onUsages>  

 <pageDefini8on  id="ApprovalsPageDef"                                  Package="com.adfprac8ce.dashboard.view.pageDefs">          <executables>                  <iterator  Binds="Approvals”  id="ApprovalsIterator”  …                  ...    

DataBindings.cpx  

ApprovalsPageDef.xml  

Bindings for Declarative Component

43

²  Find or Create BC with findBindingContainerByPath ²  Refer to the Backing Bean property     public  class  ApprovalsBean  {          public  BindingContainer  getBindings()  {                  BindingContext  bc  =  BindingContext.getCurrent();                  return  bc.findBindingContainerByPath("/fragments/Approvals.jsff");          }  …  

<ui:composi8on  xmlns:ui="hcp://java.sun.com/jsf/facelets"      <c:set  var="bindings"  value="#{backingBeanScope.ApprovalsBean.bindings}"/>    <af:componentDef  var="acrs"  componentVar="comp">                  <af:panelBox  text="Approvals"  id="pb1">                          <af:listView  value="#{bindings.Approvals.collec8onModel}"  var="item”                                                                      fetchSize="#{bindings.Approvals.rangeSize}"  id="lv1”>  …  

ApprovalsBean.java  

Approvals.jsff  

Ski Route

44

Bindings for Adaptive UI

45

Bindings for Dynamic Table

46

 <executables>              <iterator  Binds="#{pageFlowScope.voName}"                                                DataControl=”DynamicDataModelServiceDataControl“                                                id=”VDynamicIterator"/>    </executables>  

 <bindings>            <tree  IterBinding="VDynamicIterator"  id="VDynamic">                  <nodeDefini8on  Name="VDynamic0"/>          </tree>    </bindings>  

 <af:table  rows="#{bindings.VDynamic.rangeSize}"                                    fetchSize="#{bindings.VDynamic.rangeSize}”                                      …  

Dynamic Table

47

<af:table  rows="#{bindings.VDynamic.rangeSize}"                                    fetchSize="#{bindings.VDynamic.rangeSize}"                                    emptyText="#{bindings.VDynamic.viewable  ?                                                                                    'No  data  to  display.'  :  'Access  Denied.'}"                                    var="row"  rowBandingInterval="0”  value="#{bindings.VDynamic.collec8onModel}"                                    selectedRowKeys="#{bindings.VDynamic.collec8onModel.selectedRow}"                                    selec8onListener="#{bindings.VDynamic.collec8onModel.makeCurrent}"                                    rowSelec8on="single"  id="t1">          <af:forEach  items="#{bindings.VDynamic.acributeDefs}”  var="def">                  <af:column  headerText="#{bindings.VDynamic.labels[def.name]}“                                                            sortable="true"  sortProperty="#{def.name}“  id="c2">                          <af:outputText  value="#{row[def.name]}"  id="ot2"/>                  </af:column>          </af:forEach>  </af:table>  

 

Bindings for Dynamic Form

48

 <executables>              <iterator  Binds="#{pageFlowScope.voName}"                                                DataControl=”DynamicDataModelServiceDataControl“                                                id=”VDynamicIterator"/>    </executables>  

                                                                     <dynamic:form  value="#{bindings.VDynamicIterator}"  id="f1"/>  

Dynamic Component (12c)

49

   <af:iterator  id="i1"  value="#{bindings.VDynamic.acributesModel.acributes}"  var="acr">                  <af:dynamicComponent  id="d2"  acributeModel="#{acr}"                                                                                                          value="#{bindings[acr.containerName][acr.name].inputValue}"/>    </af:iterator>  

                                                                                                                                       <tree  IterBinding=”VDynamicIterator"  id="VDynamic">                                                                                                                                                              <nodeDefini8on  Name="VDynamic0"/>                                                                                                                                          </tree>  

Hand Made Dynamic Form

50

²  DynamicComponent has limitations ²  af:Iterator + af:switcher approach can be used      <af:iterator  value=”#{bindings.VDynamic.acributesModel.acributes}"  var="acr"  id="dc_i1">                              <af:switcher  id="dc_s1"  defaultFacet="Default"                                                                            facetName=”#{bindings[acr.containerName][acr.name].dynamicTypeID}”>                                  <f:facet  name="DATE">                                      <af:inputDate  id="dc_id1"                                                                                          label=”#{bindings[acr.containerName][acr.name].label}”                                                                                                                                                            value=”#{bindings[acr.containerName][acr.name].inputValue}”                                                                                                                                                      shortDesc="#{bindings[acr.containerName][acr.name].tool8p}”                                                                                          />                                  </f:facet>                                <f:facet  name=”INT”>                                  …  

 <tree  IterBinding="VDynamicterator"  id="VDynamic">                  <nodeDefini8on  Name="VDynamic0"/>    </tree>    

Ski Route

51

Dynamic Bindings. Why?

52

²  DynamicForm is straight forward ²  DynamicForm is not good for Facelets ²  Jdeveloper 12c is still new ²  DynamicComponent has limitations ²  Tree bindings might be expensive

²  Useful for declarative components

²  It’s fun! ²  Have to finish the route

 <tree  IterBinding="VDynamicterator"                            id="VDynamic">                  <nodeDefini8on  Name="VDynamic0"/>    </tree>    

Creating Value Binding

53

²  Get Control Definition Factory Defini8onFactory  defFactory  =  JUMetaObjectManager.getJUMom().getControlDefFactory();  

²  Create an instance of Control Value Definition (JUCtrlAcrsDef,  JUCtrlBoolDef,  …)              JUCtrlValueDef  acrDef  =  (JUCtrlValueDef)  defFactory.createControlDef(BINDING_TYPE);     ²  Initialize Control Value Definition HashMap  initValues  =  new  HashMap();              initValues.put(PARAM_NAME,  PARAM_VALUE);              acrDef.init(initValues);    

²  Create an instance of Control Value Binding JUCtrlValueBinding  acr  =  (JUCtrlValueBinding)    acrDef.createControlBinding(getBindings());  

²  Add Control Value Binding to Binding Container  getBindings().addControlBinding(acr.getName(),  acr);  

 

Dynamic Attribute Value Binding

54

private  JUCtrlAcrsBinding  createAcrValue(String  acrName,  String  iteratorName)  {      Defini8onFactory  defFactory  =    JUMetaObjectManager.getJUMom().getControlDefFactory();      JUCtrlAcrsDef  acrDef  =  (JUCtrlAcrsDef)  defFactory.createControlDef(DCDefBase.PNAME_TextField);          //Ini8alize  acribute  values  binding  defini8on      HashMap  initValues  =  new  HashMap();      initValues.put(DCControlBindingDef.PNAME_IterBinding,  iteratorName);      initValues.put(ListBindingDef.PNAME_AcrNames,  new  String[]  {acrName});      initValues.put(JUTags.ID,  acrName);      acrDef.init(initValues);                //Create  an  instance  of  acribute  values  binding      JUCtrlAcrsBinding  acr  =  (JUCtrlAcrsBinding)    acrDef.createControlBinding(getBindings());            //Add  the  instance  to  the  current  binding  container      getBindings().addControlBinding(acrDef.getName(),  acr);      return  acr;    }    

Dynamic Attribute Value Binding

55

 <af:inputText  value="#{BackingBean.accountNo.inputValue}”                                                      label="#{BackingBean.accountNo.hints.label}”                                                      required="#{BackingBean.accountNo.hints.mandatory}”                                                      …  

public  JUCtrlAcrsBinding  getAccountNo()  {                  String  acrName  =  "AccountNo";          DCControlBinding  acr  =                          getBindings().findCtrlBinding(acrName);            if  (acr  ==  null)  {                  acr  =  createAcrValue(acrName,  "VDynamicIterator");            }              return  (JUCtrlAcrsBinding)  acr;  }  

 <acributeValues                          IterBinding="VDynamicIterator”                          id="AccountNo">                    <AcrNames>                                <Item  Value="AccountNo"/>                    </AcrNames>        </acributeValues>  

#{bindings.AccountNo}  

Dynamic Boolean (button) Value Binding

56

private  JUCtrlBoolBinding  createBoolValue(String  acrName,  String  iteratorName)  {      Defini8onFactory  defFactory  =    JUMetaObjectManager.getJUMom().getControlDefFactory();      JUCtrlBoolDef  acrDef  =  (JUCtrlBoolDef)  defFactory.createControlDef(DCDefBase.PNAME_BuIon);        HashMap  initValues  =  new  HashMap();      initValues.put(DCControlBindingDef.PNAME_IterBinding,  iteratorName);      initValues.put(ListBindingDef.PNAME_AcrNames,  new  String[]  {acrName});      initValues.put(ListBindingDef.PNAME_ValueList,  new  String[]  {"Y","N"});      …      return  acr;  }      

 <bucon  IterBinding="VDynamicIterator"  id="AccountClosed"  DTSupportsMRU="false"  Sta8cList="true">              <AcrNames>                          <Item  Value="AccountClosed"/>              </AcrNames>              <ValueList>      <Item  Value="Y"/>                  <Item  Value="N"/>    </ValueList>    </bucon>  

Dynamic LOV Binding

57

private  JUCtrlListBinding  createLOV(String  acrName,  String  lovName,  String  iteratorName)  {      Defini8onFactory  defFactory  =  JUMetaObjectManager.getJUMom().getControlDefFactory();      JUCtrlValueDef  lovDef  =  (JUCtrlValueDef)  defFactory.createControlDef(JUTags.PNAME_listOfValues);          HashMap  initValues  =  new  HashMap();      initValues.put(DCControlBindingDef.PNAME_IterBinding,  iteratorName);      initValues.put(ListBindingDef.PNAME_AcrNames,  new  String[]  {acrName});    //Specify  LOV  name.  e.g.  “LOV_Currency”      initValues.put(ListBindingDef.PNAME_ListServerBindingName,  lovName);                      initValues.put(JUTags.ID,  acrName);      lovDef.init(initValues);        JUCtrlListBinding  lov  =  (JUCtrlListBinding)  lovDef.createControlBinding(getBindings());      getBindings().addControlBinding(lovDef.getName(),  lov);      return  lov;  }          

<listOfValues  Sta8cList="false"  IterBinding="VDynamicIterator"  Uses="LOV_Currency"  id="Currency"/>  

Dynamic Tree Binding

58

 public  JUCtrlHierBinding  createTree(String  treeName,  String  iteratorName)  {                      Defini8onFactory  defFactory  =  JUMetaObjectManager.getJUMom().getControlDefFactory();                  JUCtrlValueDef  treeDef  =  (JUCtrlValueDef)  defFactory.createControlDef(DCDefBase.PNAME_Tree);                    HashMap  initValues  =  new  HashMap();                      initValues.put(JUTags.ID,  treeName);                  initValues.put(JUCtrlHierDef.PNAME_IterBinding,  iteratorName);                                JUCtrlHierTypeBinding  typeBinding  =  new  JUCtrlHierTypeBinding();                      initValues.put(JUCtrlHierDef.PNAME_TypeBindings,  new  JUCtrlHierTypeBinding[]  {  typeBinding  });                        treeDef.init(initValues);                    JUCtrlValueBinding  tree  =  (JUCtrlValueBinding)treeDef.createControlBinding(getBindings());                                  getBindings().addControlBinding(treeDef.getName(),  tree);                  return  (JUCtrlHierBinding)  tree;          }    <tree  IterBinding="VDynamicterator"    

                       id="VDynamic">                  <nodeDefini8on  Name="VDynamic0"/>    </tree>    

Dynamic Value Binding

59

 private  JUCtrlValueBinding  createBinding(BindingDef  bindingDef)  {              Defini8onFactory  defFactory  =                        JUMetaObjectManager.getJUMom().getControlDefFactory();              JUCtrlValueDef  valueDef  =                        (JUCtrlValueDef)  defFactory.createControlDef(bindingDef.getBindingType());                              HashMap  initValues  =  bindingDef.getInitMap();                          valueDef.init(initValues);                                JUCtrlValueBinding  binding  =  (JUCtrlValueBinding)  valueDef.createControlBinding(getBindings());                            getBindings().addControlBinding(valueDef.getName(),  binding);              return  binding;          }  

Dynamic Value Binding

60

 private  class  BooleanBindingDef  extends  BindingDef  {                    @Override                  public  HashMap  getInitMap()  {                                  HashMap  map  =  new  HashMap();                                  map.put(DCControlBindingDef.PNAME_IterBinding,  iteratorName);                                  map.put(ListBindingDef.PNAME_AcrNames,  new  String[]  {acrName});                                  map.put(ListBindingDef.PNAME_ValueList,  new  String[]  {"Y","N"});                                  map.put(JUTags.ID,  acrName);                                  return  map;                                                  }                    @Override                  public  String  getBindingType()  {                                  return  DCDefBase.PNAME_Bucon;                          }            }  

Dynamic Iterator Binding

61

 public  DCIteratorBinding  createIterator(String  iteratorName,  String  voName,  String  dataControlName)  {                        Defini8onFactory  defFactory  =  JUMetaObjectManager.getJUMom().getControlDefFactory();        //Create  and  init  an  iterator  binding  defini8on            JUIteratorDef  iterDef  =  (JUIteratorDef)defFactory.createControlDef(DCDefBase.PNAME_Iterator);                                HashMap  initValues  =  new  HashMap();            initValues.put(JUTags.ID,  iteratorName);        initValues.put(JUTags.DataControl  ,  dataControlName);            initValues.put(JUTags.PNAME_VOName  ,  voName);            iterDef.init(initValues);                          //Create  an  iterator  binding  instance              DCIteratorBinding  iter  =  iterDef.createIterBinding(BindingContext.getCurrent(),  getBindings());                                          //Add  the  instance  to  the  current  binding  container              getBindings().addIteratorBinding(iteratorName,  iter);            return  iter;    }    

 <iterator  Binds="VEmployees"                                DataControl="AppModuleDataControl"                                        id=“VDynamiciterator"/>  

Ski Route

62

63  

Recommended