というか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

としました。ふう。
道のりは長い。

やっと万年カレンダーと休日対応が完成。