Использование enum в JSTL - PullRequest
       7

Использование enum в JSTL

2 голосов
/ 19 июля 2011

Я пытаюсь сделать какую-то разработку веб-сайта с помощью jstl, и я сталкиваюсь со следующей проблемой:

Здесь я пытаюсь создать раскрывающийся список, в котором отображаемое значение - это названия стран, а значение - этокод страны.Для этого у меня есть следующий enum в бэкэнд-коде 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: перечисление enst const не определено.Как я могу обойти это?

Ответы [ 2 ]

9 голосов
/ 19 июля 2011

Ваш подход слишком сложен.

Перепроектируйте ваше перечисление следующим образом:

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;
    }

}

(обратите внимание, что теперь у него есть полноценный и более эффективный получатель!)

Сохранять значения перечисления в области приложения во время метода init() сервлета или, лучше, во время метода ServletContextListener * contextInitialized():

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>
1 голос
/ 24 июля 2015

Если вы используете пружину, вы можете

<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>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...