[해야할 일]
0. 라이브러리 등록하기
0. 라이브러리 등록하기
- txt 파일을 만들어 WEB-INF 안에 넣어두기
- InternalResourceViewResolvew Bean 등록하기
- ViewResolver Bean 등록하기
- Controller 생성
- Customview 생성
- Customview Bean 등록
(0) 라이브러리 등록하기
1
2
3
4
5
6
|
<!-- https://mvnrepository.com/artifact/org.apache.poi/poi -->
<dependency>
<groupId>org.apache.poi</groupId>
<artifactId>poi</artifactId>
<version>3.9</version>
</dependency>
| cs |
(1)txt 파일을 만들어 WEB-INF 안에 넣어두기
(2) InternalResourceViewResolvew Bean 등록하기
(3) ViewResolver Bean 등록하기
Servlet-context.xml에 등록해준다. 등록 시에는 충돌을 예방하기 위해 우선순위인 p:order을 지정해주는 것을 잊지말자.
1
2
3
4
5
6
7
8
9
|
<!-- Resolves views selected for rendering by @Controllers to .jsp resources in the /WEB-INF/views directory -->
<beans:bean class="org.springframework.web.servlet.view.InternalResourceViewResolver" p:order="2">
<beans:property name="prefix" value="/WEB-INF/views/" />
<beans:property name="suffix" value=".jsp" />
</beans:bean>
<!-- CustomView: BeannameViewResolver는 파일을 등록해놓으면 id로 찾아간다는 것. -->
<beans:bean id="viewResolver" class="org.springframework.web.servlet.view.BeanNameViewResolver"
p:order="1" />
|
(4) Controller 생성 [DownloadController.java]
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
|
package com.bitcampi.mvc0802;
import java.io.File;
import org.springframework.beans.BeansException;
import org.springframework.context.ApplicationContext;
import org.springframework.context.ApplicationContextAware;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.context.WebApplicationContext;
import org.springframework.web.servlet.ModelAndView;
@Controller
public class DownloadController implements ApplicationContextAware {
private WebApplicationContext context;
@RequestMapping("/file")
public ModelAndView download() throws Exception {
File downloadFile = getFile();
return new ModelAndView("download", "downloadFile", getFile());
//download이름의 뷰로 File(getFile())을 donwloadFile이름으로 전송한다.
//download이름은 bean에 등록한다.
}
private File getFile() {
String path = context.getServletContext().getRealPath("/WEB-INF/설명.txt");
return new File(path);
}
@Override
public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
this.context = (WebApplicationContext) applicationContext;
}
}
|
(5)Customview 생성 [DownloadView.java]
CustomeView를 java파일로 만들어야 한다.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
|
package com.bitcampi.mvc0802;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.OutputStream;
import java.net.URLEncoder;
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 {
@Override
protected void renderMergedOutputModel(Map<String, Object> model, HttpServletRequest request,
HttpServletResponse response) throws Exception {
File file = (File) model.get("downloadFile");
response.setContentType("application/download; charset=utf-8");
response.setContentLength((int) file.length()); // 파일의 길이 구하기
/* 파일의 이름 구하기(utf-8) */
// MSIE 여부 확인 후 파일이름(한글) 인코딩 처리
//브라우저의 속성: User-Agent
String userAgent = request.getHeader("User-Agent");
String fileName = "";
// 인터넷 익스플로어로 받을때 / 인터넷 익스프로러로 안받을 때
// MSIE가 userAgent에서 0번째 이상부터 시작할 때,
if (userAgent.indexOf("MSIE") > -1) {
// 파일의 이름을 가지고 온다.
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 + "\";");
// binary 코드로도 다운로드 될 수 있도록 설정.
response.setHeader("Content-Transfer-Encoding", "binary");
// response에서도 outputStream 객체 생성할 수 있도록 설정.
OutputStream out = response.getOutputStream();
FileInputStream fis = null;
fis = new FileInputStream(file);
FileCopyUtils.copy(fis, out);
fis.close();
out.flush();
out.close();
}
}
|
(6)Customview Bean 등록
Servlet-context.xml에 등록해준다. 다만, bean의 id는 Controller에서 return한 ModelAndView 객체의 첫번째 칸 이름과 같아야 한다.
1
2
|
<!-- txt 파일 넘기기 -->
<beans:bean id="download" class="com.bitcampi.mvc0802.DownloadView"/>
|
결과)
댓글 없음:
댓글 쓰기