вложенная коллекция Java для перечисления элементов на человека в день в сетке календаря с использованием JSTL? - PullRequest
0 голосов
/ 13 октября 2010

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

В конечном итоге мне нужно отобразить таблицу на странице JSP, которая выглядит примерно так:

October 2010
Employee Sun Mon Tue Wed Thu Fri Sat Sun Mon Tue Wed Thu ...
                              1   2   3   4   5   6   7  ...  
  Abate   *   *   *   *   *  [E]
  Adams   *   *   *   *   *          [E]     [E]
  Benson  *   *   *   *   *      [E]             [E]

Где [E] будет список предметов или событий против этого сотрудника за этот конкретный день

И это примерный список событий из вызова sql:

EVENT_ID BADGE  EVENT_TYPE_ID EVENT_TYPE_NAME  EVENT_S_DATE 
1        134311 5610          Business Travel  2010-10-08
2        101379 7646          Floating Holiday 2010-10-11
3        005396 3600          Vacation         2010-10-12
4        134311 1318          Military         2010-10-12
5        134311 0575          Sick Time        2010-10-12
6        101379 6652          Unpaid           2010-10-18
7        111243 0575          Sick Time        2010-10-29 

Мой первый подход состоял в том, чтобы использовать вложенные хеш-карты и вводить их с указанием дня, но мне было трудно ссылаться на значение на карте с помощью JSTL из-за проблем с использованием чисел для ключей (мой ключ был смещением числа ячеек на день начала Октябрь начинается в день 5 или в пятницу).

EL получить доступ к значению карты с помощью клавиши Integer

JSTL и hashmap не работают .

Я предвижу создание в сервлете связки циклов, которая заполняет какой-то тип контейнера для достижения этой цели.

Я ищу по крайней мере что-то вроде "О, вложите Список в Карту и прочее, что в другой карте", чтобы начать меня.

Ответы [ 2 ]

0 голосов
/ 19 октября 2010

Хорошо, я наконец-то разобрался во вложенной коллекции и зациклился, так что я отвечу на свой вопрос.Как в сервлете, так и в коде представления, возможно, есть некоторые улучшения, но это работает.

Сервлет:

ArrayList eventListPerDayPerBadge = new ArrayList();
ArrayList eventListPerDay = new ArrayList();
HashMap eventMapByDay = new HashMap();
HashMap eventMapByDayByBadge = new HashMap();

int lastDay = 0;
int eventDay = 1;
String lastBadge = "0";
String currentBadge = "currentBadge";
Event event = null;

Iterator eventList = employeeEvents.iterator();
while (eventList.hasNext()) {

    event = (Event) eventList.next();
    eventDay = DateUtil.toCalendar(event.getEvent_s_date()).get(Calendar.DATE);

    currentBadge = event.getBadge();

    if (eventDay == lastDay) {
        eventListPerDay.add(event);
        if (currentBadge.equals(lastBadge)) {
            eventListPerDayPerBadge.add(event);
        }
        else {
            HashMap tempMap = new HashMap();
            if (eventMapByDayByBadge.get(lastBadge) != null) {
                tempMap = (HashMap) eventMapByDayByBadge.get(lastBadge);
            }
            tempMap.put(new Long(eventDay), eventListPerDayPerBadge);
            eventMapByDayByBadge.put(lastBadge, tempMap);
            eventListPerDayPerBadge = new ArrayList();
            eventListPerDayPerBadge.add(event);
        }
        eventMapByDay.put(new Long(eventDay), eventListPerDay);
    }
    else {
        if (!"0".equals(lastBadge)) {
            HashMap tempMap = new HashMap();

            if (eventMapByDayByBadge.get(lastBadge) != null) {
                tempMap = (HashMap) eventMapByDayByBadge.get(lastBadge);
            }
            tempMap.put(new Long(lastDay), eventListPerDayPerBadge);
            eventMapByDayByBadge.put(lastBadge, tempMap);
            eventMapByDay.put(new Long(lastDay), eventListPerDay);
        }

        eventListPerDayPerBadge = new ArrayList();
        eventListPerDayPerBadge.add(event);

        eventListPerDay = new ArrayList();
        eventListPerDay.add (event);

    }

    lastDay = eventDay;
    lastBadge = currentBadge;
}


// Get the last record into the maps    
HashMap tempMap = new HashMap();
if (eventMapByDayByBadge.get(lastBadge) != null) {
    tempMap = (HashMap) eventMapByDayByBadge.get(lastBadge);
}
tempMap.put(new Long(eventDay), eventListPerDayPerBadge);
eventMapByDayByBadge.put(lastBadge, tempMap);
eventMapByDay.put(new Long(eventDay), eventListPerDay);

request.setAttribute("eventMapByDayByBadge", eventMapByDayByBadge);
request.setAttribute("eventMapByDay", eventMapByDay);

Представление (не все атрибуты, используемые в представлении, отображаются в сервлете):

<table align="center" border="1" cellpadding="3" cellspacing="0" width="100%">
  <tbody>
  <!-- Header ROW -->
     <tr>
        <th>Employee</th>
        <c:forEach var="week" begin="1" end="${iTotalweeks}" varStatus="status">
        <th class="optionYellow">Sun</th>
        <th>Mon</th>
        <th>Tue</th>
        <th>Wed</th>
        <th>Thu</th>
        <th>Fri</th>
        <th class="optionYellow">Sat</th>
        </c:forEach>
     </tr>
  <!-- Week Day Number ROW -->
     <tr>
        <td align="center" height="35" class="dsb">*&nbsp;</td>
        <c:forEach var="week" begin="1" end="${iTotalweeks}" varStatus="status">

           <c:forEach var="cell" begin="${1+7*(week-1)}" end="${7+7*(week-1)}"
              step="1" varStatus="status">
              <c:set var="dayNo" value="${cell-weekStartDay+1}" />
                 <c:choose>
                 <c:when test="${weekStartDay>cell || (cell-weekStartDay+1)>days}">
                    <td align="center" height="35" class="<c:out value="${weekendCellMap[cell]}" />">*&nbsp;</td>
                 </c:when>
                 <c:otherwise>
                    <td class="<c:out value="${holidayColorMap[dayNo]}" />"><span class="calDayNo"> <c:out value="${dayNo}" /></span>
                       <span class="calDayName"> <c:out value="${holidayNameMap[dayNo]}" /></span>
                    </td>
                 </c:otherwise>
                 </c:choose>
           </c:forEach>

        </c:forEach>
     </tr>

  <!-- Employee ROW -->
     <c:forEach var="employee" items="${employeeList}">
     <c:set var="map" value="${eventMapByDayByBadge[employee.badge]}" />
     <tr>
        <td align="center" height="35" NOWRAP><c:out value="${employee.lname}" />, <c:out value="${employee.firstName}" /><br>
           (<c:out value="${employee.badge}" />)
        </td>
        <c:forEach var="week" begin="1" end="${iTotalweeks}" varStatus="status">

           <c:forEach var="cell" begin="${1+7*(week-1)}" end="${7+7*(week-1)}"
              step="1" varStatus="status">
              <c:set var="dayNo" value="${cell-weekStartDay+1}" />
           <c:choose>
              <c:when test="${weekStartDay>cell || (cell-weekStartDay+1)>days}">
                 <td align="center" height="35" class="<c:out value="${weekendCellMap[cell]}" />">*&nbsp;</td>
              </c:when>
              <c:otherwise>
                 <td align="center" height="35" class="<c:out value="${holidayColorMap[dayNo]}" />"><span>&nbsp;
                    <c:forEach var="event" items="${map[dayNo]}">
                       <c:out value="${event.event_type_name}" />
                    </c:forEach></span></td>
              </c:otherwise>
              </c:choose>
           </c:forEach>

        </c:forEach>
     </tr>
     </c:forEach>

  </tbody>
</table>

Пример вывода из представления

Sample Output

0 голосов
/ 13 октября 2010

Просто измените метод DAO, чтобы он возвращал Map<Long, Event> вместо Map<Integer, Event>.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...