2014-03-24 32 views
0

下面是2個工作示例,它們具有相同的用途:檢索應用程序全局的FAQ結果。我們根據輸入值獲取結果並更新數據表。查看綁定&ApplicationScoped bean與RequestScoped bean

第一個使用RequestScoped和bean bindng。
第二個使用ApplicationScoped bean和視圖綁定。

實施例1:

XHTML

<h:inputText id="faqSearch" value="#{faqBean.filter}"/> 
<h:commandButton value="submit" ajax="true" update="faqResults"/> 

<h:dataTable 
    id="faqResults" 
    value="#{faqBean.retrieveResults()}" 
    var="result"> 

     <h:column>${result}</h:column> 

</h:dataTable> 

@RequestScoped 
@ManagedBean 
public class FaqBean { 

    String filter; 

    public String getFilter(){ 
     return filter; 
    } 

    public void setFilter(String filter){ 
     this.filter = filter; 
    } 

    public List<String> retrieveResults(){ 
     //compute result from a backend service based on filter 
     return doSomething(filter); 
    } 

實施例2:

XHTML

<h:inputText id="faqSearch" binding="#{filter}"/> 
<h:commandButton value="submit" ajax="true" update="faqResults"/> 

<h:dataTable 
    id="faqResults" 
    value="#{faqBean.retrieveResults(filter.value)}" 
    var="result"> 

     <h:column>${result}</h:column> 

</h:dataTable> 

@ApplicationScoped 
@ManagedBean 
public class FaqBean { 
    public List<String> retriveResults(String filter){ 
     //Compute result from a backend service based on filter 
     return doSomething(filter); 
    } 

所以1似乎是很好的方式去與JSF。
但是2對我來說似乎是更好的解決方案,因爲它不會在每次執行時創建/銷燬一個bean,bean對應用程序來說是靜態的。

但是有了這種思維方式,我們可以擺脫所有的requestcope bean,所以它感覺不對。也許這個解決方案比第一個更糟糕,我不知道這是如何管理的。

那麼最好的方法是什麼?

回答

0

這將是一個意見問題,而不是分析服務器爲每個請求創建一個新的bean實例需要多少成本。如果每個請求只檢索一個單一值,那麼這些實現中的任何一個都是有效的,也許你應該使用後者,而不是,但是,因爲它看起來不像一個真正的用例,其中不執行任何業務邏輯和總是檢索一個結果,但每個請求可以有不同的過濾器,那麼1st會更好,因爲您的getter必須儘可能地乾淨。這意味着,在JSF託管的bean中,獲取者不應該有具有任何業務邏輯,因爲它們可以由應用程序多次調用。因此,當您添加一些業務邏輯來處理過濾器時,您會意識到每個請求都可以返回不同的結果,這導致使用前一個使用@RequestScoped bean的實現。

由於您真正的問題是關於檢索所有應用程序全局的FAQ信息,因此您應該將常見問題數據加載到應用程序的全局資源中,如緩存空間或其他@ApplicationScoped bean,然後執行每個請求這個全局資源不會觸及你的數據庫。

更多信息:

+0

我不知道我很困惑,或者你是。 GetResultsName()可能是錯誤的命名。它根本不是一個getter,它是一個函數操作邏輯並返回不同的結果。 – Ghetolay

相關問題