2012-04-18 2 views
0

У меня вопрос, как я могу обновить другой составной компонент, который находится на той же странице. Если я ввожу идентификатор клиента и нажимаю кнопку «Поиск», клиент должен искать в базе данных, а если есть, то система продолжит поиск базы данных на идентификаторе клиента. И наоборот.Каждое другое обновление составных компонентов JSF

Для этого примера предположим, что отношения Клиент: случай 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) Или я должен как-то попробовать реализовать шаблон дизайна Observer в java-коде? Но есть проблема, что будет существовать множество объектов (MainPageController, SecondPageController, ...) для многих наблюдателей (Customer, Case, ...).

ответ

0

упаковка компонентный корпус с панелью ABS указывать ID. введите этот идентификатор в качестве атрибута обновления. используйте этот атрибут в командной кнопке.

+0

ОК, я завернул компонентный корпус: .... Но что вы имеете в виду: «Пишите этот идентификатор в поиске и обновляете атрибут» и «используйте это атрибут в командной кнопке»? – Ziletka

+0

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

+0

Я все еще сражаюсь.Но другой вопрос: имеет ли стандартная атрибут «обновление»? Или мне нужно использовать команду PrimeFaces commandButton? – Ziletka

0

я возможно осуществить обновление составных компонентов только путем внедрения Observer шаблона проектирования (с отличием, что Subject отвечает за регистрацию своих наблюдателей):

Темы

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); 
} 

Concrete наблюдатель (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); 
    } 
} 

Concrete наблюдатель (CaseComponent)

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

main_page.xhtml (идентификатор установлен здесь, чтобы заставить рамки JSF, чтобы создать экземпляр MainPageController)

<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> 

Итак, теперь у меня есть каждый составной компонент, связанный только с его управляемым компонентом.

 Смежные вопросы

  • Нет связанных вопросов^_^