쌍용교육(JAVA)/Spring

쌍용교육 -JSP수업 81일차 - ch08_SpringMVC(3)

구 승 2024. 6. 19. 16:19

ch09~ch10 내용넣기

ch10 끝

 

ch 11 시작

pom.xml 내용추가

<dependency>
		    <groupId>org.apache.poi</groupId>
		    <artifactId>poi</artifactId>
			<version>3.13</version> 
		</dependency>
		<!-- 라이브러리 추가 끝 -->

 

kr.spring.ch11.vo => PageRank

package kr.spring.ch11.vo;

public class PageRank {
	private int rank;
	private String page;
	
	
	public PageRank() {}//기본 생성자가 있는게 좋음 (get과 set을 사용하기 위해서는)
	
	public PageRank(int rank, String page) {
		this.rank = rank;
		this.page = page;
	}
	public int getRank() {
		return rank;
	}
	public void setRank(int rank) {
		this.rank = rank;
	}
	public String getPage() {
		return page;
	}
	public void setPage(String page) {
		this.page = page;
	}
	@Override
	public String toString() {
		return "PageRank [rank=" + rank + ", page=" + page + "]";
	}
	
}

kr.spring.ch11.controller => PageRanksController

package kr.spring.ch11.controller;

import java.util.ArrayList;
import java.util.List;

import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.servlet.ModelAndView;

import kr.spring.ch11.vo.PageRank;

@Controller
public class PageRanksController {
	@RequestMapping("/pageRanksExcel.do")
	public ModelAndView handle() {
		List<PageRank> pageRanks = new ArrayList<PageRank>();
		pageRanks.add(new PageRank(1,"/board/list.do"));
		pageRanks.add(new PageRank(2,"/member/login.do"));
		pageRanks.add(new PageRank(3,"/cart/list.do"));
								// 뷰 이름			속성명		  속성값
		return new ModelAndView("pageRanks","pageRanks",pageRanks);
	}
}

kr.spring.ch11.view => PageRanksView

package kr.spring.ch11.view;

import java.util.List;
import java.util.Map;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.apache.poi.hssf.usermodel.HSSFCell;
import org.apache.poi.hssf.usermodel.HSSFRow;
import org.apache.poi.hssf.usermodel.HSSFSheet;
import org.apache.poi.hssf.usermodel.HSSFWorkbook;
import org.apache.poi.ss.usermodel.Workbook;
import org.springframework.web.servlet.view.document.AbstractXlsView;

import kr.spring.ch11.vo.PageRank;

public class PageRanksView extends AbstractXlsView{ //AbstractXlsView는 엑셀처리 및 다운로드를 지원하는 스프링프레임워크이다.

	@Override
	protected void buildExcelDocument(Map<String, Object> model, Workbook workbook, HttpServletRequest request,
			HttpServletResponse response) throws Exception {
		//시트 생성								
		HSSFSheet sheet = createFirstSheet((HSSFWorkbook)workbook);//(HSSFWorkbook)workbook라고 쓴 이유는 다운캐스팅을 한것.
		
		//열이름 생성
		createColumnLabel(sheet);
		
		//시트에 데이터 표시하기
		List<PageRank> pageRanks = (List<PageRank>)model.get("pageRanks");
		
		int rowNum = 1; //행의 0번은 제목으로 사용했기 때문에 1부터 사용하고자 rowNum을 1로 만들어준다,
		for(PageRank rank : pageRanks) {
			createPageRankRow(sheet, rank, rowNum++); //rowNum ++로 지정하면서 다음 행의 값을 넣을 수 있다.
		}
		//파일명을 지정해주지않으면 파일명 이름이 URL링크로 인식하여 사용되기 때문에 변경이 필요하다
		//HTTP 응답 메시지 헤더 설정 (헤더에 파일명을 지정해야된다.)
		String fileName = "pageRanks2024.xls";
		//HTTP 응답 메시지 헤더 셋팅
				response.setHeader("Content-Disposition", 
						    "attachment;filename=\""+fileName+"\";");
				response.setHeader("Content-Transfer-Encoding", 
						                 "binary");
	}
	
	//시트를 생성하는 메서드
	private HSSFSheet createFirstSheet(HSSFWorkbook workbook) {
		HSSFSheet sheet = workbook.createSheet();
							//sheet index,이름
		workbook.setSheetName(0, "페이지 순위");
		
		//특정 컬럼에 넓이 지정
						  //column Index,width(넓이)
		sheet.setColumnWidth(1,256*20);
		
		
		
		return sheet;
	}
	//열이름 생성 
	private void createColumnLabel(HSSFSheet sheet) {
		HSSFRow firstRow = sheet.createRow(0); //첫번째 행을 만든다.
		HSSFCell cell = firstRow.createCell(0); //첫번 째 셀을 만든다.
		cell.setCellValue("순위");//첫번째 셀에 순위라고 값을 넣는다.
		
		cell = firstRow.createCell(1); //두번 째 셀을 만든다
		cell.setCellValue("페이지");//두번째 셀에 페이지라고 값을 넣는다.
		//첫번째 행(0)의 1번,2번 셀의 순위와 페이지라는 값을 넣어줌으로써 엑셀시트에 제목을 만들어준다.
	}
	//표시할 데이터 생성
	private void createPageRankRow(HSSFSheet sheet,PageRank rank, int rowNum) { //rowNum는 순서값을 표시하기위해
		HSSFRow row = sheet.createRow(rowNum); 
		HSSFCell cell = row.createCell(0);
		cell.setCellValue(rank.getRank()); //첫번 째 방에는 순위를 넣어준다. 
		
		cell = row.createCell(1);
		cell.setCellValue(rank.getPage());//두번 째 방에는 페이지를 넣어준다.
		//제목(순위,페이지) 아래에 값들을 넣어주는 역할을 한다. 
	}
}

servlet-context.xml 내용추가

<!-- 엑셀 다운로드 -->
	<beans:bean class="kr.spring.ch11.controller.PageRanksController"/> <!-- Controller는 원래 id를 필요로 하지않음 -->
	<beans:bean id="pageRanks" class="kr.spring.ch11.view.PageRanksView"/>

index.jsp 내용추가

<a href="${pageContext.request.contextPath}/pageRanksExcel.do">PageRanksController</a><br>

pom.xml

<dependency>
		    <groupId>com.fasterxml.jackson.core</groupId>
		    <artifactId>jackson-databind</artifactId>
		    <version>2.9.5</version>
		</dependency>
		<!-- 라이브러리 추가 끝 -->

PageRanksController 내용추가

//JSON 문자열 처리
	@RequestMapping("/pageJson.do")
	@ResponseBody   //view를 만들어주는 어노테이션이다. (Json 문자열을 반환할 떄는 list,map,자바빈을 사용하면 Json문자열을 반환해준다. 이 3개는 key와 value로 이뤄진 것들이다.)
	public List<PageRank> parseJson(){
		List<PageRank> pageRanks = new ArrayList<PageRank>();
		pageRanks.add(new PageRank(1,"/file.do"));
		pageRanks.add(new PageRank(2,"/pageRanksExcel.do"));
		pageRanks.add(new PageRank(3,"/pageJson.do"));
		
		return pageRanks; //리스트를 반환. (리스트로 반환하려면 어노테이션을 하나 써줘야된다. => @ResponseBody)

index.jsp 내용추가

<a href="${pageContext.request.contextPath}/pageJson.do">PageRanksController - pageJson.do</a><br>