2009-10-11 30 views
10

我:交通地圖<枚舉,對象>在JSTL

public enum MyEnum{ 
    One, Two, Three 
} 

從控制器,我把模型:

HashMap<MyEnum, Long> map = new HashMap<MyEnum, Long>(); 
map.put(MyEnum.One, 1L); 
mav.addObject("map", map); 

如何在地圖上做的我在JSTL訪問對象關鍵枚舉MyEnum.One,以一種整潔的方式?

${map['One']} //does not seem to work... 

也不

${map[MyEnum.One]} 

回答

11

你不能。最好的辦法是改變你的地圖使用enum.name()作爲關鍵:

HashMap<String, Long> map = new HashMap<String, Long>(); 
map.put(MyEnum.One.name, 1L); 
map.addObject("map", map); 

你的第一個方法是有效的,那麼:

${map['One']} // works now 

或者你可以編寫自定義EL函數做如果你不能/不想改變地圖,你可以在上面找到。

+0

使用自定義EL函數 - 其最維護的方式。 – Chii 2009-10-13 12:36:22

13

這是不完全真實的,你不能這樣做,但解決的辦法不是完全直線前進。問題是EL不轉換你通過在地圖鍵爲您相應的枚舉字符串,所以把$ {圖[「一」]}不使用枚舉常量MyEnum.One在地圖上查找。

我遇到同樣的問題,並沒有想要恢復到一個字符串加密映射去,所以當時面臨的挑戰是在JSTL如何獲得實際的枚舉參考地圖查找使用。

所需要的是得到枚舉常量到JSP的範圍,這樣就可以再使用的實際枚舉本身的關鍵。要做到這一點,在控制器你做這樣的事:

for (MyEnum e : MyEnum.values()) { 
    request.putAttribute(e.toString(), e); 
} 

你在這裏做什麼是添加變量引入命名爲枚舉的字符串表示的範圍。 (你當然可以避開一些值前面加上e.toSring()命名的問題)

現在,當你做,你將使用實際的枚舉常量的關鍵和以下

${map[ONE]} 

因此會從地圖中找回適當的對應值。 (注意周圍有沒有一報價,那是因爲你在這種情況下,引用請求屬性之一,即上面添加)

+0

唉!創意解決方案:) – 2014-03-21 17:12:26

+2

非常好,只要你不必使用具有相同名稱的常量的枚舉。 – 2014-06-10 09:35:04

0
${map[MyEnum.One]} 

這對我的作品。但是,你必須寫你的類的完整名稱:my.package.MyEnum或導入MyEnum類:

<%@page import="my.package.MyEnum"%> 
+0

它適用於Pivotal tc Server 3.1.1(來自STS)和Tomcat 8.0.28,但它不適用於Tomcat 8.0.14 – 2015-11-19 08:18:37

1

我通常使用此解決方案:

​​

首先,我導入枚舉。然後,我將我想要的枚舉值保存到JSTL變量中。然後我可以用這個變量作爲鍵訪問地圖。