JSTL 다중배열(리스트), 동적변수(?) 사용하기

사용자 ID 별 합계 및 리스트를 사용이 필요하게 되어 작성..

기존 PHP에 다중배열(맵)로 처리되어 있는 방식을

Java 로 변환하려하다보니 찾아보게 되었으며, 정리하게 됨.

우선 PHP 소스..

$idList = array();
블라블라~
$data[$id][] = array( 'amt' => $amt );

$data 라는 맵에 id를 키로 한 다중배열을 가지고 있는 형태이다.

$id 는 $idList에서 관리하고 있다.

현재 운영중인 PHP 화면

위 화면에서 처럼 사용자별 요약 값과 각 리스트가 존재하는 형태.

이것을 Java로 변환하려다보니..

HashMap 과 ArrayList 를 병행하여 사용하게 되었다.

ArrayList<ReportVO> reportList = reportService.getReportList(pMap);
HashMap<String, ArrayList<ReportVO>> reportMap = new HashMap<String, ArrayList<ReportVO>>();
ArrayList<String> idList = new ArrayList<String>();

String beforeId = "";
String usrId = "";
for (ReportVO reportVO : reportList) {
	usrId = reportVO.getUsrId();
	
	if(!beforeId.equals(usrId)) {
		beforeId = usrId;
		idList.add(usrId);
		if(reportMap.containsKey(usrId)) {
			reportMap.get(usrId).add(reportVO);
		}else {
			reportMap.put(usrId, new ArrayList<ReportVO>());
			reportMap.get(usrId).add(reportVO);
		}
	}
}
위와 같이 현재 아이디와 이전 아이디가 다른 경우 ID를 ID를 관리하는 ArrayList 에 담아준다.

그리고 해당 ID에 해당하는 HashMap인 reportMap 에 처음 조회한

reportList 객체 reportVO를 담아준다.

이후 출력

<c:forEach items="${idList}" var="id">
	<c:forEach items="${reportMap[id]}" var="reportVO">
		<tr>
			<td rowspan="${fn:length(reportMap[id])}">
				${reportVO.usrId}
			</td>
		</tr>
	</c:forEach>
</c:forEach>

위와 같이 ID 리스트를 기준으로

각 아이디가 가지고 있는 reportVO 리스트를 반복하여 조회하여 준다.

여기서 내가 몰랐던 사실은 맵에 있는 값을 가져오기 위하여

객체.변수명 으로 사용하려고 했던 부분..

사용자 아이디가 예를 들어 TEST 라고 한다면

${reportMap.TEST} 로 사용하기 위하여

${reportMap.${id}} 후

<c:forEach items=”${reportMap.${id}}”> 와 같이 사용…하는 등..

(작동하지 않음-_- 오류 뱉어 냅니다.)

<c:set> 태그를 이용하여

<c:set var=”temp”>reportMap.${id}</c:set>

${temp.usrId}

(작동하지 않음 오류 뱉어내요..ㅠㅠ)

정상작동

${reportMap[id]}

(정상작동합니다.)

맵에서 리스트를 조회 할때에는 위와 같이 PHP에서 문자열을 키로 사용하듯이 사용하니..

정상 작동한다.

0 글이 마음에 드셨다면 하트 꾸욱~

댓글 남기기

이메일은 공개되지 않습니다. 필수 입력창은 * 로 표시되어 있습니다