2011-07-18 32 views
2

使用枚舉我想使用JSTL做一些網站開發和我碰上 以下問題:在JSTL

在這裏,我想創建一個下拉列表,其中顯示的數值是 的國名,並值是國家代碼。要做到這一點我 在後端Java代碼以下枚舉:

public static enum CountryCodes implements EnumConstant { 
     USA, CAN, AUS, GBR, DEU, ESP, GUM, IND, ISR, MEX, NZL, PAN, PRI; 

     public final String toCountry(){ 
       switch(this){ 
       case USA: 
         return "United States"; 
       case CAN: 
         return "Canada"; 
       case AUS: 
         return "Australia"; 
       case GBR: 
         return "Great Britan"; 
       case DEU: 
         return "Germany"; 
       case ESP: 
         return "Spain"; 
       case GUM: 
         return "Guam"; 
       case IND: 
         return "India"; 
       case ISR: 
         return "Isreal"; 
       case MEX: 
         return "Mexico"; 
       case NZL: 
         return "New Zealand"; 
       case PAN: 
         return "Panama"; 
       case PRI: 
         return "Puerto Rico"; 

       } 
       return this.toString(); 
     } 
} 

,而JSP代碼片段是這樣的:

<c:set var="countryCodes" value="<%=RequestConstants.CountryCodes.values()%>" /> 
<td> 
    <select id="<%=RequestConstants.CLModifyPage.COUNTRY_CODE%>" 
     name="<%=RequestConstants.CLModifyPage.COUNTRY_CODE%>"> 
     <c:forEach items="${countryCodes}" var="countryCode"> 
      <c:choose> 
       <c:when 
        test="${sessionScope.CURRENT_INSTITUTION.countryCode == countryCode}"> 
        <option value="${countryCode}" selected="selected"> 
         ${countryCode.toCountry()}</option> 
       </c:when> 
       <c:otherwise> 
        <option value="${countryCode}">${countryCode.toCountry()} 
         </option> 
       </c:otherwise> 
      </c:choose> 
     </c:forEach> 
    </select> 
</td> 

但上面的代碼中有兩個問題:

  1. countryCode.toCountry()實際上並不工作......我不確定它應該是什麼語法。

  2. 如果"${sessionScope.CURRENT_INSTITUTION.countryCode}"不是一個有效的枚舉值,即如果它類似於「AAA」,那麼比較失敗並拋出java.lang.IllegalArgumentException:no enum const CountryCodes.AAA定義。我該如何解決這個問題?

回答

9

您的方法太複雜了。

重新設計你的枚舉如下:

public enum CountryCode { 

    USA("United States"), 
    CAN("Canada"), 
    AUS("Australia"); 
    // ... 

    private String label; 

    private CountryCode(String label) { 
     this.label = label; 
    } 

    public String getLabel() { 
     return label; 
    } 

} 

(注意,現在有一個fullworthy和更高效的吸!)

商店servlet的init()方法過程中應用範圍的枚舉值或更好,在ServletContextListenercontextInitialized()方法:

servletContext.setAttribute("countryCodes", CountryCode.values()); 

如下最後到達目的:

<select name="countryCode"> 
    <c:forEach items="${countryCodes}" var="countryCode"> 
     <option value="${countryCode}" ${institution.countryCode == countryCode ? 'selected' : ''}>${countryCode.label}</option> 
    </c:forEach> 
</select> 
+0

非常感謝您!該解決方案確實解決了第一個問題。但是在比較期間,當institution.countryCode不是一個有效的枚舉值時,它仍然會給出一個例外。 – Suli

+2

它究竟能不能成爲一個有效的枚舉值?這是一個'國家代碼',對吧?或者畢竟是一個'String'?相應地修復類型。否則使用枚舉是完全沒有意義的。 – BalusC

+2

+1,因爲自從幾年前提出這個問題後,OP還沒有在SO上,這應該被自動接受。只有次要的事情我會改變,而不是'$ {institution.countryCode == countryCode? 'selected':''}',我會替換' selected =「selected」'。 –

1

如果你正在使用Spring,你可以

<form:select path="_path" > 
    <spring:eval expression="T(com.EnumName).values()" var="_enum"/> 
    <c:forEach items="${_enum}" var="_value"> 
     <form:option value="${_value}" label="${_value.label}"/> 
    </c:forEach> 
</form:select>