というかJSTLにつまづき。
変なとこで躓いた。
サーバ側のアクションでは、
Map<String, Holiday>holidayMap = new HashMap<String, Holiday>;
と定義してたんですよ。ちなみにHolidayってのはEntityでお作法にしたがって、
@Entity @Table(name = "holidays") public class Holiday { @Id @GeneratedValue public Integer id; @Temporal(TemporalType.DATE) public Date date; public String name; }
としていたのですよ。
たとえば2008年7月を表示しているのであれば、mapに
"21" => holidayオブジェクト(nameは"海の日")
となるわけです。で、JSPでは以下のように、
<!-- boxlen はカレンダーのセルの数です。--> <c:forEach var="n" begin="1" end="${boxlen}"> <!-- 日付--> <c:set var="day" value="${n - calendarDto.startDayOfWeek + 1}" /> : <c:if test="${holidayMap[day] != null}"> <!-- まずここが無理--> : </c:if> </c:forEach>
ELを使って、マップにダイレクトアクセスしたいんだけどできない。キーは変数はあかんのか? 結局、苦し紛れにmapもforEachでまわすことにした。また次に問題発生。
<!-- boxlen はカレンダーのセルの数です。--> <c:forEach var="n" begin="1" end="${boxlen}"> <!-- 日付--> <c:set var="day" value="${n - calendarDto.startDayOfWeek + 1}" /> : <c:forEach var="hol" items="${holidayMap}"> <c:if test="${hol.key == day}"> <c:set var="holiday" value="${hol.value}" /> ${f:h(holiday.name)} <!-- ここでだめ --> </c:if> </c:forEach> </c:forEach>
Holidayというentityのnameにアクセスできないと言われた。nameプロパティあるのに。
ここでかなり時間を費やしてしまった。あまり悩んでも仕方がないので、mapを
"21" => holiday.name
としました。ふう。
道のりは長い。
やっと万年カレンダーと休日対応が完成。