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를 가지고 정렬하면 되지 않냐는 태클 사절...
샘플 리스트 데이터 |
{name="셋", type="three", value="87"},{name="둘", type="two", value="99"},{name="하나", type="one", value="100"}, {name="전체", type="", value="286"} |
|
<%@ 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에서 제공하는 정렬기능 쓰는게 소스도 깔끔하고 성능이 좋습니다
JSP/SERVELT HTML Character Entity 특수문자 치환 StringEscapeUtils & 처리 (0) | 2019.11.30 |
---|---|
[JSP/SERVLET/SPRING] 다운로드 한글파일명 처리 (0) | 2019.08.24 |
JSTL문법 <c:forEach> c:tag를 이용한 리스트 출력 (0) | 2018.01.01 |
JAVA 자바 Mysql Load Data Infile (0) | 2016.09.20 |
JAVA 자바 jdk설치 - 윈도우 (0) | 2016.02.08 |
댓글 영역