본문 바로가기

카테고리 없음

65일차 공부 Spring 연동 어제 이어서...

=> 어제까지 한 프로젝트

https://github.com/itggangpae/springmvc0708.git 

 

itggangpae/springmvc0708

Contribute to itggangpae/springmvc0708 development by creating an account on GitHub.

github.com

 

1. 자신의 데이터베이스를 사용하고자 하는 경우

=> root-context.xml 파일의 DataSource 수정

=> 위의 주석을 해제하면 Oracle이고 그대로 두면 MySQL

 

2. ItemDAO 클래스에서 하이버네이트 사용을 할려면 그대로 두고 MyBatis를 사용할려면 메소드 안의 주석을 해제하고 하이버네이트 호출 구문을 주석 처리

 

3. ItemServiceImpl 클래스에서 ItemDAO를 가지고 작업을 하면 xml 파일을 사용하는 MyBatis가 되고 ItemMapper를 이용하면 인터페이스를 이용하는 것이 된다.

 

 

 

** 프로젝트에서 MyBatis를 XML로 사용하는 형태로 변환 - 데이터베이스는 오라클

=> 우리나라 공공기관의 대기업 SI에서는 아직까지 Oracle에서 XML을 이용하는 MyBatis방식을 많이 사용하기 때문에

1. root-context.xml 파일에서 MySQL의 DataSource를 주석 처리하고 오라클의 DataSource를 주석해제

 

2. ItemDAO 클래스에서 하이버네이트 사용하는 부분을 주석처리 MyBatis 사용하는 부분으로 변경

 

package kr.co.pk.item.dao;

import java.util.List;

import org.apache.ibatis.session.SqlSession;
import org.hibernate.SessionFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Repository;

import kr.co.pk.item.domain.Item;

@Repository
public class ItemDAO {
	@Autowired
	//MyBatis를 xml로 이용할 때 사용하는 클래스
	private SqlSession sqlSession;
	
	@Autowired
	//Hibernate는 SessionFactory
	private SessionFactory sessionFactory;
	
	//Item 테이블의 전체 데이터를 가져오는 메소드
	public List<Item> allitem(){
		return sqlSession.selectList("item.allitem");
		//return sessionFactory.getCurrentSession().createCriteria(Item.class).list();
	}
	
	//Item 테이블에서 1개의 데이터를 가져오는메소드
	public Item detailitem(Integer itemid) {
		return sqlSession.selectOne("item.detailitem", itemid);
		//return sessionFactory.getCurrentSession().get(Item.class, itemid);
	}
}

 

3. ItemServiceImpl 클래스에서 MyBatis를 xml로 호출하는 형태로 변환

@Service
public class ItemServiceImpl implements ItemService {
	@Autowired
	private ItemDAO itemDao;
	
	//private ItemMapper itemDao;

 

** 다양한 VIew 출력

1. 파일 다운로드

=> 파일의 경로를 a 태그의 href에 설정하면 다운로드가 만들어진다.

=> 링크에 설정된 파일이 브라우저가 사용가능한 파일이면 다운로드가 되지 않고 브라우저가 사용한다. 텍스트 파일이나 이미지 파일의 경우는 브라우저가 출력

음악이나 동영상 파일은 재생

강제로 다운로드 할려면 파일 링크에서 마우스 오른쪽을 클릭해서 다른 이름으로 저장을 하면 된다.

=> 무조건 다운로드가 되도록 만들려면 별도의 View를 만들어서 출력을 해야 한다.

 

2. Spring ViewResolver

=> Spring Controller는 View에 의족적이지 않음 - Spring Controller는 View의 이름을 만들어주는 것이지 실제 보여지는 View를 결정하지 않는다.

=> 실제 View를 결정하는 것은 ViewResolver 가 한다.

 

1) ViewResolver 의 종류

InternalResourceViewResolver : 기본적으로 제공되는 ViewResolver로 JSTLView로 출력

=> BenaNameViewResolver : View의 이름을 가지고 직접 출력할 View를 지정

 

2) jsp 이외의 view를 출력하고자 하는 경우

=> BeanNameViewResolver 클래스의 bean을 생성해야 한다.

그리고 난 후

<bean id="출력할 뷰 이름" class="출력할 뷰 클래스 이름" /> 로 설정하면 된다.

 

3) jsp도 이용할 거라면 주의

=> InternalResourceViewResolver 에 order 프로퍼티를 추가해서 BeanNameViewResolver의 order 값보다 높게 설정을 해서 BeanNameViewResolver가 처리하지 못하면 InternalResourceViewResolver가 처리하도록 해주어야 한다.

 

3. 오늘 출력

FileDownload View, CSV, Excel, PDF, JSON, XML 출력

=> 공공기관 같은 곳에서 Open API 서버를 만드는 경우에는 모두 중요

=> Open API 서버가 아니라 자신의 App이나 기업을 위한 API를 만들 때는 JSON과 XML이 중요 

 

**File 클래스

=> java.io.File 클래스

=> 인스턴스 생성법, 디렉토리인 경우 내부 파일목록을 가져오는 방법, 파일의 존재여부 확인, 파일의 크기나 마지막 업데이트 된 날짜를 가져오는 API는 중요

=> 애플리케이션을 만들게 되면 애플리케이션 안에 파일을 저장해서 사용하는 경우가 많은데 없으면 생성하고 있는 경우에는 서버에서 업데이트 된 날짜와 비교해서 수정하는 작업들을 수행해야 한다.

 

**파일 다운로드 뷰 생성

=> AbstractView로 부터 상속받는 View 클래스를 생성

=> renderMergerdOutputModel 이라는 메소드를 오버라이딩해서 그 안에 파일명, 파일의 크기 등을 설정해야 한다.

=> 다운로드 요청이 왔을 때 생성한 View를 이용해서 출력하도록 설정

 

** Excel 출력

=> apache poi 라이브러리 이용

=> AbstractExcelView로 부터 상속받는 클래스를 만들어서 출력

=> WorkBook이 파일이고 파일안에 WorkSheet가 있고 WorkSheet 안에 Row가 있고 Row 안에 Cell이 존재 - 출력은 Cell을 생성해서 하면 된다.

=> Excel은 2003 이전에는 확장자가 xls였고 2003부터는 xlsx인데 2개의 포맷이 다름

생성을 할 때 개념은 같은데 클래스 이름의 앞글자가 다름, 하나는 H 로 시작하고 X로 시작

=> 엑셀로 보여주는 요청이 파일 이름이 된다.

확장자를 xls 나 xlsx 로 만드는 것이 좋다.

 

** PDF 출력

=> iText API를 이용해서 출력

=> 거의 모든 프로그래밍 언어에서 사용이 가능

=> AbstractPdfView 클래스를 상속받는 클래스를 만들어서 출력

=> 기본적으로 한글 출력 안됨

한글 폰트를 별도로 설치

 

** REST(REpresentational State Transfer)

=> 하나의 URI는 하나의 서비스를 대표하도록 설계

=> 서버에 접근하는 기기의 종류에 상관없이 동일한 URI로 처리하도록 설계

=> 이전에는 서버가 데이터를 가지고 뷰를 만들어서 클라이언트에 전송을 하는 구조였는데 서버는 데이터를 전송해서 클라이언트가 자신의 특성에 맞게 데이터를 골라서 출력할 수 있도록 설계

=> 최근에는 Server에서 Client에게 데이터를 넘길 때 JSON 형식을 가장 많이 사용

XML과 JSON을 표준 포맷으로 보는데 XML은 인간이 보기에는 쉽지만 사이즈가 크고 JSON은 인간이 보기에는 어렵지만 사이즈가 작고 클라이언트 언어들이 해석을 쉽게 한다.

 

** Spring에서 json 출력

1 .jsp 파일에서 JSONArray나 JSONObject를 출력

 

2. 출력할 뷰를 JacksonView를 이용해서 출력

 

3. Controller에서 ResponseBody를 이용해서 출력

 

4. Controller를 만들어서 String을 리턴하면 csv가 만들어지고 그 외 개겣 타입이나 List를 리턴하면 JSON으로 생성해서 출력

 

=> 데이터를 리턴할 때는 Object(Map 같은 객체)를 리턴

Array나 List를 리턴하는 것은 좋지 않다.

 

[10, 20, 30, 40, 50] 최악 이름이 없기 때문에

{data:[10, 20, 30, 40, 50]}

 

 

 

** 프로젝트 내의 img 디렉토리의 파일 다운로드 링크 만들기

1. home.jsp 파일에 파일 다운로드 링크 만들기

		<ul>
			<li>
				<a href="fileview" class="menu">파일목록</a>
			</li>
		</ul>
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>

<!-- jsp를 이용해서 데이터를 출력할 때는 이 코드는 거의 필수 -->
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>    
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>ITEM</title>
<link rel="stylesheet" 
	href="${pageContext.request.contextPath}/css/home.css">
</head>
<body>
	<div align="center" class="body">
		<h2>상품 목록</h2>
		<table border="1">
			<tr class="header">
				<th width="80">상품 ID</th>
				<th width="300">상품 이름</th>
				<th width="100">상품 가격</th>
			</tr>
			<c:forEach var="item" items="${list}">
				<tr class="record">
					<td width="80">${item.itemid}</td>					
					<td width="300">
						<a href="detail/${item.itemid}">${item.itemname}</a>
					<td width="100" align="right">
					${item.price}원</td>
				</tr>				
			</c:forEach>	
		</table>
		<ul>
			<li>
				<a href="fileview" class="menu">파일목록</a>
			</li>
		</ul>
	</div>
</body>
</html>

 

 

2. home.css 파일에 스타일 추가

div.body {
	overflow-y: auto;
	margin-top: 50px;
	margin-bottom: 50px;
}

tr.header {
	background: #c9bfed;
}

tr.record {
	background: #ededed;
}

.menu {
	display: block;
	width: 10em;
	margin: 3px 5px;
	padding: .5em 1em;
	text-decoration: none;
	text-align: center;
	color: #fff;
	background-color: rgb(190, 190, 190);
	border: 2px solid rgb(175, 175, 175);
	border-radius: 6px;
	text-shadow: #666 .1em .1em .1em;
	box-shadow: 0 5px 3px rgba(0, 0, 0, .5);
	position: relative;
	-webkit-transition: background-color 0.2s, border-color 0.2s, top .2s,
		box-shadow 0.2s;
	-moz-transition: background-color 0.2s, border-color 0.2s, top .2s,
		box-shadow 0.2s;
	-o-transition: background-color 0.2s, border-color 0.2s, top .2s,
		box-shadow 0.2s;
	-ms-transition: background-color 0.2s, border-color 0.2s, top .2s,
		box-shadow 0.2s;
	transition: background-color 0.2s, border-color 0.2s, top .2s,
		box-shadow 0.2s;
}

ul {
	list-style-type: none;
	margin: 0;
	padding: 0;
}

li {
	margin-bottom: 3em;
}
/* a 태그에 포커스가 오거나 마우스가 올라오면 적용
: 다음에 나오는 것은 가상 선택자, 가상 클래스 */
a:hover, a:focus {
	background-color: #fdca00;
	border-color: #fda700;
}

a:active {
	top: 3px;
	box-shadow: 0 1px 2px rgba(0, 0, 0, .5);
}

 

 

3. ItemService 인터페이스에 img 디렉토리의 파일목록을 보여주는 메소드를 선언

	//img 디렉토리의 파일이름 목록을 가져오기 위한 메소드
	public void fileview(HttpServletRequest request, HttpServletResponse response);
package kr.co.pk.item.service;

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

//서비스의 메소드는 매개변수를 다양하게 만들 수 있습니다.
//모든 곳에서 사용가능하도록 만들고자 하면 
//HttpServletRequest 와 HttpServletResponse를 갖도록 하면 되고 
//상황에 따라 다르게 만들 수 도 있습니다.
public interface ItemService {
	//전체 데이터를 가져오는 메소드
	public void allitem(HttpServletRequest request, HttpServletResponse response);
	
	//상세보기를 위한 메소드
	public void detailitem(HttpServletRequest request, HttpServletResponse response);
	
	//img 디렉토리의 파일이름 목록을 가져오기 위한 메소드
	public void fileview(HttpServletRequest request, HttpServletResponse response);
}

 

 

4. ItemServiceImpl 클래스에 파일 목록을 보여주는 메소드를 구현

	@Override
	public void fileview(HttpServletRequest request, HttpServletResponse response) {
		//프로젝트 내의 디렉토리에 대한 절대 경로 가져오기
		String imgPath=request.getServletContext().getRealPath("/img");
		//디렉토리 안의 모든 파일에 대한 이름을 가져오기 - File 클래스 이용
		File f = new File(imgPath);
		String [] fileList = f.list();
		
		//파일이름을 List에 저장하고 List를 Request에 저장
		List<String> list = new ArrayList<String>();
		for(String imsi : fileList) {
			list.add(imsi);
		}
		request.setAttribute("list", list);
	}
package kr.co.pk.item.service;

import java.io.File;
import java.util.ArrayList;
import java.util.List;

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

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import kr.co.pk.item.dao.ItemDAO;
import kr.co.pk.item.domain.Item;

@Service
public class ItemServiceImpl implements ItemService {
	@Autowired
	private ItemDAO itemDao;
	
	//private ItemMapper itemDao;

	@Override
	@Transactional
	public void allitem(HttpServletRequest request, HttpServletResponse response) {
		//1.파라미터 읽기
		
		//2.필요한 처리 수행
		
		//3.DAO 메소드의 매개변수 생성
		
		//4.DAO 메소드를 호출
		List<Item> list = itemDao.allitem();
		//5.결과를 가공
		
		//6.결과를 저장 - REST API Server의 경우는 request에 저장
		request.setAttribute("list", list);
		
	}

	@Override
	@Transactional
	public void detailitem(HttpServletRequest request, HttpServletResponse response) {
		//요청 주소의 마지막 부분을 가져오기
		//localhost/detail/itemid
		String requestURI = request.getRequestURI();
		String [] ar = requestURI.split("/");
		String itemid = ar[ar.length-1];
		
		//DAO의 메소드를 호출
		Item item = itemDao.detailitem(Integer.parseInt(itemid));
		//결과를 저장
		request.setAttribute("item", item);
	}

	@Override
	public void fileview(HttpServletRequest request, HttpServletResponse response) {
		//프로젝트 내의 디렉토리에 대한 절대 경로 가져오기
		String imgPath=request.getServletContext().getRealPath("/img");
		//디렉토리 안의 모든 파일에 대한 이름을 가져오기 - File 클래스 이용
		File f = new File(imgPath);
		String [] fileList = f.list();
		
		//파일이름을 List에 저장하고 List를 Request에 저장
		List<String> list = new ArrayList<String>();
		for(String imsi : fileList) {
			list.add(imsi);
		}
		request.setAttribute("list", list);
	}
	
}

 

5. HomeCotroller 클래스에 클라이언트의 요청이 오면 ServiceImpl 메소드를 호출하는 메소드를 작성

=> fileview를 GET방식으로 요청하면 ItemServiceImpl 클래스의 fileview()를 호출

package kr.co.pk;

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

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;

import kr.co.pk.item.service.ItemService;

@Controller
public class HomeController {
	@Autowired
	private ItemService itemService;	
	
	@RequestMapping(value="fileview", method=RequestMethod.GET)
	public String fileview(HttpServletRequest request, HttpServletResponse response) {itemService.fileview(request, response);
	return "fileview";
	}	
}

 

 

6. views 디렉토리에 fileview.jsp 파일을 만들고

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!-- if 나 forEach를 사용하기 위한 태그 라이브러릴 설정-->
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>    
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
	<div align="center" class="body">
		<h2>파일 목록</h2>
		<table border="1">
			<c:forEach var="item" items="${list}">
				<tr>
					<td><a href="${pageContext.request.contextPath}/img/${item}">${item}</a></td>
				</tr>
			</c:forEach>			
		</table>
	</div>
</body>
</html>

 

 

7. 디렉토리에 있는 파일이 이미지 파일이라서 다운로드 되지 않고 보라우저에 출력이 되어 버린다.

=> 파일들이 텍스트를 제외한 문서파일이나 이미지 또는 사운드 및 비디오 파일이 아니라면 여기까지만 구현해도 다운로드 가능하다.

 

** 모든 파일이 다운로드 가능하도록 수정

1. fileview.jsp 파일에서 링크를 수정

					<!-- <td><a href="${pageContext.request.contextPath}/img/${item}">${item}</a></td> -->
					<!-- download 라는 요청에 filename이라는 파라미터로 파일 이름을 념겨주도록 요청을 생성 -->
					<td><a href="download?filename=${item}">${item}</a></td>

 

2. HomeController 클래스에 download 요청을 처리할 메소드를 생성

package kr.co.pk;

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

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;

import kr.co.pk.item.service.ItemService;

@Controller
public class HomeController {
	@Autowired
	private ItemService itemService;	
	
	@RequestMapping(value="fileview", method=RequestMethod.GET)
	public String fileview(HttpServletRequest request, HttpServletResponse response) {itemService.fileview(request, response);
		return "fileview";
	}
	
	@RequestMapping(value="download", method=RequestMethod.GET)
	public String download(HttpServletRequest request, HttpServletResponse response) {itemService.fileview(request, response);
		//파라미터 읽기
		String filename = request.getParameter("filename");
		//데이터를 저장
		request.setAttribute("filename", filename);
		return "download";
	}	
}

 

3. 다운로드를 처리할 View 클래스 생성 : kr.co.pk.DownloadView

=> Controller에서 리턴하는 데이터를 읽어서 다운로드 받을 파일의 절대경로로 설정하는 부분만 수정해서 사용

import java.util.Map;

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

import org.springframework.util.FileCopyUtils;
import org.springframework.web.servlet.view.AbstractView;

public class DownloadView extends AbstractView {
	//생성자
	public DownloadView() {
		//형식을 설정
		setContentType(
			"application/download; charset=utf-8");
	}
	
	//출력할 뷰를 그리는 메소드
	//model 은 Controller에서 전달한 데이터
	//request는 클라이언트의 요청 정보를 저장
	//response는 클라이언트에게 응답할 정보를 저장
	@Override
	protected void renderMergedOutputModel(
			Map<String, Object> model, 
			HttpServletRequest request,
			HttpServletResponse response) throws Exception {
		//파일의 절대 경로 만들기
		//절대 경로는 운영체제에 따라 디렉토리 표현 방법이 다릅니다.
		//windows는 \\ 그 이외 운영체제는 /
		//상대경로는 무조건 /
		String filename = (String)model.get("filename");
		String filePath = 
			request.getServletContext().getRealPath("/img")
			+ "/" + filename;
		File file = new File(filePath);
		
		//파일의 형식과 크기를 설정
		response.setContentType(getContentType());
		response.setContentLength((int)file.length());
		
		//브라우저 종류를 판단
		//파일명에 한글이 있을 때 인코딩 방식때문에 판단
		String userAgent = request.getHeader("User-Agent");
		//IE에서 접속하면 userAgent에 rv라는 문자열이 포함되어 있음
		boolean ie = userAgent.indexOf("rv") > -1;
		
		//파일이름 설정
		String fileName = null;
		if(ie) {
			fileName = URLEncoder.encode(
				file.getName(), "utf-8");
		}else {
			fileName = new String(
					file.getName().getBytes("utf-8"),
					"iso-8859-1");
		}
		response.setHeader("Content-Disposition",
				"attachment; filename=\"" + 
				fileName + "\";");
		
		//파일 다운로드 받는 로직
		response.setHeader("Content-Transfer-Encoding",
				"binary");
		OutputStream out = response.getOutputStream();
		FileInputStream fis = null;
		try {
			fis = new FileInputStream(file);
			FileCopyUtils.copy(fis,  out);
		}finally {
			if(fis != null) {
				try {
					fis.close();
				}catch(Exception e) {}
			}
		}
		out.flush();
	}
}

 

 

4. servlet-context.xml 파일의 ViewResolver 수정

=> jsp가 아닌 출력이 있으면 이 설정은 추가를 해 주어야 한다.

기존 ViewResolver의 order를 1로 설정하고 BeanNameViewResolver 빈을 추가하고 order를 0으로 설정

 

1) 기존 Viewresolver의 order를 추가

	<beans:bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
		<beans:property name="prefix" value="/WEB-INF/views/" />
		<beans:property name="suffix" value=".jsp" />
		<beans:property name="order" value="1"/>
	</beans:bean>

 

 

2) 새로운 ViewResolver 추가

	<!-- BeanNameViewResolver 설정 -->
	<beans:bean class="org.springframework.web.servlet.view.BeanNameViewResolver">
		<beans:property name="order" value="0"/>
	</beans:bean>
	<beans:bean id="download" class="kr.co.pk.view.DownloadView" />

 

 

3) Controller에서 download뷰를 리턴하면 추가한 View클래스로 출력하도록 설정을 추가

<beans:bean id="Controller에서 리턴한 문자열" class="새로 생성한 뷰 클래스 경로" />

	<!-- download 출력 설정 -->
	<beans:bean id="download" class="kr.co.pk.view.DownloadView" />
<?xml version="1.0" encoding="UTF-8"?>
<beans:beans xmlns="http://www.springframework.org/schema/mvc"
	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xmlns:beans="http://www.springframework.org/schema/beans"
	xmlns:context="http://www.springframework.org/schema/context"
	xsi:schemaLocation="http://www.springframework.org/schema/mvc https://www.springframework.org/schema/mvc/spring-mvc.xsd
		http://www.springframework.org/schema/beans https://www.springframework.org/schema/beans/spring-beans.xsd
		http://www.springframework.org/schema/context https://www.springframework.org/schema/context/spring-context.xsd">

	<!-- Controller가 처리하지 못하는 URL은 WAS가 처리하도록 하는 설정 -->
	<default-servlet-handler/>
	
	<!-- Spring MVC Profect에서 사용하는 50여 가지의 어노테이션을 사용할 수 있도록 해주는 설정 -->
	<annotation-driven />

	<!-- Handles HTTP GET requests for /resources/** by efficiently serving up static resources in the ${webappRoot}/resources directory -->
	<resources mapping="/resources/**" location="/resources/" />

	<!-- Controller가 리턴한 뷰 이름을 가지고 실제 출력할 뷰를 설정하는 뷰 리졸버, jstlview(jsp)로 출력 -->
	<beans:bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
		<beans:property name="prefix" value="/WEB-INF/views/" />
		<beans:property name="suffix" value=".jsp" />
		<beans:property name="order" value="1"/>
	</beans:bean>
	
	<context:component-scan base-package="kr.co.pk" />
	
	<!-- BeanNameViewResolver 설정 -->
	<beans:bean class="org.springframework.web.servlet.view.BeanNameViewResolver">
		<beans:property name="order" value="0"/>
	</beans:bean>
	
	<!-- download 출력 설정 -->
	<beans:bean id="download" class="kr.co.pk.view.DownloadView" />
	
</beans:beans>

 

 

** Excel 출력

1. excel 출력을 위한 의존성 설정 - apache poi

		<!-- Excel 출력을 위한 의존성 설정 -->
		<dependency>
			<groupId>org.apache.poi</groupId>
			<artifactId>poi</artifactId>
			<version>3.16</version>	
		</dependency>

 

2. home.jsp 파일에 엑셀 출력을 위한 요청을 생성

 

			<li>
				<a href="item.xls" class="menu">엑셀출력</a>
			</li>
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>

<!-- jsp를 이용해서 데이터를 출력할 때는 이 코드는 거의 필수 -->
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>    
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>ITEM</title>
<link rel="stylesheet" href="${pageContext.request.contextPath}/css/home.css">
</head>
<body>
	<div align="center" class="body">
		<h2>상품 목록</h2>
		<table border="1">
			<tr class="header">
				<th width="80">상품 ID</th>
				<th width="300">상품 이름</th>
				<th width="100">상품 가격</th>
			</tr>
			<c:forEach var="item" items="${list}">
				<tr class="record">
					<td width="80">${item.itemid}</td>					
					<td width="300">
						<a href="detail/${item.itemid}">${item.itemname}</a>
					<td width="100" align="right">
					${item.price}원</td>
				</tr>				
			</c:forEach>	
		</table>
		<ul>
			<li>
				<a href="fileview" class="menu">파일목록</a>
			</li>
			<li>
				<a href="item.xls" class="menu">엑셀출력</a>
			</li>
		</ul>
	</div>
</body>
</html>

 

3) HomeController 클래스에 item.xls 요청을 처리하는 메소드를 생성해서 작성

// 엑셀로 출력하는 요청을 처리하는 메소드
	@RequestMapping(value = "item.xls", method = RequestMethod.GET)
	public String excel(
			HttpServletRequest request, 
			HttpServletResponse response, 
			Model model) {
		//ITEM 테이블의 데이터를 전부 읽어오는 서비스를 호출
		itemService.allitem(request, response);
		//Model에 데이터 저장
		model.addAttribute("list", request.getAttribute("list"));
		//출력할 뷰를 결정
		return "excel";
	}

 

 

4) Excel로 출력할 수 있는 View클래스를 생성

=> AbstractXlsView로부터 상속받는 클래스 : kr.co.pk.view.ExcelView

package kr.co.pk.view;

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

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

import org.apache.poi.ss.usermodel.Cell;
import org.apache.poi.ss.usermodel.Row;
import org.apache.poi.ss.usermodel.Sheet;
import org.apache.poi.ss.usermodel.Workbook;
import org.springframework.web.servlet.view.document.AbstractXlsView;

import kr.co.pk.item.domain.Item;

public class ExcelView extends AbstractXlsView {

	//workbook은 출력할 엑셀 파일
	@Override
	protected void buildExcelDocument(
			Map<String, Object> model, 
			Workbook workbook, 
			HttpServletRequest request,
			HttpServletResponse response) throws Exception {
		//출력할 데이터 가져오기
		List<Item> list = (List<Item>)model.get("list");
		//시트를 생성
		Sheet sheet = workbook.createSheet("ITEM");
		
		//열 너비 설정
		sheet.setColumnWidth(1, 256*20);
		sheet.setColumnWidth(2, 256*40);
		sheet.setColumnWidth(3, 256*20);
		
		//제목 셀 생성
		
		//0번 행 생성
		Row firstRow = sheet.createRow(0);
		
		//셀 생성
		Cell cell = firstRow.createCell(0);
		cell.setCellValue("상품명");
		
		cell = firstRow.createCell(1);
		cell.setCellValue("상품 설명");
		
		cell = firstRow.createCell(2);
		cell.setCellValue("가격");
		
		//데이터 출력
		
		//행번호를 저장할 변수
		int rowNum = 1;
		for(Item item : list) {
			//행을 생성
			Row row = sheet.createRow(rowNum++);
			//셀을 생성해서 출력
			Cell c = row.createCell(0);
			c.setCellValue(item.getItemname());
			
			c = row.createCell(1);
			c.setCellValue(item.getDescription());
			
			c = row.createCell(2);
			c.setCellValue(item.getPrice() + "원");
			
		}
		
	}

}

 

 

 

5) servlet-context.xml 파일에 Controller에서 리턴한 뷰 이름과 Excel View를 연결해주는 코드를 작성

	<!-- Excel 출력-->
	<beans:bean id="excel" class="kr.co.pk.view.ExcelView"/>

 

 

** PDF 출력

1. 프로젝트 안에 한글을 출력할 수 있는 폰트를 복사

=> webapp/font/malgun.ttf

 

2. pom.xml 파일에 iText API 라이브러리의 의존성 설정

		<!-- PDF 출력을 위한 의존성 -->	
		<dependency>
			<groupId>com.lowagie</groupId>
			<artifactId>itext</artifactId>
			<version>2.1.7</version>
		</dependency>

3. home.jsp 파일에 pdf 요청을 위한 링크를 생성

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

<!-- jsp를 이용해서 데이터를 출력할 때는 이 코드는 거의 필수 -->
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>    
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>ITEM</title>
<link rel="stylesheet" href="${pageContext.request.contextPath}/css/home.css">
</head>
<body>
	<div align="center" class="body">
		<h2>상품 목록</h2>
		<table border="1">
			<tr class="header">
				<th width="80">상품 ID</th>
				<th width="300">상품 이름</th>
				<th width="100">상품 가격</th>
			</tr>
			<c:forEach var="item" items="${list}">
				<tr class="record">
					<td width="80">${item.itemid}</td>					
					<td width="300">
						<a href="detail/${item.itemid}">${item.itemname}</a>
					<td width="100" align="right">
					${item.price}원</td>
				</tr>				
			</c:forEach>	
		</table>
		<ul>
			<li>
				<a href="fileview" class="menu">파일목록</a>
			</li>
			<li>
				<a href="item.xls" class="menu">엑셀 출력</a>
			</li>
			<li>
				<a href="item.pdf" class="menu">PDF 출력</a>
			</li>
		</ul>
	</div>
</body>
</html>

 

4. HomeController 클래스에 item.pdf 요청을 처리하는 메소드를 생성

//파일 다운로드 뷰를 출력하는 요청
		@RequestMapping(value="item.pdf", method=RequestMethod.GET)
		public String pdf(HttpServletRequest request, HttpServletResponse response, Model model) {
			//ITEM 테이블의 데이터를 전부 읽어오는 서비스를 호출
			itemService.allitem(request, response);
			//Model에 데이터 저장
			model.addAttribute("list", request.getAttribute("list"));
			//쳘력할 뷰를 결정
			return "pdf";
		}

 

 

 

 

5. PDF로 출력할 View클래스를 생성 - AbstractPdfView 클래스로부터 상속

=> rk.ck.pk.view.PdfView

package kr.co.pk.view;

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

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

import org.springframework.web.servlet.view.document.AbstractPdfView;

import com.lowagie.text.Cell;
import com.lowagie.text.Document;
import com.lowagie.text.Font;
import com.lowagie.text.Paragraph;
import com.lowagie.text.Table;
import com.lowagie.text.pdf.BaseFont;
import com.lowagie.text.pdf.PdfWriter;

import kr.co.pk.item.domain.Item;

public class PdfView extends AbstractPdfView {

	@Override
	protected void buildPdfDocument(Map<String, Object> model, Document document, PdfWriter writer,
			HttpServletRequest request, HttpServletResponse response) throws Exception {
		//데이터 가져오기
		List<Item> list = (List<Item>)model.get("list");
		
		//테이블 출력 - 앞의 숫자는 열의 수이고 뒤의 숫자는 행의 수
		Table table = new Table(3, list.size() +1);
		//패딩 설정
		table.setPadding(5);
		//폰트 생성
		BaseFont bfKorean= BaseFont.createFont(request.getServletContext().getRealPath("/fornt") + "/malgun.ttf", 
				BaseFont.IDENTITY_H, BaseFont.EMBEDDED);
		Font font = new Font(bfKorean);
		
		Cell cell = new Cell(new Paragraph("상품명"));
		cell.setHeader(true);
		table.addCell(cell);
		
		cell = new Cell(new Paragraph("상품 설명"));
		cell.setHeader(true);
		table.addCell(cell);
		
		cell = new Cell(new Paragraph("가격"));
		cell.setHeader(true);
		table.addCell(cell);
		
		table.endHeaders();
		
		//데이터 출력
		for(Item item : list) {
			Cell imsi = new Cell(new Paragraph(item.getItemname(), font));
			table.addCell(imsi);
			
			imsi = new Cell(new Paragraph(item.getDescription(), font));
			table.addCell(imsi);
			
			imsi = new Cell(new Paragraph(item.getPrice() + "원", font));
			table.addCell(imsi);
		}
		//테이블을 문서에 추가
		document.add(table);		
	}

}

 

6. servlet-context.xml 파일에 Controller에서 리턴한 뷰이름과 출력할 뷰 클래스를 매핑

 

	<!-- PDF 출력 -->
	<beans:bean id="excel" class="kr.co.pk.view.PdfView"/>

 

<?xml version="1.0" encoding="UTF-8"?>
<beans:beans xmlns="http://www.springframework.org/schema/mvc"
	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xmlns:beans="http://www.springframework.org/schema/beans"
	xmlns:context="http://www.springframework.org/schema/context"
	xsi:schemaLocation="http://www.springframework.org/schema/mvc https://www.springframework.org/schema/mvc/spring-mvc.xsd
		http://www.springframework.org/schema/beans https://www.springframework.org/schema/beans/spring-beans.xsd
		http://www.springframework.org/schema/context https://www.springframework.org/schema/context/spring-context.xsd">

	<!-- Controller가 처리하지 못하는 URL은 WAS가 처리하도록 하는 설정 -->
	<default-servlet-handler/>
	
	<!-- Spring MVC Profect에서 사용하는 50여 가지의 어노테이션을 사용할 수 있도록 해주는 설정 -->
	<annotation-driven />

	<!-- Handles HTTP GET requests for /resources/** by efficiently serving up static resources in the ${webappRoot}/resources directory -->
	<resources mapping="/resources/**" location="/resources/" />

	<!-- Controller가 리턴한 뷰 이름을 가지고 실제 출력할 뷰를 설정하는 뷰 리졸버, jstlview(jsp)로 출력 -->
	<beans:bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
		<beans:property name="prefix" value="/WEB-INF/views/" />
		<beans:property name="suffix" value=".jsp" />
		<beans:property name="order" value="1"/>
	</beans:bean>
	
	<context:component-scan base-package="kr.co.pk" />
	
	<!-- BeanNameViewResolver 설정 -->
	<beans:bean class="org.springframework.web.servlet.view.BeanNameViewResolver">
		<beans:property name="order" value="0"/>
	</beans:bean>
	
	<!-- download 출력 설정 -->
	<beans:bean id="download" class="kr.co.pk.view.DownloadView" />
	<!-- Excel 출력-->
	<beans:bean id="excel" class="kr.co.pk.view.ExcelView"/>
	
	<!-- PDF 출력 -->
	<beans:bean id="excel" class="kr.co.pk.view.PdfView"/>
		
</beans:beans>

 

** JSON 출력 - View이용

1. pom.xml 파일에 jackson-databind 라이브러리의 의존성을 설정

		<!-- json 출력을 위한 의존성 -->
		<dependency>
			<groupId>com.fasterxml.jackson.core</groupId>
			<artifactId>jackson-databind</artifactId>
			<version>2.9.7</version>
		</dependency>

2. home.jsp 파일에 jspnm 요청을 위한 링크를 생성

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

<!-- jsp를 이용해서 데이터를 출력할 때는 이 코드는 거의 필수 -->
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>    
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>ITEM</title>
<link rel="stylesheet" 
	href="${pageContext.request.contextPath}/css/home.css">
</head>
<body>
	<div align="center" class="body">
		<h2>상품 목록</h2>
		<table border="1">
			<tr class="header">
				<th width="80">상품 ID</th>
				<th width="300">상품 이름</th>
				<th width="100">상품 가격</th>
			</tr>
			<c:forEach var="item" items="${list}">
				<tr class="record">
					<td width="80">${item.itemid}</td>
					<td width="300">
						<a href="detail/${item.itemid}">${item.itemname}</a>
					</td>
					<td width="100" align="right">
					${item.price}원</td>
				</tr>	
			
			</c:forEach>	
		</table>
		<ul>
			<li>
				<a href="fileview" class="menu">파일 목록 보기</a>
			</li>
			<li>
				<a href="item.xls" class="menu">엑셀 출력</a>
			</li>
			<li>
				<a href="item.pdf" class="menu">PDF 출력</a>
			</li>
			<li>
				<a href="item.json" class="menu">ITEM JSON 출력</a>
			</li>
		</ul>
	</div>
</body>
</html>

 

 

3. HomeController 클래스에 item.json 요청을 처리하는 메소드를 생성

// JSON을 출력하는 요청을 처리하는 메소드
		@RequestMapping(value = "item.json", method = RequestMethod.GET)
		public String json(
					HttpServletRequest request, 
					HttpServletResponse response, 
					Model model) {
			//ITEM 테이블의 데이터를 전부 읽어오는 서비스를 호출
			itemService.allitem(request, response);
			//Model에 데이터 저장
			model.addAttribute("list", request.getAttribute("list"));
			//출력할 뷰를 결정
			return "pdf";
		}

 

4. itemlist와 jsonview를 연결해주는 설정을 servlet-context.xml 파일에 추가

<?xml version="1.0" encoding="UTF-8"?>
<beans:beans xmlns="http://www.springframework.org/schema/mvc"
	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xmlns:beans="http://www.springframework.org/schema/beans"
	xmlns:context="http://www.springframework.org/schema/context"
	xsi:schemaLocation="http://www.springframework.org/schema/mvc https://www.springframework.org/schema/mvc/spring-mvc.xsd
		http://www.springframework.org/schema/beans https://www.springframework.org/schema/beans/spring-beans.xsd
		http://www.springframework.org/schema/context https://www.springframework.org/schema/context/spring-context.xsd">

	<!-- Controller가 처리하지 못하는 URL은 WAS가 처리하도록 하는 설정 -->
	<default-servlet-handler/>

	<annotation-driven />

	<!-- Handles HTTP GET requests for /resources/** by efficiently serving up static resources in the ${webappRoot}/resources directory -->
	<resources mapping="/resources/**" location="/resources/" />

	<!-- Controller가 리턴한 뷰 이름을 가지고 실제 출력할 뷰를 설정하는 뷰 리졸버
	jstlview(jsp)로 출력 -->
	<beans:bean 
	class="org.springframework.web.servlet.view.InternalResourceViewResolver">
		<beans:property name="prefix" value="/WEB-INF/views/" />
		<beans:property name="suffix" value=".jsp" />
		<beans:property name="order" value="1" />
	</beans:bean>
	
	<context:component-scan base-package="kr.co.pk" />
	
	<!-- BeanNameViewResolver 설정 -->
	<beans:bean 
		class="org.springframework.web.servlet.view.BeanNameViewResolver">
		<beans:property name="order" value="0" />	
	</beans:bean>
	
	<!-- download 출력 설정 -->
	<beans:bean id="download" class="kr.co.pk.view.DownloadView" />
	<!-- Excel 출력 -->
	<beans:bean id="excel" class="kr.co.pk.view.ExcelView" />
	<!-- PDF 출력 -->
	<beans:bean id="pdf" class="kr.co.pk.view.PdfView" />
	<!-- JSON 출력 -->
	<beans:bean id="pdf" class="org.springframework.web.servlet.view.json.MappingJackson2JsonView/>
</beans:beans>