2010-05-12 79 views
0

我正在使用jsp頁面中的JavaBean。我想給它一個動態名稱,因爲根據變量的值(我們稱之爲foo),我希望它具有不同的內容,並且我希望將所有這些不同的版本保留在內存中。我希望這些bean具有會話範圍,因爲重新評估內容非常昂貴。檢索與JSP相關聯的JavaBean名稱或使用動態名稱構建變量

現在這個bean有一個靜態名稱,如果我使用不同的值foo重新加載頁面,那麼這個bean的內容和以前一樣(jsp:usebean查找具有指定名稱的JavaBean,如果它存在,它使用舊的)。我想保留舊版本和新版本,所以它們必須有不同的名稱。

我想這樣做是:

<jsp:useBean id="stats<%=foo%>" class="foo.bar" scope="session"> 
</jsp:useBean> 

我的問題是,我不能引用的JavaBean在JSP中的代碼,因爲我不知道它的名字。有關如何解決這個問題的任何想法?

實質上,我想基於另一個變量的vaslue建立一個動態名稱的變量。

或者,我想檢索與當前頁面關聯的JavaBeans的名稱,以便獲得對剛剛創建的JavaBean的引用。

回答

0

最簡單的方法是實現您存儲在會話範圍內的自定義Map。使用Map,您可以使用大括號來動態引用密鑰。

<jsp:useBean id="beanMap" class="com.example.BeanMap" scope="session" /> 
... 
${beanMap[someDynamicKey].someProperty} 

你只需要重寫Map#get()方法讓,如果沒有,返回null,而不是它的實例豆。

public class BeanMap extends HashMap<String, Bean> { 
    @Override public Bean get(Object key) { 
     Bean bean = super.get(key); 
     if (bean == null) { 
      bean = new Bean(); 
      super.put(String.valueOf(key), bean); 
     } 
     return bean; 
    } 
} 
+0

這似乎很簡單,我也可以un-Bean foo.bar類(我更喜歡)。但是,我會做一些JSP框架已經實現的功能,我寧願不這樣做。 我想如果我不能做到我原先想的那樣,這是一個可以接受的黑客行爲。 :) 謝謝您的回答! – FrontierPsycho 2010-05-13 08:58:57

+0

我試圖做到這一點,Java不明白Bean是一個類,它認爲它是一個類型參數,即使我導入了類。因此「new Bean()」會給出錯誤。我甚至用「字符串」試了一下,我得到了同樣的結果。 – FrontierPsycho 2010-05-13 09:55:10

+0

我使用這個解決方案,雖然修改了一下。我沒有擴展HashMap(因爲它不可能),但我在useBean標記中使用了一個Hashtable,並且在我的jsp代碼中實現了上述邏輯。不是很乾淨,但它的工作原理並不那麼難看。 – FrontierPsycho 2010-05-13 11:28:27