28일 차 특이사항
1. 게시판을 엑셀파일로 다운로드하기 - jsp에서 구현이 가능하다.
게시판 엑셀 다운로드
1. 해보니까 생각보다 쉬웠다. 컨트롤러와 연결된 jsp 파일의 contentType을 변경해 주면 된다.
<%@ page language="java" contentType="application/vnd.ms-excel;charset=UTF-8"
pageEncoding="UTF-8"%>
<%
response.setHeader("Content-Disposition","attachment;filename=board.xls"); //디폴트 파일명 지정
response.setHeader("Content-Description", "JSP Generated Data");
%>
어떤 원리냐? 코드를 하나씩 살펴보자.
● 문서 타입 및 문자 인코딩 설정
<%@ page language="java" contentType="application/vnd.ms-excel;charset=UTF-8" pageEncoding="UTF-8"%>
: JSP 페이지의 언어 설정 및 응답의 콘텐츠 타입과 문자 인코딩을 설정한다. 이 코드에서는 콘텐츠 타입을 "application/vnd.ms-excel"로 설정하여 엑셀 파일을 생성하겠다는 것을 나타내고, 문자 인코딩을 UTF-8로 설정한다.
● HTTP 응답 헤더 설정
response.setHeader("Content-Disposition","attachment;filename=board.xls");
: HTTP 응답 헤더를 사용하여 브라우저에게 엑셀 파일을 다운로드하도록 지시한다. "Content-Disposition" 헤더의 값은 "attachment"로 설정되어 첨부 파일로 처리되며, "filename" 매개변수를 사용하여 다운로드될 파일의 이름을 "board.xls"로 지정한다. 파일 이름은 하고 싶은 것으로 정해주면 된다.
response.setHeader("Content-Description", "JSP Generated Data");
: HTTP 응답 헤더의 "Content-Description"를 설정하여 응답 데이터에 대한 설명을 추가한다. 이 경우 "JSP Generated Data"로 설정되어 있으며, 생성된 엑셀 파일에 대한 간단한 설명이다.
2. ExcelController.java
@Controller
public class ExcelController {
@Inject
public BoardService service;
@Inject
public SqlSessionTemplate sqlSession;
@RequestMapping("exceldown")
public String excelDownload (@RequestParam Map<String, Object> paramMap, Model model) {
System.out.println("paramMap :" + paramMap);
// 게시판 초기 데이터 설정
if(paramMap.isEmpty()) {
paramMap.put("pageNo", 1);
paramMap.put("listSize", 10);
}
// 게시글 목록 조회
List<Map<String, Object>> list = new ArrayList<Map<String, Object>>();
list = service.list(paramMap);
System.out.println("리스트 :" + list);
// 페이징
int count = service.pageMap(paramMap);
int curPage = Integer.parseInt(paramMap.get("pageNo").toString());
BoardPage pageVO = new BoardPage(count, curPage);
System.out.println("글개수 :" + count);
System.out.println("현재 페이지 :" + curPage);
System.out.println("pageVO :" + pageVO);
// 모델에 추가
model.addAttribute("list", list);
model.addAttribute("paramMap", paramMap);
model.addAttribute("pageVO", pageVO);
return "excel";
}
}
3. excel.jsp
<%@ page language="java" contentType="application/vnd.ms-excel;charset=UTF-8"
pageEncoding="UTF-8"%>
<%
response.setHeader("Content-Disposition","attachment;filename=board.xls"); //디폴트 파일명 지정
response.setHeader("Content-Description", "JSP Generated Data");
%>
<%@ taglib prefix="c" uri = "http://java.sun.com/jsp/jstl/core" %>
<%@ taglib prefix="fmt" uri = "http://java.sun.com/jsp/jstl/fmt" %>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
<script src="https://code.jquery.com/jquery-3.7.0.min.js"></script>
<script>
$(function(){
$("#searchType").val('${paramMap.searchType}');
$("#keyword").val('${paramMap.keyword}');
$("#searchBtn").click(function(){
//$("#searchFrm").attr("action","list").attr("method","post").submit();
$.ajax({
url : "searchList",
data : $("#searchFrm").serialize(),
type : "post",
success : function(search){
console.log(search);
$("#listFrm").html(search);
},
error: function(xhr, status, error) {
// 에러 시 처리
console.error('에러 발생:', status, error);
// xhr.status에는 HTTP 상태 코드가 포함되어 있음
console.log('HTTP 상태 코드:', xhr.status);
// xhr.responseText에는 서버로부터 받은 응답 데이터 또는 에러 메시지가 포함되어 있음
console.log('에러 응답:', xhr.responseText);
}
})
})
$("#delBtn").click(function(){
$("#listFrm").attr("action","delete").attr("method","post").submit();
})
$("#exceldown").click(function(){
$("#listFrm").attr("action","exceldown").attr("method","post").submit();
})
})
function list(num){
$("#pageNo").val(num);
$("#searchBtn").click();
}
</script>
</head>
<body>
<form name = "searchFrm" id = "searchFrm">
<input type = "hidden" name = "pageNo" id = "pageNo" value = "1">
<input type = "hidden" name = "listSize" id = "listSize" value = "10">
<div>
<select name = "searchType" id = "searchType">
<option value = "sel" >선택</option>
<option value = "name">작성자</option>
<option value = "subject">제목</option>
<option value = "content">제목+내용</option>
</select>
<input type = "text" name = "keyword" id = "keyword">
<input type = "button" name = "searchBtn" id = "searchBtn" value = "검색"><br>
<input type = "date" name = "stDate" id = "stDate"> ~ <input type = "date" name = "endDate" id = "endDate">
</div>
</form>
<div>
<input type = "button" name = "writeBtn" id = "writeBtn" value = "글쓰기" onclick = "location.href='write'">
<input type = "button" name = "delBtn" id = "delBtn" value = "삭제">
<input type = "button" name = "exceldown" id = "exceldown" value = "엑셀다운로드">
</div>
<form name = "listFrm" id = "listFrm">
<table border = "1">
<thead>
<tr>
<th><input type = "checkbox" name = "all"></th>
<th>글번호</th>
<th>작성자(ID)</th>
<th>제목</th>
<th>작성일</th>
<th>수정일</th>
<th>조회수</th>
</tr>
</thead>
<tbody id = "tableBody">
<c:forEach items="${list }" var = "boardList" varStatus="num">
<tr id = "trList">
<td><input type = "checkbox" name = "chk" value = "${boardList.seq }"></td>
<td>${boardList.seq }</td>
<td>${boardList.name }(${boardList.id })</td>
<td><a href = "detail?seq=${boardList.seq }">${boardList.subject }</a></td>
<td><fmt:formatDate value="${boardList.regDate }" pattern="yyyy-MM-dd"/> </td>
<td><fmt:formatDate value="${boardList.uptDate }" pattern="yyyy-MM-dd"/></td>
<td>${boardList.viewCnt }</td>
</tr>
</c:forEach>
<tr>
<td colspan="7">
<!-- **처음페이지로 이동 : 현재 페이지가 1보다 크면 [처음]하이퍼링크를 화면에 출력-->
<c:if test="${pageVO.curBlock > 1}">
<a href="javascript:list('1')">[처음]</a>
</c:if>
<!-- **이전페이지 블록으로 이동 : 현재 페이지 블럭이 1보다 크면 [이전]하이퍼링크를 화면에 출력 -->
<c:if test="${pageVO.curBlock > 1}">
<a href="javascript:list('${pageVO.prevPage}')">[이전]</a>
</c:if>
<!-- **하나의 블럭에서 반복문 수행 시작페이지부터 끝페이지까지 -->
<c:forEach var="num" begin="${pageVO.blockBegin}" end="${pageVO.blockEnd}">
<!-- **현재페이지이면 하이퍼링크 제거 -->
<c:choose>
<c:when test="${num == pageVO.curPage}">
<span style="color: red">${num}</span>
</c:when>
<c:otherwise>
<a href="javascript:list('${num}')">${num}</a>
</c:otherwise>
</c:choose>
</c:forEach>
<!-- **다음페이지 블록으로 이동 : 현재 페이지 블럭이 전체 페이지 블럭보다 작거나 같으면 [다음]하이퍼링크를 화면에 출력 -->
<c:if test="${pageVO.curBlock <= pageVO.totBlock}">
<a href="javascript:list('${pageVO.nextPage}')">[다음]</a>
</c:if>
<!-- **끝페이지로 이동 : 현재 페이지가 전체 페이지보다 작거나 같으면 [끝]하이퍼링크를 화면에 출력 -->
<c:if test="${pageVO.curPage <= pageVO.totPage}">
<a href="javascript:list('${pageVO.totPage}')">[끝]</a>
</c:if>
</td>
</tr>
</tbody>
</table>
</form>
</body>
</html>
결과
엑셀다운로드 버튼을 클릭하면 엑셀 파일이 다운로드된다. 엑셀다운로드 버튼이 있는 list.jsp 파일은 위에 올려둔 jsp 파일 내용과 동일하다.
'일경험' 카테고리의 다른 글
[국민취업지원제도 일경험프로그램 30일차] 넥사크로(NEXACRO) 학점 계산 프로그램 (0) | 2023.09.12 |
---|---|
[국민취업지원제도 일경험프로그램 29일차] 넥사크로(NEXACRO) (0) | 2023.09.11 |
[국민취업지원제도 일경험프로그램 27일차] 게시판 이미지 다운로드 기능 완료, 넥사크로(NEXACRO) 시작 (0) | 2023.09.07 |
[국민취업지원제도 일경험프로그램 26일차] 게시판 업로드 기능 완료, 게시판 첨부파일 다운로드 기능 구현 시작 (0) | 2023.09.06 |
[국민취업지원제도 일경험프로그램 25일차] 게시판 이미지 첨부 버튼, 이미지 픽셀 유효성 검사 (0) | 2023.09.05 |