2010-08-11 50 views
15

我正在開發一個java webapp,使用jsp/jquery/ejb/jboss。我處於反模式,我想退出

我有一個web表單,使用戶能夠從數據庫中選擇100個字段(全部來自不同的不相關的表/對象)的任意組合。然後這些字段通過java servlet輸出到excel電子表格。執行的存儲過程始終返回所有100個字段。

Web表單在傳輸對象(TO)中設置100個布爾值以確定是否應該顯示數據。然後這個TO被引用以產生電子表格的標題行,並且也針對來自迭代的數據庫的每一行。

這一切正常,但它感覺不對。我想不出一個可行的方法,它不會引用100個布爾值(N + 1次)來確定輸出電子表格中是否應包含字段。當我說可行時,我的意思是,例如,我不想重寫存儲過程或創建100個不同的存儲過程。

+10

+1對於標題名稱 – SethO 2010-08-11 14:53:01

+0

我不清楚你不滿意什麼。 TO的大小或其用於生成查詢的方式? – 2010-08-11 15:40:57

+0

兩者都有。 我這樣做的方式似乎並不是一個特別優雅或有效的解決方案。 – NimChimpsky 2010-08-11 15:58:16

回答

3

我們的解決方案是在類似的情況下創建一個動態的傳輸對象。基本上,這是一個Map,而不是一個有許多getter和setter的POJO。

填充和讀取此傳輸對象的代碼是簡單的迭代。

+0

有趣。那麼在這個例子中,關鍵/價值是什麼? 編輯 - 實際上我猜很明顯。字段標識符/列名作爲鍵,值將是從數據庫返回的數據。 – NimChimpsky 2010-08-11 16:09:38

+1

+1我認爲這是一個很好的解決方案。但我不是有100個getter/setter來繪製地圖,而是在TO中有一個字段名的枚舉類型,而Dictionary 有兩個函數bool GetField(FieldEnum e)和void SetField(FieldEnum e,bool b)。 – 2010-08-11 16:30:42

+0

+1在「正常」TO/Bean上選擇一個映射通常是一種很好的方法,當你需要很多屬性時,將它們分解成不同的對象沒有任何邏輯/語義意義。當我有很多參數並且其中一些是可選參數時,我也有時將它用於方法參數。使用枚舉字段名稱也是一個不錯的選擇。通常,也可以使用一種方法來封裝地圖,該方法允許您提供一個默認值,該值在未設置密鑰時返回,因此您不需要直接在代碼中檢查「null」。 – 2010-08-11 18:26:42

0

您可以消除手動領域枚舉通過:關於形式負載

  • ,每個可用的電子表格字段,則輸出一個布爾控制。可能最好預先添加某種前綴,以免與表單上存在的其他字段發生衝突。

  • 對錶單提交,您顯示任何包含字段的前綴。

1

而不是使用存儲過程,因此您不能在應用程序中動態構建您的選擇SQL字符串,然後執行該SQL語句。所以你只需要引用一次布爾值,然後你只返回你需要的列。

0

您必須評估這是否真的更好,但您可以使用一種方法,即使用位數組來存儲是否使用這些字段。每個字段將具有對應於單個位的值:

static final FIELD1 = 1; 
static final FIELD2 = 2; 
static final FIELD3 = 4; 
static final FIELD4 = 8; 
static final FIELD5 = 16; 
etc 

選擇時,或0時不選擇的每個表單字段將具有其比特值的值。在表單提交中,總計字段並提交值。所以如果FIELD1和FIELD3被選中,你會提交一個值5(二進制00101)。

然後你申請一個簡單的掩碼爲每個字段來確定選擇哪一個(有沒有比場逐場更好的辦法?):

boolean field1Selected = sum & FIELD1; 
boolean field2Selected = sum & FIELD2; 
etc 

缺點:有100個字段,你談論一個非常大的數字!您可能必須使用2位數組。我也不相信這真的會簡化你的問題,但也許它確實。

+0

這只是用100個掩碼替換100個布爾字段嗎?它確實使得TO在內存*中變得更小*,但是OP正試圖解決的問題是什麼? – 2010-08-11 15:53:24

+0

生成的用於存儲位掩碼的數字僅適用於java max的整數值範圍。我認爲。 TO在內存中稍小,但這是我能看到的唯一好處。 最初的問題實際上是尋找一種「比逐場更好的方法」。 – NimChimpsky 2010-08-11 16:07:11