比較的単純にするために、テーブル構造でデータベースレコードを表すことになっているいくつかのPrimefaces-Pageがあります。
これらのレコードは、バッキング BeanList<Customer>
に存在するに保持します。リストがデータベース(hibernate db FWIW)からのレコードで正しく埋め@ConversationScoped
られることをデバッグで確認しました。これは、「businessInterface」ディストリビューター クラスの助けを借りて実現されます。これは、実際には (データベース) サービス クラスの分離マスクにすぎません。
前述のように、データベースとディストリビューターが期待値を正しく返すことを確認しました。残念ながら、ビューにはレコードが存在せず、代わりにemptyMessage
が表示されます。
アプリケーションは jBoss 7.1.1-Final Application Server で実行されています。
読みやすくするために、提供されたコードの周りの、、h:head
、を除外し、列を 2 つの異なる使用法 (プロパティの表示とアクションの説明) に短縮しました。h:body
ui:composition
ui:define
h:form
ビュー (短縮および切り捨て):
<ui:define name="inhalt">
<p:growl id="msgGrowl" autoUpdate="true" showDetail="true" />
<h:form onkeypress="if (event.keyCode == 13) {return false; }">
<p:dataTable var="customeritem" id="customerTable"
rowkey="#{customeritem.id}" value="#{customerListController.customerList}"
paginator="true" rows="13" autoUpdate="true"
filteredValue="#{customerListController.filteredCustomers}"
emptyMessage="no customers found!"
sortFunction="#{customerListController.filteredCustomers}">
<p:column sortBy="name" filterBy="name" headerText="Kunde"
filterMatchMode="contains">
<h:outputText value="#{customeritem.name}" />
</p:column>
<p:column>
<f:facet name="header">
<p:commandButton value="Neuer Kunde"
action="${customerListController.addCustomer()}"
icon="ui-icon-plus" />
</f:facet>
<p:commandButton id="doViewDetailsButton" icon="ui-icon-clipboard"
action="${customerListController.viewDetails(customeritem.getId())}" />
<p:tooltip for="doViewDetailsButton" value="Details ansehen" />
</p:column>
</p:dataTable>
</h:form>
</ui:define>
バッキング Bean:
@Named
@ConversationScoped
public class CustomerListController implements Serializable {
private static final long serialVersionUID = -5961625401284927892L;
private List<Customer> customerList = new ArrayList<Customer>();
private List<Customer> filteredCustomers = new ArrayList<Customer>();
@Inject
CustomerEditController customerEditController;
@Inject
CustomerDetailsController customerDetailsController;
@Inject
CustomerDistributor businessInterface;
public String addCustomer() {
return editCustomer(0l);
}
public String editCustomer(long customerId) {
setFilteredCustomers(null);
customerEditController.recieveCustomerById(customerId);
return Pages.CUSTOMER_EDIT;
}
public String viewDetails(long customerId) {
setFilteredCustomers(null);
customerDetailsController.recieveCustomerById(customerId);
return Pages.CUSTOMER_DETAILS;
}
public String deleteCustomer(long customerIdToDelete) {
businessInterface.delete(customerIdToDelete);
setFilteredCustomers(null);
fillCustomerList();
return Pages.CUSTOMER_LIST;
}
@PostConstruct
public void fillCustomerList() {
customerList.clear();
customerList.addAll(businessInterface.loadAll());
}
public List<Customer> getCustomerList() {
return customerList;
}
public List<Customer> getFilteredCustomers() {
return filteredCustomers;
}
public void setFilteredCustomers(List<Customer> filteredCustomers) {
this.filteredCustomers = filteredCustomers;
}
}
にバッキング Bean があったとき、これは機能し@SessionScoped
ていましたが、直感的な (そして期待される) 動作を生成するにはハック的な回避策が必要だったため、バッキング Bean をより小さなスコープに移動することにしました。したがって@ConversationScoped
、BackingBean はリクエストのライフサイクルよりも長く滞在する必要があるため、を選択しました... (また、リクエストごとにデータベースに対してクエリを実行するのは非常に高価です...)
CustomerEditController
とについて簡単に説明しCustomerDetailsController
ます。これらは、ボタンの 1 つをクリックして要求された場合に、単一のレコードに関する詳細情報を編集および表示する責任があります。
動作しないものは@PostConstruct public void fillCustomerList()
. 他のすべては期待どおりに機能します...
さらに情報が必要な場合は、お尋ねください。必要に応じてコンテキストを提供します;)