2011-04-29 125 views
1

因爲我沒有太多的javaee編程經驗,也沒有人問,所以我想問你。 我的代碼中有一件事我不喜歡,並且認爲它是以錯誤的方式實現的。 我的託管bean是請求作用域。在jsf我使用rich:pickList從列表中獲取數據。Jsf/Spring request scoped bean

@Scope("request") 
public class MyBean{ 
    private List<String> sourceList; 
    ....  

    public List<String> getsourceList() { 
      //if (sourceList == null) <--- Has no sence in request scoped bean 
      { sourceList = service.loadList(); 
      } 
      return sourceList; 
    } 

.... 

} 

我也提交存儲一些數據的按鈕。

的問題是,當頁面做一些動作的每個時間(例如點擊提交按鈕)該獲得方法被調用,每次和去服務層,然後DAO和數據庫。這顯然似乎是不正確的解決方案。 如何避免它? 謝謝你的答案。

回答

0

如果你在JSF 2.0,你可以通過@ViewScoped使用新的視圖範圍內。

@ManagedBean 
@ViewScoped 
public class Bean { 

    private List<Foo> foos; 

    @EJB 
    private FooService fooService; 

    @PostConstruct 
    public void init() { 
     foos = fooService.list(); 
    } 

    public List<Foo> getFoos() { 
     return foos; 
    } 

} 

當你仍然在JSF 1.x中,這是很好的知道RichFaces' <a4j:keepAlive>Tomahawk's <t:saveState>具有完全相同的請求相同的作用範圍的bean與上面的代碼設計(即不加載數據吸氣):

<a4j:keepAlive beanName="#{bean}" /> 

<t:saveState beanName="#{bean}" /> 

我沒有使用過的新的RichFaces' @KeepAlive註釋,但有關文檔,它應該表現得一樣。

0

每個人都有這個問題,因爲沒有「對話」範圍。你有「會話」(只要用戶登錄)和「請求」(一個請求/響應週期)。

什麼你需要的是一個方式說「用戶已經開始了談話」,然後做一對夫婦屬於會話請求,並最終把它包起來。

由於JavaEE不支持此功能,因此您必須對其進行仿真。當用戶開始會話時,將該bean放入會話範圍並保留在那裏。當用戶完成對話時,手動刪除該bean或告訴它清理它的緩存。

+0

和怎麼樣的keepAlive功能?它會有幫助還是這不是一個好習慣? – ayscha 2011-04-29 08:24:25

+0

有很多keepAlive功能。你在說哪一個? – 2011-04-29 08:29:26

+0

例如,將託管bean指定爲@KeepAlive – ayscha 2011-04-29 08:34:31

0

在web.xml中添加Spring RequestContextListener,Spring可以添加請求範圍和會話範圍。

<listener> 
    <listener-class> 
      org.springframework.web.context.request.RequestContextListener 
    </listener-class> 
</listener> 

CF卡: 3.4.4. The other scopes