這可能是一種架構問題,但仍然必須具有「最佳實踐解決方案」或公認的標準。使用jsf會話作用域管理bean來表示靜態分層數據
我在談論某種需要在網站上顯示的靜態數據,如產品目錄,菜單和菜單項目列表,麪包屑塊列表等。使用任何標準CMS時,此選項可用假設。
但我想爲這個問題使用純粹的JSF解決方案。
因此,要回到這個問題,我乾的闡述基於以下原則:
數據不應該在小面被硬編碼,因此我用的數據庫在下面持有的價值觀,像DB腳本(MYSQL在我的情況):
CREATE TABLE CatalogueGroup ( CatalogueGroupName VARCHAR(100) NOT NULL PRIMARY KEY, URLPath VARCHAR(200) NOT NULL, ParentGroupName VARCHAR(100) DEFAULT NULL, FOREIGN KEY (ParentGroupName) REFERENCES CatalogueGroup(CatalogueGroupName) ON UPDATE CASCADE ON DELETE SET NULL )ENGINE=InnoDB DEFAULT CHARSET=utf8;
我會那麼喜歡用實體類的@ManagedBean舉行,並在視圖中顯示出來,就像
public class CatalogueGroup implements Serializable { private String catalogueGroupName; private List<CatalogueGroup> children = new ArrayList<CatalogueGroup>(); private CatalogueGroup parentGroup; //other stuff of this bean } @ManagedBean @SessionScoped public class CatalogueBean implements Serializable { private CatalogueGroup catalogue;//loaded via CatalogueGroupDAO with condition parentGroup == null //other stuff of this bean } //snippet of xhtml view for a two-level catalogue <ul><h:outputText value="#{catalogueBean.catalogue.catalogueGroupName}" /> <ui:rereat value="#{catalogueBean.catalogue.children}" var="group"> <li><h:outputText value="#{group.catalogueGroupName}" /></li> </ui:repeat> </ul>
上述設置工作,但它感覺它是一個尷尬的。 所以,我想下面的開放,「最佳實踐」的問題提升到JSF社區:
- 什麼是建立一個目錄豆這樣的正確方法:
- 一個
@SessionScope
的bean將被加載一次並在每個視圖上重新顯示,或者將在每個頁面顯示上訪問數據庫的bean。
- 一個
- 有沒有辦法在的facelet視圖設置遞歸函數,或者我應該限制目錄嵌套級,比方說,2或3
- 我想顯示某種修改目錄,暴露更多羣組添加到已登錄的用戶,具體取決於他的角色(添加到數據庫表中的列),並在沒有用戶登錄時顯示基本目錄。此外,我想偶爾在目錄中插入一些新組,登錄,但一次重新顯示正確的數據:
- 要過濾業務層中的組並將過濾後的CatalogueGroup暴露給bean,否則我將加載整個目錄並限制其c視圖中的hildren呈現= false;
- 正在曝光整個目錄中的一個正確的方式去;
- 是否有可能向服務器上的所有當前CatalogueBean活動刷新其屬性(CatalogueGroup)時添加新數據庫條目或實現此功能,我只需要使用
@RequestScoped
bean; - 如果使用請求作用域bean是唯一的選擇,那麼訪問數據庫是非常明智的選擇,以便頻繁獲取數據,而這些數據很少發生變化,或者存在更明智的做法;
- 當用戶登錄(並註銷)時,已存在會話範圍目錄的實例,如何刷新它:我是否需要在操作/操作偵聽器中手動執行此操作,或者需要使會話無效或執行一些更合適的操作情況。