2017-04-12 7 views
0

save、new、search ...のようなアクションを持つすべてのjsfページに同じコマンドボタンを持つ同じ標準ツールバーがあります。リファクタリングする方法を探していますxhtmlページでそれをすべてのページに含めると、各ページにはビュースコープのマネージドビーンがあり、コマンドボタンのアクションは各ページに関連しているという問題があります。各ページのカスタムロジックで共通のJSFツールバーをリファクタリングする

それぞれ、その下のインターフェースは、アクションが

public interface ActionAbstract { 

public void search(ActionEvent actionEvent); 

public void newRecord(ActionEvent actionEvent); 

public void clear(ActionEvent actionEvent); 

public void remove(ActionEvent actionEvent); 

public void searchAdvanced(ActionEvent actionEvent); 

public void back(ActionEvent actionEvent); 

public void closePage(ActionEvent actionEvent); 

public void validate(ActionEvent actionEvent); 

public void duplicate(ActionEvent actionEvent); 

public void refresh(ActionEvent actionEvent); 

} 

マネージドBean表し実装managedbean:

@ViewScoped 
@ManagedBean 
public class ExampleBean implements ActionAbstract 

ツールバーのXHTML:

<p:toolbar> 
<f:facet name="left"> 
    <p:commandButton title="New" update="@all" icon="fa fa-plus" actionListener="#{ExampleBean.newRecord}" process="@this" /> 
    <p:commandButton title="Search" update="@all" icon="fa fa-search" actionListener="#{ExampleBean.search}" rendered="#{ExampleBean.showTable}" 
         process="@this" /> 
    <p:commandButton title="Advanced Search" icon="fa fa-search-plus" actionListener="#{ExampleBean.searchAdvanced}" 
         rendered="#{ExampleBean.showTable}" process="@this" /> 
    <p:commandButton title="Clear" icon="fa fa-eraser" actionListener="#{ExampleBean.clear}" rendered="#{ExampleBean.showTable}" process="@this" /> 
    <p:commandButton title="Duplicate" icon="fa fa-copy" actionListener="#{ExampleBean.duplicate}" rendered="#{ExampleBean.showDetail}" 
         process="@this" /> 
    <p:commandButton title="Validate" icon="fa fa-check" actionListener="#{ExampleBean.validate}" rendered="#{ExampleBean.showDetail}" 
         process="@this" /> 
    <p:commandButton title="Remove" icon="fa fa-remove" actionListener="#{ExampleBean.remove}" rendered="#{ExampleBean.showDetail}" process="@this" /> 
    <p:commandButton title="Refresh" icon="fa fa-refresh" actionListener="#{ExampleBean.refresh}" process="@this" /> 
    <p:commandButton title="Back" update=":form" icon="fa fa-arrow-left" actionListener="#{ExampleBean.back}" rendered="#{ExampleBean.showDetail}" 
         process="@this" /> 
    <p:commandButton title="Close" icon="fa fa-sign-out" actionListener="#{ExampleBean.closePage}" process="@this" /> 

</f:facet> 

をそれはpossiblですそれをリファクタリングするe ??? !!!ご助力ありがとうございます。

答えて

1

これは絶対にリファクタリングすることができます。これは私が相続よりも組成を好む場合です。あなたは既にインターフェイスを持っていますので、簡単に匿名クラスとして使用してコンポジットコンポーネントに渡すことができます。このアプローチでは、同じページに複数のツールバーを置くことができます。おそらくそれを望むわけではありませんが、この技術は他のコンポーネントにも適用できます。次に、Ajaxの属性(更新/プロセス)とボタンのレンダリング属性を渡すか、またはそれらをあなたのActionAbstractインターフェースの一部にするならば、唯一考慮する点があります(それらをインターフェースの一部にすると、名前を変更することをお勧めします) )。例えば

、ツールバーインターフェースBean管理

package jp.faces.test; 

public interface Toolbar { 
    public void newRecord(); 
} 

。私はにfaceletページ

<comp:toolbar bean="#{testBean.toolbar}"/> 
でそれを使用して、この例

@ManagedBean 
@ViewScoped 
public class TestBean { 

private Toolbar toolbar = null; 

public Toolbar getToolbar(){   
    if(toolbar == null){ 
     toolbar = new Toolbar() {   
      @Override 
      public void newRecord() { 
      // custom bean action goes here 
     }; 
    } 
    return toolbar; 
} 

複合

<cc:interface> 
    <cc:attribute name="toolbar" type="jp.faces.test.Toolbar"/> 
</cc:interface> 

<cc:implementation> 
    <div id="#{cc.clientId}"> 
     <h:commandButton value="New" actionListener="#{cc.attrs.toolbar.newRecord}"/> 
    </div> 
</cc:implementation> 

の簡潔にするためにゲッターで怠惰なインスタンス化を使用しました

関連する問題