ModelAndView를 이용해서 간단한 javascript alert 사용하려고 할때 복잡한듯한데
간편하게 처리한 내용이 있어서 긁어왔다.
출처 : http://wizebee.blog.me/118774626
Spring Framework 또는 Tiles를 사용해 뷰 컨트롤러를 구현할 때, 서블릿의 request handler는 ModelAndView 개체를 리턴한다. 단순 메시지 박스를 출력 또는 첨부파일 다운로드 구현에 대한 레퍼런스를 검색해보면 국내외를 막론하고 복잡하거나 거추장스러운 방법으로 구현되어 있어 가장 적은 코딩으로 구현하는 방법을 소개한다.
아래의 코드로 메서드를 구현한 다음 서블릿에서 호출하면 된다. 작성된 코드는 혐오스럽고 섬뜩하며 불필요한 리다이렉션이나 팝업을 생성하지 않는다.
*spec: 스프링 프레임웤 3.0이던가?? 타일즈 버전이라... 흠. 암튼, 2010년 12월에 작성된 코드임.
파일 다운로드 구현:
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("<html><script type='text/javascript'>");
outs.println("alert(\"" + new String(msg.getBytes(), "ISO_8859_1") + "\");");
outs.println(new String(script.getBytes(), "ISO_8859_1"));
outs.println("</script></html>");
outs.flush();
}
};
return new ModelAndView(view);
}
위 코드는 간혹 개발/운영 환경이 다를경우 한글이 이상하게 나올 수 있다.
개선된 코드는 아래와 같다.
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=UTF-8");
response.setCharacterEncoding("UTF-8");
PrintWriter outs = response.getWriter();
outs.println("<html>");
outs.println("<head>");
outs.println("<meta http-equiv=\"Content-Type\" content=\"text/html; charset=UTF-8\">");
outs.println("<script type='text/javascript'>");
outs.println("스크립트내용");
outs.println("</script>");
outs.println("</head>");
outs.println("</body>");
outs.println("</html>");
outs.flush();
}
};
return new ModelAndView(view);
}