比较下拉列表中的util.Date的月份,年份部分

时间:2011-07-12 13:34:04

标签: jsp drop-down-menu comparison el

在我的网络应用中,客户对象包含与信用卡信息相关的字段

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

在jsp页面中,我提供下拉列表以选择信用卡类型,到期月份,到期年份。 我想检查会话中是否存在客户,如果是这样,他的信用卡类型和到期日期的月份,年份部分与下拉列表中的任何选项匹配,那么这些选项将显示为已选中。

在实现ServletContextListener的类的contextInitialized()方法中,我创建了如下地图。

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>

这适用于信用卡类型,它显示为客户的卡类型选择。但是客户的到期月份和年份未显示为选中..是否因int-string比较而失败?有没有办法纠正此问题?

(我知道util.Date的getMonth(),getYear()已被弃用..但是可以想到没有其他方法可以使用EL)

任何帮助表示赞赏

感谢

标记

1 个答案:

答案 0 :(得分:1)

关于月份,有两个原因:

  • Date#getMonth()基于0。 1月是0,2月是1,等等。
  • 您已将月份地图键的前缀加为0.值01与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是一个完整的史诗般的失败而且已经被弃用了