'Spring'에 해당되는 글 1건

  1. 2010.12.23 뷰 컨트롤러에서 ModelAndView 개체를 직접 생성하기 (1)
Spring Framework 또는 Tiles를 사용해 뷰 컨트롤러를 구현할 때, 서블릿의 request handler는 ModelAndView 개체를 리턴한다. 단순 메시지 박스를 출력 또는 첨부파일 다운로드 구현에 대한 레퍼런스를 검색해보면 국내외를 막론하고 복잡하거나 거추장스러운 방법으로 구현되어 있어 가장 적은 코딩으로 구현하는 방법을 소개한다.
 
아래의 코드로 메서드를 구현한 다음 서블릿에서 호출하면 된다. 작성된 코드는 혐오스럽고 섬뜩하며 불필요한 리다이렉션이나 팝업을 생성하지 않는다.

 
파일 다운로드 구현:
String sv_name = request.getParameter("ServerFilename");
String dw_name = request.getParameter("DownFilename");
 
View view = new AbstractView() {
	@Override
	protected void renderMergedOutputModel(Map model, HttpServletRequest request, HttpServletResponse response) throws Exception
	{
		response.setContentType("application/octet-stream");
		response.setHeader("Content-Transfer-Encoding", "binary");
		response.setHeader("Content-Disposition", "attachment;fileName=\"" + dw_name + "\";");
		OutputStream outs = response.getOutputStream();
		File file = new File(sv_name);
		response.setContentLength((int)file.length());
		FileInputStream ins = new FileInputStream(file);
 
		try
		{
			/* copy stream data */
		}
		catch (java.io.IOException e)
		{
			response.setContentLength(0);
			System.out.println("File not found.");
			e.printStackTrace();
		}
		outs.flush();
	}
};
  
ModelAndView mv = new ModelAndView(view);

페이지 생성:
// 메시지박스를 출력하고 스크립트를 실행하는 ModelAndView 객체를 리턴한다.
public static ModelAndView getMessageView(final String msg, final String script) {
	View view = new AbstractView() {
		@Override
		protected void renderMergedOutputModel(Map model, HttpServletRequest request, HttpServletResponse response) throws Exception {
			response.setContentType("text/html; charset=EUC-KR");
			response.setCharacterEncoding("EUC-KR");
			ServletOutputStream outs = response.getOutputStream();
			outs.println("");
			outs.flush();
		}
	};

	return new ModelAndView(view);
}

*스크랩이나 복사는 자유롭게 하세요. 하지만, 일부를 수정하더라도 '복사 + 붙여넣기'를 하여 포스팅했다면 적어도 출처는 링크해 주어야지요! 공개된 내용이라면 아주 조그맣게 출처만 명기하세요. 어려운 일이 아닐 뿐 더러 매너있어 보입니다.