簡體   English   中英

JSF托管bean和無狀態EJB的最佳模式是什么

[英]Whats the best pattern for JSF managed beans and stateless EJBs

您認為關於會話范圍和請求范圍實現JSF托管Bean的最佳方法是什么? 就我而言,我有一個帶有EJB模塊和Web模塊的EAR應用程序。 EJB模塊提供無狀態會話Bean。 現在,在Web模塊中,我在sessionScope中使用ManagedBean。 該bean注入了一些無靜態會話ejb,並包含一些包含可在不同頁面中使用的業務數據的值對象。

@Named("workflowController")
@SessionScoped
public class WorkflowController {
    private List<ItemCollection> someList;
    private ItemCollection someBusinessData;
    /* Services */
    @EJB
    private MyService myService;

該bean為前端提供了許多操作方法,並利用了無狀態會話bean。 這是一般的好習慣嗎? 還是應該更改控制器以請求范圍? 我看到過這樣的項目,其中前端控制器僅在RequestScoped中使用,並將所有業務Data對象作為ManagedProperty注入,這些對象在SessionScope中作為ManagedBeans實現。

在我的示例中,我在SessionScope中只有一個控制器來擁有所有業務價值並提供在無狀態ejb中實現的業務方法。 在另一種情況下,RequestScopde中使用了一個控制器,並且有許多BusinessValue對象在SessionScope中實現為MangedBeans,並注入到控制器bean中。

我的問題是:將會話EJB注入到SessionScope托管bean中通常是不好的做法嗎?

如果會話范圍內的受管bean需要訪問業務邏輯,那么將無狀態EJB注入其中並不是一個壞習慣。

不好的做法是過度使用會話作用域的Bean。

只能將會話范圍的Bean用於HTTP會話真正具有全局性的事物,例如有關當前登錄用戶或購物車的詳細信息。 請注意,每當用戶在瀏覽器中打開多個窗口或選項卡時,會話范圍的Bean都可能受到競爭條件的限制。

在具有數十到數百個頁面的典型Web應用程序中,通常最多應該只有少數幾個會話范圍的bean。

對於支持單個頁面的托管bean(稱為支持bean),視圖范圍通常是JSF中最合適的范圍。 根據頁面的確切位置,請求范圍也可能合適。 根據經驗,在最初請求頁面時加載數據(回發后也需要)時,請使用視圖范圍。 如果沒有此類數據,請嘗試是否可以擺脫請求范圍。

如果您需要跨一種流程跨越多個頁面,則可以選擇通過GET參數傳遞數據,前提是它涉及已持久化的數據,並且可以在其中傳遞其ID。 否則,您可能想調查對話范圍。

不幸的是,JSF 2.1和以前的版本本身並不支持CDI托管bean的視圖范圍,但是像CODI這樣的第三方項目提供了一個實現(JSF 2.2最有可能開箱即用地支持CDI的視圖范圍)。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM