[英]Each other updating of JSF composite components
我有一個疑問,如何更新同一頁面上的其他復合組件。 如果輸入客戶ID並單擊“搜索”按鈕,則應在數據庫中搜索客戶,如果存在,則系統將繼續基於客戶ID搜索案例。 反之亦然。
對於此示例,假設客戶:案例的關系為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代碼中實現設計模式Observer? 但是,有許多觀察者(客戶,案例,...)存在許多主題(MainPageController,SecondPageController等)的問題。
用面板abs包裹組件盒可為其指定ID。 將該ID作為更新屬性輸入搜索。 在命令按鈕中使用該屬性。
我只能通過實現Observer設計模式來實現更新復合組件的功能(區別在於Subject負責注冊其Observers):
學科
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以強制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>
因此,現在我使每個復合組件僅與其托管bean連接。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.