무작정 개발.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 클래스 생성

java
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 생성

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

 

2. Class 파일로 화면 띄우기

 

CustomViewController 생성

  • 여기에 계속 소스 코드를 추가할 것이다.
java
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를 상속 받음
  • 값을 여러 개 넘기고 받는 것이 가능
java
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

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

 

2. CustomPdfView 클래스 생성

  • PDF 파일을 보여주기 위해 AbstractPdfView를 상속 받음
java
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에 소스 코드 작성

java
@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

html
<!-- 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에 소스 추가

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

 

3. CustomExcelView 클래스 생성

java
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

html
<!-- 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 에 소스 작성

html
<!-- 파일 업로드할 객체 생성 -->
<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에 소스 추가 작성

java
@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에 소스 코드 추가 작성

java
@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. 파일 다운로드 실행
java
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();
}
}
반응형
블로그의 프로필 사진

블로그의 정보

무작정 개발

무작정 개발

활동하기