[Spring3.0] Spring Web View, 파일 업로드, 파일 다운로드
by 무작정 개발2022.03.29(66일 차)
이번에는 Spring Web View와 Spring에서의 파일 업로드, 파일 다운로드에 대해 정리할 것이다.
오늘의 수업 내용
먼저 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;
}
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)));
}
}
}
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 클래스 생성
- 다운로드 처리 순서
- 브라우저에게 처리할 수 없는 콘텐츠라고 알려주고, 처리할 수 없으니 다운로드 실행
- 다운로드 처리할 때 필요한 정보 제공
- 파일 응답 스트림에 기록
- 파일 다운로드 실행
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();
}
}
'Back-End > Spring Legacy' 카테고리의 다른 글
[Spring3.0] MVC: Spring3.0 + MyBatis 게시판 (2) | 2022.03.29 |
---|---|
[Spring3.0] AOP (관점 지향 프로그래밍) (4) | 2022.03.28 |
[Spring 3.0] LomBok 으로 getter/setter 생성 (0) | 2022.03.28 |
[Spring 3.0] 스프링 3.0 + MyBatis 연동 (0) | 2022.03.27 |
[Spring 3.0] 스프링JDBC (0) | 2022.03.26 |
블로그의 정보
무작정 개발
무작정 개발