сравнение месяца, года части утилит. Дата в выпадающем списке - PullRequest
0 голосов
/ 12 июля 2011

В моем веб-приложении объект клиента имеет поля, связанные с информацией о кредитной карте

public class Customer {
    ...
    private String ccType;
    private Date ccExpirationDate;
    ...
}

На странице jsp я предоставляю раскрывающиеся списки для выбора типа кредитной карты, месяца истечения срока действия, года истечения срока действия.Я хочу проверить, существует ли клиент в сеансе, и если это так, его части кредитной карты и месяц, год и части срока действия соответствуют любому из параметров в раскрывающемся списке, тогда эти параметры отображаются как выбранные.

В contextInitialized() метод класса, реализующего ServletContextListener, я создал карты, как показано ниже.

Map<String,String> cardtypes = new TreeMap<String,String>();
        cardtypes.put("M0", "MasterCard");
        cardtypes.put("D0", "Discover");
...
Map<String,String> expiryMonths = new TreeMap<String,String>();
        expiryMonths.put("01", "January");
        expiryMonths.put("02", "February");
...
Map<String,String> expiryYears = new TreeMap<String,String>();
for(int i=2011;i<2030;i++){
            String year = Integer.toString(i+1);
            expiryYears.put(year,year);
        }
...
sc.setAttribute("ccyears", expiryYears);
sc.setAttribute("ccmonths", expiryMonths);
sc.setAttribute("cctypes", cardtypes);

Я пробовал это.

<tr>
<td>
    <select id="creditCardType" title="select card type" name="creditCardType">
        <c:forEach var="cctype" items="${cctypes }">
            <option ${not empty customer and customer.ccType == cctype.key ? 'selected':'' } value="${cctype.key }">${cctype.value }</option>
        </c:forEach>
    </select>
</td>
</tr>
<tr>
<td>Expiration Date</td>
<td> 
 <select id="cardexpiryMonth" name="cardexpiryMonth">
    <c:forEach var="ccmonth" items="${ccmonths }">
            <option ${not empty customer and customer.ccExpirationDate.month == ccmonth.key ? 'selected':'' } value="${ccmonth.key }">${ccmonth.value }</option>
    </c:forEach>
 </select>
</td>
<td>
<select id="cardexpiryYear" name="cardexpiryYear">
    <c:forEach var="ccyear" items="${ccyears }">
            <option ${not empty customer and customer.ccExpirationDate.year == ccyear.key ? 'selected':'' } value="${ccyear.key }">${ccyear.value }</option>
    </c:forEach>
</select>
</td>
</tr>

Это работает для типа кредитной карты, которая отображается как карточка клиентавыбранный тип. Но месяц и год истечения срока действия клиента не отображаются. Не удалось ли выполнить сравнение внутри строки? Есть ли способ исправить эту проблему?

(я знаю util.Date's getMonth (), getYear () устарела ... но не мог придумать другого способа сделать это, используя EL)

любая помощь оценена

спасибо

оценка

1 Ответ

1 голос
/ 12 июля 2011

Что касается месяцев, есть 2 причины:

  • Date#getMonth() основано на 0. 0 января, 1 февраля и т. Д.
  • Вы поставили перед ключом карты месяца префикс 0. Значение 01 не совпадает с 1. Таким образом, оно будет совпадать только с ноябрем и декабрем в выпадающих списках соответственно октябрь и ноябрь.

В течение многих лет существует 1 причина:

  • Date#getYear() на основе 1900 года. 2011 возвращает 111, 2012 возвращает 112 и т. Д. Значение 111 отличается от 2011, поэтому оно никогда не будет совпадать.

Итак, исправьте код соответствующим образом:

    expiryMonths.put("1", "January");
    expiryMonths.put("2", "February");
    // ...

и в EL

 (customer.ccExpirationDate.month + 1) == ccmonth.key

и

 (customer.ccExpirationDate.year + 1900) == ccyear.key

(Теперь вы, вероятно, лучше поймете, почему Date является полным эпическим провалом и считается устаревшим)

...