2012-04-18 10 views
0

質問があります同じページにある他のコンポジットコンポーネントをどのように更新できますか?顧客IDを入力して「検索」ボタンをクリックすると、データベース内で顧客を検索し、存在する場合は顧客IDのケースベースの検索を続行します。およびその逆。他のJSFコンポジットコンポーネントの更新

この例では、関係Customer:Caseが1:1であるとします。

main_page.xhtml

<h:body> 
    <ui:composition template="/WEB-INF/template/layout.xhtml"> 
     <ui:define name="content"> 
      <custom:component_customer 
       customerId="#{mainPageController.customer.id}" 
       searchCustomer="#{mainPageController.searchCustomer}" 
      /> 
      <custom:component_case 
       caseaseId="#{mainPageController.case.caseId}" 
       searchCase="#{mainPageController.searchCase}" 
      /> 
     </ui:define> 
    </ui:composition> 
</h:body> 

component_customer.xhtml

<composite:interface> 
    <composite:attribute name="customerId" type="java.lang.Long"/> 
    <composite:attribute name="searchCustomer" method-signature="void searchCustomer()"/> 
</composite:interface> 

<composite:implementation> 
    <h:form> 
     <h:inputText id="id" value="#{cc.attrs.customerId}"/> 
     <h:commandButton value="Search" action="#{cc.attrs.searchCustomer}"/> 
    </h:form> 
</composite:implementation> 

component_case.xhtml

<composite:interface> 
    <composite:attribute name="caseId" type="java.lang.Long"/> 
    <composite:attribute name="searchCase" method-signature="void searchCase()"/> 
</composite:interface> 

<composite:implementation> 
    <h:form> 
     <h:inputText id="id" value="#{cc.attrs.caseId}"/> 
     <h:commandButton value="Search" action="#{cc.attrs.searchCase}"/> 
    </h:form> 
</composite:implementation> 

MainPageController.java

@ManagedBean 
@ViewScoped 
public class MainPageController { 

@EJB 
private CaseLogic caseLogic; 
@EJB 
private CustomerLogic customerLogic; 

private Customer customer = new Customer(); 
private Case case = new Case(); 

// getter & setters 

public void searchCustomer() { 
} 

public void searchCase() { 
} 

1)一般的な「JSF」ソリューションはありますか?

2)または、どういうわけか、Javaコードでオブザーバーデザインパターンを実装する必要がありますか?しかし、多くのオブザーバー(Customer、Case、...)には多くのサブジェクト(MainPageController、SecondPageController、...)が存在するという問題があります。

答えて

0

ラップコンポーネントのケースにはパネルIDが付いています。そのIDを更新属性として検索に送ります。コマンドボタンでその属性を使用します。

+0

OK、コンポーネントケースをラップしました: ...。しかし、「IDを検索に使用して属性を更新する」と「その属性をコマンドボタンで使用する」という意味ですか? – Ziletka

+0

遅く返事を申し訳ありません。私は休暇中です。最初にパネルに必要なものをフォームの中に入れる必要があります。次に、更新するアイテムを表す文字列を取り込むコンポーネントの新しいパラメータを作成します。その文字列をコマンドボタンの更新属性に入力します。 – mosgjig

+0

私はまだ戦っています。しかし別の質問:standart に属性 "update"がありますか?または、私はPrimeFaces commandButtonなどを使用する必要がありますか? – Ziletka

0

私は唯一の(件名はそのオブザーバーを登録する責任があるという違いで)オブザーバーデザインパターンを実装することにより、複合コンポーネントをアップデート実装することが可能であった:

件名

public abstract class Subject { 
    private final List<Observer> observerList = new ArrayList<>(); 

    public void registerObserver(final Observer observer) { 
     observer.setSubject(this); 
     observerList.add(observer); 
    } 

    public List<Observer> getObserverList() { 
     return observerList; 
    } 

    public abstract void notifyObservers(final Observer observer); 
} 

コンクリート対象

@ManagedBean 
@ViewScoped 
public class MainPageController extends Subject { 
    @ManagedProperty(value = "#{caseComponent}") 
    private CaseComponent caseComponent; 
    @ManagedProperty(value = "#{customerComponent}") 
    private CustomerComponent customerComponent; 
    private final String customerComponentId = "MainPageCustomer"; 
    private final String caseComponentId = "MainPageCase"; 

    @Override 
    public void notifyObservers(final Observer changed) { 
     for (Observer observer : getObserverList()) { 
      observer.update(changed); 
     } 
    } 

    // is invoked by JSF framework thanks to @ManagedProperty injection 
    public void setCaseComponent(CaseComponent caseComponent) { 
     this.caseComponent = caseComponent; 
     registerObserver(this.caseComponent); 
    } 

    // is invoked by JSF framework thanks to @ManagedProperty injection 
    public void setCustomerComponent(CustomerComponent customerComponent) { 
     this.customerComponent = customerComponent; 
     registerObserver(this.customerComponent); 
    } 

    public String getCustomerComponentId() { 
     return customerComponentId; 
    } 

    public String getCustomerComponentId() { 
     return customerComponentId; 
    } 
} 

オブザーバー

public interface Observer { 
    public abstract void setSubject(Subject subject); 
    public abstract void update(Observer changed); 
} 

コンクリートオブザーバ(CustomerComponent)

@ManagedBean 
@ViewScoped 
public class CustomerComponent implements Observer { 

    @EJB 
    private CustomerLogic logic; 
    private Subject subject; 
    // backing bean property 
    private Customer customer = new Customer(); 

    @Override 
    public void setSubject(final Subject subject) { 
     this.subject = subject; 
    } 

    @Override 
    public void update(final Observer changed) { 
     if (changed instanceof CustomerComponent) { 
      // do nothing, in this case the customer was updated yet 
      // in public void searchCustomer() method 
     } else if (changed instanceof DeliverySiteComponent) { 
      DeliverySiteComponent deliverySiteComponent = (DeliverySiteComponent) changed; 
      searchCustomer(deliverySiteComponent.getDeliverySite()); 
     } 
    } 

    public Customer getCustomer() { 
     return customer; 
    } 

    public void setCustomer(final Customer customer) { 
     this.customer = customer; 
    } 

    public void searchCustomer() { 
     customer = logic.find(customer); 
     if(customer != null && customer.getId() != null) { 
      subject.notifyObservers(this); 
     } 
    } 

    private void searchCustomer(final DeliverySite deliverySite) { 
     customer = logic.find(deliverySite); 
    } 
} 

コンクリートオブザーバ(CaseComponent)

@ManagedBean 
@ViewScoped 
public class CaseComponent implements Observer { 
    ... 
} 

main_page.xhtml(idがMainPageControllerのインスタンスを作成するために、JSFフレームワークを強制的にここで設定されている)

<h:body> 
    <ui:composition template="/WEB-INF/template/layout.xhtml"> 
     <ui:define name="content"> 
      <custom:component_customer 
       id="#{mainPageController.customerComponentId}" 
       customerId="#{customerComponent.customer.id}" 
       searchCustomer="#{customerComponent.searchCustomer}" 
      /> 
      <custom:component_case 
       id="#{mainPageController.caseComponentId}" 
       caseaseId="#{caseComponent.case.caseId}" 
       searchCase="#{customerComponent.searchCase}" 
      /> 
     </ui:define> 
    </ui:composition> 
</h:body> 

これで、すべてのコンポジットコンポーネントがマネージドBeanとのみ接続されました。

関連する問題