OpenBravo のようなものが既にある JSF(facelets)/Spring/ アプリケーションに複数タブ機能を追加しようとしています ( http://wiki.openbravo.com/w/images/9/9c/WIK_PartsOfScreen.pngが、アプリはさまざまなテクノロジーを使用しています - GUI 用の純粋な JavaScript だと思います): 各ドキュメントまたはレポートは、個別の JavaScript タブで開くことができます。
基本的には単純です。各ドキュメントまたはレポートは個別の JSF リージョンであり、そのうちの 1 つだけが表示されます。タブは単なる視覚効果です。
問題は、JSF バッキング Bean (または、この役割で使用されることがある Spring Bean) との通信です。これは、1 つのタブ インターフェイスの場合は単純です。次の Bean を作成できます。
class BankDocumentServiceBean {
BankDocument selectedDocument;
Long id;
void setId(Long id) {
if (selectedDocument.id!=id) {
setupBankDocument(id);
}
}
void setupBankDocument(Long id) {...}
BankDocument getBankDocument() {...}
...
}
また、BankDocument JSF ページは次のようになります。
...
<f:metadata> <!-- page is called with parameter id and this code calls setId(...) -->
<f:viewParam name="id" value="#{bankDocumentServiceBean.id}"/>
</f:metadata>
<h:body>
...
<!-- p for Primefaces -->
<p:inputText id="amountTxt"
value="#{bankDocumentServiceBean.selectedDocument.amount}"
required="true" label="amountLbl"/>
<p:message for="amountTxt" />
...
このアプローチは一般的に良いですか?
主な問題は、この単一ドキュメントのアプローチを複数のタブに拡張する方法です。JSF コードは動的にページに組み込むことができますが、サービス Bean が問題のままです。各呼び出しで追加のパラメーターを使用することで解決できます。たとえば、BankDocumentServiceBean には単一の BankDocument ではなく BankDocuments のリストを含めることができ、各操作 (getBankDocument など) には、コレクションから適切な Bean、つまり、関連する Bean を選択するための追加の識別子を含めることができます。ユーザーが操作するタブ。
しかし、もっと良いアプローチがあるかもしれません。たとえば、1 つのページが、古き良き単一ドキュメントの BankDocumentServiceBean の複数のインスタンスになる場合があります。タブに適した、より粗いスコープ (JSF スコープと Spring スコープ)、ある種の会話スコープがあるのではないでしょうか?
各タブは、個別の ID を持つ独自の一般パネル (div) に配置されています。おそらく、JSF/Spring アプリケーションは、リクエストが個別の panel/div から来ていることを検出し、それに応じて BankDocumentServiceBean のインスタンスを選択できますか?
私は推測します-リストとパラメーターを使用したソリューションは機能しますが、これにはより良いアーキテクチャがあるでしょうか? ありがとう!