我正在尝试向我的 JSF(facelets)/Spring/ 应用程序添加多个选项卡功能,类似于 OpenBravo 已经具有的功能(http://wiki.openbravo.com/w/images/9/9c/WIK_PartsOfScreen.png,但它们的应用程序使用不同的技术——我猜——纯 JavaScript 用于 GUI):每个文档或报告都可以在单独的 JavaScript 选项卡中打开。
基本上它很简单——每个文档或报告都是单独的 JSF 区域,并且只有其中一个是可见的。标签只是视觉效果。
问题在于与 JSF 支持 bean(或有时可以在此角色中使用的 Spring bean)的通信。Ee 对于一个选项卡界面来说很简单:可以创建以下 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 的附加标识符,即与用户与之交互的选项卡。
但也许有更好的方法。例如,也许一页可以是旧的良好单文档 BankDocumentServiceBean 的多个实例。也许有较少的粗略范围(JSF 范围和 Spring 范围)适用于选项卡,某种对话范围?
每个选项卡都位于其自己的通用面板 (div) 中,并具有其独特的 ID。也许 JSF/Spring 应用程序可以检测到请求来自不同的面板/div 并相应地选择 BankDocumentServiceBean 的实例?
我猜 - 带有列表和参数的解决方案会起作用,但也许有更好的架构呢?谢谢!