在我的网络应用中,客户对象包含与信用卡信息相关的字段
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)
任何帮助表示赞赏
感谢
标记
答案 0 :(得分:1)
关于月份,有两个原因:
Date#getMonth()
基于0。 1月是0,2月是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
是一个完整的史诗般的失败而且已经被弃用了