Статьи

Действительно динамические декларативные компоненты

В этом коротком посте я расскажу о динамических декларативных компонентах ADF. Я имею в виду известный тэг ADF af: DeclarativeComponent . Его можно использовать как довольно удобный способ оформления страницы как композиции фрагментов и компонентов страницы. Например, наша страница может содержать следующий фрагмент кода:

1
2
3
4
5
 <af:declarativeComponent viewId="PageFragment.jsff" id="dc1">
   <f:facet name="TheFacet">
     <af:button text="button 1" id="b1"/>
   </f:facet>                   
 </af:declarativeComponent>

И PageFragment.jsff — это обычный фрагмент страницы, подобный этому:

01
02
03
04
05
06
07
08
09
10
<?xml version='1.0' encoding='UTF-8'?>
<jsp:root xmlns:jsp="http://java.sun.com/JSP/Page" version="2.1"
          xmlns:af="http://xmlns.oracle.com/adf/faces/rich">
  <af:panelGroupLayout id="pgl1">
    <af:outputText value="This is a page fragment.
                          You can add your content to the following facet:"
                   id="ot1"/>
    <af:facetRef facetName="TheFacet"/>
  </af:panelGroupLayout>
</jsp:root>

Если нам нужно передать некоторые параметры фрагменту страницы, мы можем определить этот фрагмент как компонент:

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
<?xml version='1.0' encoding='UTF-8'?>
<jsp:root xmlns:jsp="http://java.sun.com/JSP/Page" version="2.1"
          xmlns:af="http://xmlns.oracle.com/adf/faces/rich">
<af:componentDef var="attrs">
  <af:xmlContent>
      <facet>
        <facet-name>TheFacet</facet-name>
      </facet>
      <attribute>
        <attribute-name>Title</attribute-name>
      </attribute>
    </component>
  </af:xmlContent>
  <af:panelGroupLayout id="pgl1">
    <af:outputText value="This is a component #{attrs.Title}.
                          You can add your content to the following facet:" id="ot1"/>
    <af:facetRef facetName="TheFacet"/>
  </af:panelGroupLayout>
 </af:componentDef>
</jsp:root>

В этом примере мы можем передать значение атрибута Title, как показано в следующем фрагменте кода:

1
2
3
4
5
6
7
<af:declarativeComponent viewId="ComponentFragment.jsff"
                         id="dc2"
                         Title="Buttom Container">                   
   <f:facet name="TheFacet">
        <af:button text="button 2" id="b2"/>
    </f:facet>                   
</af:declarativeComponent>

И самое интересное в этой технике — атрибут viewId может принимать не только статические строки, но и выражения EL:

1
2
3
4
5
6
 <af:declarativeComponent viewId="#{TheBean.fragmentViewID}"
                          id="dc1">
   <f:facet name="TheFacet">
     <af:button text="button 1" id="b1"/>
   </f:facet>                   
 </af:declarativeComponent>
1
2
3
public String getFragmentViewID() {
    return "PageFragment.jsff";
}

Именно поэтому эта конструкция называется динамической , и именно поэтому эту функцию можно рассматривать как мощный инструмент для построения хорошо структурированного, гибкого и динамического пользовательского интерфейса.

Это оно!