무작정 개발.Vlog

[Spring3.0] Spring Web View, 파일 업로드, 파일 다운로드

by 무작정 개발
반응형
2022.03.29(66일 차)

 

이번에는 Spring Web View와 Spring에서의 파일 업로드, 파일 다운로드에 대해 정리할 것이다.

 

오늘 만들 페이지 : home.action
오늘 만들 페이지 : home.action

오늘의 수업 내용

 

먼저 Spring View에 대해 정리하겠다.

 

프로젝트 생성

 

프로젝트 생성
프로젝트 생성

next를 눌렀을 때 패키지는 -> com.exe.springwebview 

 

이 프로젝트에 View, 파일 업로드, 파일 다운로드를 할 것이다.


1. Custom View

 

1. 기존 방식 확인 (ModelAndView)

  • JSP 파일로 화면 띄우기

HomeComtroller 클래스 생성

package com.exe.springwebview;

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

@Controller
public class HomeController {
	
	
	@RequestMapping(value = "/", method = RequestMethod.GET)
	public String home() {
	
		return "home";
	}
	
}

 

simpleCustomView.jsp 생성

<body>

<h2>SimpleCustomView.jsp입니다.</h2>

</body>

 

2. Class 파일로 화면 띄우기

 

CustomViewController 생성

  • 여기에 계속 소스 코드를 추가할 것이다.
import java.io.InputStream;

import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.multipart.MultipartFile;
import org.springframework.web.multipart.MultipartHttpServletRequest;
import org.springframework.web.servlet.ModelAndView;

@Controller
public class CustomViewController {
	
	@RequestMapping(value = "/simpleCustomView.action")
	public ModelAndView custom() {
		
		ModelAndView mav = new ModelAndView();
		
		//mav.setViewName("simpleCustomView"); //jsp파일로 보냄
		
		//이제는 위의 방법말고 Class로 데이터를 넘길 것이다.
		mav.setView(new SimpleCustomView());
		mav.addObject("message","SimpleCustomView Class 입니다.");
		
		return mav;
	}

 

SimpleCustomView 클래스 생성

  • 클래스로 View를 만드는 방법
  • 클래스는 view기능이 없어서 AbstractView를 상속 받음
  • 값을 여러 개 넘기고 받는 것이 가능
package com.exe.springwebview;

import java.io.PrintWriter;
import java.util.Map;

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

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

//클래스는 view기능이 없어 AbstractView를 상속받음
// - 클래스로 View를 만드는 방법
public class SimpleCustomView extends AbstractView {

	@Override
	protected void renderMergedOutputModel(Map<String, Object> model, 
			HttpServletRequest request,
			HttpServletResponse response) throws Exception {
		
		response.setContentType("text/html;charset=UTF-8");
		
		PrintWriter out = response.getWriter();
		
		out.print("<html>");
		out.print("<head>");
		out.print("</head>");
		out.print("<body>");
		out.print("<h2>");
		out.print(model.get("message"));
		out.print("</h2>");
		out.print("</body>");
		out.print("</html>");
		
	}

}

 

실행 화면
실행 화면

맨 위에 있는 home.action 페이지에서 1번을 클릭 시 나오는 화면이다.

 


 

2. PDF View

 

PDF로 파일을 보여주는 View이다.

 

1. Maven을 사용하여 필요한 lib(라이브러리) 다운

pom.xml

		<!-- itext(PDF) -->
		<dependency>
    		<groupId>com.lowagie</groupId>
    		<artifactId>itext</artifactId>
    		<version>2.1.7</version>
		</dependency>

 

2. CustomPdfView 클래스 생성

  • PDF 파일을 보여주기 위해 AbstractPdfView를 상속 받음
package com.exe.springwebview;

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.Chapter;
import com.lowagie.text.Document;
import com.lowagie.text.Paragraph;
import com.lowagie.text.pdf.PdfWriter;

//pdf 파일을 보여주는 view로 만들기위해 extends 
public class CustomPdfView extends AbstractPdfView {

	@Override
	protected void buildPdfDocument(Map<String, Object> model, 
			Document document, PdfWriter writer,
			HttpServletRequest request, 
			HttpServletResponse response) throws Exception {
		
		
		Chapter chapter = new Chapter(new Paragraph("Spring Message"),1);
		chapter.add(new Paragraph((String)model.get("message"))); //
		
		document.add(chapter);
		
	}

}

 

3. HomeControll에 소스 코드 작성

@RequestMapping(value = "pdfView.action")
	public ModelAndView getPdfView() {
		
		ModelAndView mav = new ModelAndView();
		
		mav.setView(new CustomPdfView());
		mav.addObject("message","PDF FILE");
		
		return mav;
	}

 

home.action에서 2번 클릭시 나오는 실행 화면
home.action에서 2번 클릭시 나오는 실행 화면

 


 

 

3. Excel View

 

Excel 파일을 보여주는 View이다.

 

1. Maven으로 필요한 lib(라이브러리) 설치

  • POI : ms의 오피스를 사용할 수 있는 라이브러리
  • JXL : 엑셀을 사용할 수 있는 라이브러리

pom.xml

		<!-- poi(MS-OFFICE) -->
		<dependency>
    		<groupId>org.apache.poi</groupId>
    		<artifactId>poi</artifactId>
    		<version>3.17</version>
		</dependency>
		
		<!-- jxl(Excel) -->
		<dependency>
    		<groupId>net.sourceforge.jexcelapi</groupId>
    		<artifactId>jxl</artifactId>
    		<version>2.6.12</version>
		</dependency>

 

2. HomeController에 소스 추가

@RequestMapping(value = "excelView.action")
	public ModelAndView getExcelView() {
		
		ModelAndView mav = new ModelAndView();
		
		mav.setView(new CustomExcelView());
		
		return mav;
	}

 

3. CustomExcelView 클래스 생성

package com.exe.springwebview;

import java.util.Map;

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

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

import jxl.write.Label;
import jxl.write.WritableSheet;
import jxl.write.WritableWorkbook;

public class CustomExcelView extends AbstractJExcelView{

	@Override
	protected void buildExcelDocument(Map<String, Object> model, 
										WritableWorkbook workbook, 
										HttpServletRequest request,
										HttpServletResponse response) throws Exception {
		
		response.addHeader("Content-Disposition", "attachment;fileName=sales.xls");
		
		WritableSheet sheet =  //한장이 sheet	
				workbook.createSheet("판매보고서", 0);//("sheet"name,index) 
		
		sheet.addCell(new Label(0,0,"년도"));
		sheet.addCell(new Label(1,0,"판매량"));
		
		for(int i=2001;i<2015;i++) {
			
			sheet.addCell(new Label(0,i-2000,String.format("%d", i)));
			
			sheet.addCell(new Label(1,i-2000,String.format("%d", i+100000)));
		}
							
	}
	
}

 

3번 클릭시 엑셀 다운로드
3번 클릭시 엑셀 다운로드
다운로드 파일 클릭 시 나오는 엑셀
다운로드 파일 클릭 시 나오는 엑셀

 


 

4. 파일 업로드

파일 업로드
파일 업로드

 

1.  Maven으로 필요한 lib(라이브러리) 설치

  • FileUpload 라이브러리
  • IO 라이브러리

pom.xml

		<!-- commons-io -->
		<dependency>
    		<groupId>commons-io</groupId>
    		<artifactId>commons-io</artifactId>
    		<version>2.11.0</version>
		</dependency>
		
		<!-- commons-fileupload -->
		<dependency>
    		<groupId>commons-fileupload</groupId>
    		<artifactId>commons-fileupload</artifactId>
    		<version>1.4</version>
		</dependency>

 

2. servlet-contextl.xml 에 소스 작성

	<!-- 파일 업로드할 객체 생성 -->
	<beans:bean id="multipartResolver"
	class="org.springframework.web.multipart.commons.CommonsMultipartResolver">
		<beans:property name="maxUploadSize" value="10240000"/>
		<beans:property name="maxInMemorySize" value="1024000"/>
		<beans:property name="defaultEncoding" value="UTF-8"/>
	</beans:bean>

 

3. CustomViewController에 소스 추가 작성

@RequestMapping(value = "upload.action", 
			method = {RequestMethod.POST, RequestMethod.GET})
	public String upload(MultipartHttpServletRequest request, String str)
		throws Exception {
		
		String path = request.getSession()
				.getServletContext().getRealPath("/WEB-INF/files"); // 다운 위치 지정
		
		
		//하나의 파일을 업로드 다운로드 할때는 클라이언트가 직접 서버에게 다가갈수 없게 이미 경로를 만들어놔서 상관 없지만
		// 늘 상시적으로 웹페이지에 떠있는 이미지파일인 경우는 매번 클라이언트가 서버에게 요청을 해야하기 때문에
		//클라이언트가 직접적으로 접근 가능한 폴더에 이미지폴더를 만든다.
		//WEB-INF는 외부에서 접근을 못한다.(접근 금지 영역)
		//그래서 이미지를 보기 위해서 webapp 폴더 아래 폴더(image)를 만들거나
		//resources 폴더에 만들어야 접근 가능하다.(ex 이미지게시판)
		
		//getServletContext().getRealPath("/resources/image"); -> resources 안에 image폴더 만들었을 때
		//getServletContext().getRealPath("/image"); -> webapp에 image폴더 만들었을 때 경로
		
		//image폴더를 만든 경우 servlet-context.xml에서
		//<resources mapping="/**" location="/"> 이렇게 수정해줘야 함 - webapp안에 image폴더 만들었을 때
		//<resources mapping="/resources/**" location="/resources/"> -이건 resources 안에 image폴더 만들었을 때
		
		//파일 넘길 때는
		//String path = cp + "/resources/image로 경로 넘김
		
		MultipartFile file = request.getFile("upload"); //home.jsp의 input name인 upload를 적어줌
		
		if(file!=null && file.getSize()>0) {
			
			//파일 업로드는 try-catch로 묶어줘야 함
			try {
				//업로드 할 위치
				FileOutputStream fos = 
						new FileOutputStream(path + "/" + file.getOriginalFilename());
				//파일 읽기
				InputStream is = file.getInputStream();
				
				int data;
				byte[] buffer = new byte[4096];
				
				while((data=is.read(buffer, 0, buffer.length))!=-1) {
					
					fos.write(buffer,0,data);
				} //end while문
				
				is.close();
				fos.close();
				
			} catch (Exception e) {
				System.out.println(e.toString());
			}//end catch
			
			
		} // end If문
		
		return "uploadResult";
		
	} // end upload()

 

파일 업로드 시 화면
파일 업로드 시 화면
업로드한 파일 생성
업로드한 파일 생성

 


5. 파일 다운로드

 

1. CustomViewController에 소스 코드 추가 작성

@RequestMapping(value = "download.action")
	public ModelAndView download() {
		
		ModelAndView mav = new ModelAndView();
		
		mav.setView(new DownloadView());
		
		return mav;
	}

} // end Class

 

2. DownloadView 클래스 생성

 

- 다운로드 처리 순서

  1. 브라우저에게 처리할 수 없는 콘텐츠라고 알려주고, 처리할 수 없으니 다운로드 실행
  2. 다운로드 처리할 때 필요한 정보 제공
  3. 파일 응답 스트림에 기록
  4. 파일 다운로드 실행
package com.exe.springwebview;

import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.FileInputStream;
import java.util.Map;

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

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

//파일 다운로드
public class DownloadView extends AbstractView {

	@Override
	protected void renderMergedOutputModel(Map<String, Object> model, 
			HttpServletRequest request,
			HttpServletResponse response) throws Exception {
		
		response.setContentType("application/octet-stream");
		//response.setContentType("application/unknown"); 이렇게 써도 된다.
		
		response.addHeader("Content-Disposition", 
				"attachment;fileName=\"AOP.txt\"");
		
		String path = request.getSession()
				.getServletContext().getRealPath("/WEB-INF/files/AOP.txt");
		
		//이제 읽어낸다 (서버가 읽어낸다)
		BufferedInputStream bis = 
				new BufferedInputStream(new FileInputStream(path));//서버가 path에 있는 것을 읽어내고
		
		BufferedOutputStream bos =  //읽어낸 것을 내보낸다.
				new BufferedOutputStream(response.getOutputStream());
		
		//내보내는 위치
		int data;
		
		while((data=bis.read())!=-1) {
			
			bos.write(data);
		}
		
		bis.close();
		bos.close();
		
	}

}
반응형

블로그의 정보

무작정 개발

무작정 개발

활동하기