2011-02-24 113 views
2

我一直在開發我的第一個Java EE應用程序,它有許多JPA實體類,每個類都有一個用於處理業務邏輯的相應EJB類。我所做的是將這些bean中的一個從Stateless更改爲SessionScoped,因此我可以使用它來讓用戶通過一系列表單字段工作,所有表單字段都在JSF表單上呈現。Java EE:使用bean將表示邏輯與業務邏輯分離

但是,我開始認爲這顯然是錯誤的,因爲我在EJB中執行諸如「submitStep1」和「goBackToStep2」之類的方法。這些方法設置了JSF頁面上各種標記的渲染元素所使用的指示符,因此它們顯然是「表示邏輯」。

我的問題是,我應該如何重新構造我的代碼?我在想我應該只有一個SessionScoped(或者應該是有狀態的?)bean,它處理我的JSF頁面的表示邏輯,並且能夠使用所有其他ejbs(以及我的JPA類的擴展)。這個bean將位於我的應用程序的表示層級,這意味着我的業務邏輯層不需要任何會話範圍的會話Bean。

現在這一切對我來說都是有意義的,也是我可能要做的。然而,我的問題的原因是,在我的JSF xhtml頁面上,我使用JSF EL標籤來引用EJB內容。在編寫表示層類時,我需要注意哪些與JPA相關的陷阱?

我知道我的問題很含糊,而且沒有真正涉及到具體的例子。儘管我在這個站點和其他站點上發現了很多有關Stateful v無狀態bean的內容,但我只是想知道我的預期結構是最好的。

+0

[JSF控制器,服務和DAO]的可能重複(https://stackoverflow.com/questions/30639785/jsf-controller-service-and-dao) – Kukeltje 2017-07-10 06:21:05

回答

0

爲什麼不使用支持bean作爲演示目的,因爲它們適用於它,並且可以輕鬆配置其範圍,並將EJB留給業務層?

直接在表示層上使用實體時,應該意識到事務範圍,特別是關於惰性關係。也就是說,通常每個請求使用一個事務,這意味着在不同的請求中,實體將被分離,因此您需要重新加載它們以加載懶惰的關係。你可以使用一個過濾器自動執行每個請求或手工處理它。您也可以在不同的請求期間保留相同的事務,但長事務通常不是一個好主意,特別是如果在此事務期間DB中有更新/創建。

+0

歡呼聲回覆。是的,我明白你對交易範圍的意思。 Anyhoo,我設法將我的表示邏輯轉移到支持bean中,而EJB現在只處理業務層。總而言之,它是開發我的第一個Java EE應用程序的不錯的體驗。 – JohnHailey 2011-03-28 18:24:10