상세 컨텐츠

본문 제목

JSTL문법 <c:forTokens> c:tag 를 이용한 리스트 정렬기능 구현

programing/JAVA&JSP&SERVLET&SPRING

by ZelKun 2018. 1. 1. 19:46

본문

반응형


DB에서 데이터를 가져올경우 보여주는 정렬이 DB에서 정렬한거랑 다를 경우가 생기는데요

보통 Text ASC, DESC 경우 생기는 문제로 Order 컬럼을 하나 두면 좋겠지만...

실상은 그렇지 못할 경우가 생깁니다.

 

보통 코드성 데이터인데요

위에서도 언급했지만 제일 편한건 Order 컬럼을 두고 정렬시키면 되지만 신규기능이 아닌 서비스에

기능만 추가할 경우 컬럼을 추가 하기가 애매해 지는 경우가 있습니다

하드코딩을 좋아하지 않지만 어쩔수 없는 경우가 있는거죠

 

Servlet단에서 정렬시키면 소스가 수정될 때마다 컴파일을 다시해야하는데...

문제는 서버 JDK 로컬 JDK 다를 경우 서버 반영이 번거로울 있다는 단점이 있죠...

ROOT.war 사용하던지 버전관리 툴을 사용해서 서버에서 자동으로 build하면 좋겠지만...

둘다 아닌 경우는 컴파일 class파일을 ftp 직접 올려야 하는 번거러움...

 

결과적으로 그나마 변경이 용이한 JSP 에다 적용했습니다.

<c:forTokens> 이용해서 말이죠 JSP에다 <% 시작하는 JAVA 소스를 넣기가 싫은 1

 

DB에서 받아온 리스트를 <c:foreach> 사용해서 화면에 표시하는데

<c:forTokens> 넣어서 순번에 맞는 데이터만 표시하도록 말이죠

 

사실 말이 어렵지... 그렇게 어렵진 않습니다.

대신 리스트를 Token수에 맞춰 계속 반복해야 하는 이슈가 있지만 쿨하게 넘어가 줍니다

 

db에서 가져오는 리스트 데이터는

name, type, value type 기준으로 ASC 정렬되있습니다

아래는 샘플 데이터니 value 가지고 정렬하면 되지 않냐는 태클 사절...

  • 참고로 전체 데이터는 oracle rollup 사용 type null 들어가 있습니다 nvl 변환해도 되지만 귀찬...

샘플 리스트 데이터

{name="", type="three", value="87"},{name="", type="two", value="99"},{name="하나", type="one", value="100"}, {name="전체", type="", value="286"}

 

    • jsp 소스

<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>

<%@ page import="java.util.Map"%>

<%@ page import="java.util.HashMap"%>

<%@ page import="java.util.List"%>

<%@ page import="java.util.ArrayList"%>

<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%>

 

<% //DB 연동 대신 List 데이터

List<Map> allList = new ArrayList<Map>();

allList.clear();

 

HashMap<String, Object> hm = new HashMap<String, Object>();

hm.put("name", "셋");

hm.put("type", "three");

hm.put("value", "87");

allList.add(hm);

 

hm = new HashMap<String, Object>();

hm.put("name", "둘");

hm.put("type", "two");

hm.put("value", "99");

allList.add(hm);

 

hm = new HashMap<String, Object>();

hm.put("name", "하나");

hm.put("type", "one");

hm.put("value", "100");

allList.add(hm);

 

hm = new HashMap<String, Object>();

hm.put("name", "전체");

hm.put("type", null);

hm.put("value", "287");

allList.add(hm);

 

request.setAttribute("allList", allList); //JSP 데이터 전달

out.print("list size:\t" + allList.size()); //List Size 출력

out.print("<br/>list :\t" + allList); //List 내용 출력

%>

 

<!DOCTYPE html>

<html lang="ko">

<head>

<meta charset="utf-8" />

<title>c:forTokens test</title>

</head>

<body>

<table border="1">

<thead>

<tr>

<td>구분</td>

<td>카운트</td>

</tr>

</thead>

<tbody>

<c:set var="orderType" value="one,two,three,all" />

<c:forTokens items="${orderType}" delims="," var="type">

<c:forEach items="${allList }" var="item" varStatus="i">

<c:if test="${(type eq item.type) or (type eq 'all' and empty item.type)}">

<tr>

<td><c:out value="${item.name}" /></td>

<td><c:out value="${item.value }" /></td>

</tr>

</c:if>

</c:forEach>

</c:forTokens>

</tbody>

</table>

</body>

</html>

 

  • 결과

적용

적용

c:set tag 이용하여 정렬순서를 하드코딩으로 지정하고

token 순회하면서 리스트에 해당하는 type 있는경우 출력하도록 c:if문을 사용한 경우 입니다.

결과적으로는 원하는데로 데이터를 출력하게 되었네요

 

다시한번 강조하지만.. 편법이니 DB에서 제공하는 정렬기능 쓰는게 소스도 깔끔하고 성능이 좋습니다

 

  • 참고


반응형

관련글 더보기

댓글 영역