Flash scope를 지원하는 프레임워크도 있는데 우리가 쓰는 프레임워크에서는 지원하지 않아 추가해봅니다.
(이미지출처)
Flash 범위란?
1. POST: 등록을 위해 post로 submit 한다.
2. Redirect: 조회페이지로 리다이렉트한다.
3. GET: 브라우저는 GET 방식으로 리다이렉트하는 페이지를 조회한다.
여기서 1.POST 와 3.GET은 서로 다른 요청이기에 이 요청사이의 연결은 이어지지 않습니다. 그런데 등록 후 조회페이지에서 "등록되었습니다."라는 메시지를 출력하고 싶은 경우가 있습니다. Java 웹 애플리케이션에서 기본적으로 제공하는 scope이나 장치를 쓰면.
1. 우선 page, request로는 메시지를 다음 요청으로 넘길 수 없습니다.
2. parameter로 메시지를 넘기는 방법:
긴 메시지가 URL에 나타나고 페이지 리로드(F5)하면 메시지가 또 출력됩니다.
사용자가 혼란스러워 합니다.
3. session scope를 이용하면:
session에 저장된 메시지를 매번 삭제해야 하고 혹 남아 있을 경우 오작동을 할 가능성이 있습니다.
session 사용은 restful한 서비스 작성에 좋지 않을 뿐더러 전역변수 같은 성격이 있어 좋지 않습니다.
4. application scope??:
이 놈은 전체가 공유하는 놈이라 쓸 수 없습니다. A 사용자의 메시지가 B 사용자에게도 보일 수 있습니다.
-.-;
Rails나 Grails 같은 프레임워크는 이러한 경우를 위해 바로 다음 요청까지만 유효한 flash scope를 지원합니다.
구현방법
POST
1-1. 먼저 Action 클래스같은 비즈니스 로직에서 등록 후 request scope에 "flash."로 시작하는 키값으로
메시지를 저장하고 조회페이지로 redirect 합니다.
1-2. 서블릿 필터에서는 "flash."로 시작하는 값이 있을 경우 이를 잠시 session에 넣어둡니다.
Redirect 후 GET
2-1. 서블릿 필터에서는 session에서 위 값을 꺼내고 해당 요청의 request scope에 값을
"flash." prefix는 제거하고 request scope에 저장합니다.
2-2. 그리고 이 session값은 지웁니다. (이 다음의 요청에서는 사용 못하도록)
2-3. 비즈니스 로직을 실행 후 JSP에서는 request scope에 저장된 메시지를 출력합니다.
예를 들어 등록 후 다음과 같이 메시지를 저장합니다.
서블릿 필터 소스는 아래와 같습니다.
이 소스는 특정 웹 프레임워크와 관계없이 작동합니다. 그대로 사용하거나 본인이 사용하는 프레임워크에 맞게 고쳐 사용할 수 있습니다.
우리의 응용
Flash.java
FlashScopeFilter.java
...
if (request instanceof HttpServletRequest) {
...
Flash.setRequest(httpRequest);
}
chain.doFilter(request, response);
if (request instanceof HttpServletRequest) {
...
Flash.clearRequest();
}
POST: 등록 후
GET: 다음 요청 JSP에서 메시지 출력은 동일합니다.
참고원문: http://blog.smartkey.co.uk/2011/01/implementing-flash-scope-in-java-web-applications/
'웹기술들' 카테고리의 다른 글
| jQuery의 이벤트 ajax 핸들러에서의 scope 문제 해결책 (8) | 2011/07/19 |
|---|---|
| Java 웹애플리케이션에서 Flash scope 구현 - 메시지 출력 문제 (0) | 2011/06/23 |
| Struts 태그에서 자동생성되는 TD 태그 없애기 (4) | 2010/03/22 |
| 스프링 프레임워크 3.0 GA 릴리즈 - 기능 요약 (0) | 2009/12/30 |
| Flex에서 ExternalInterface 사용시 동기화 문제 (1) | 2009/12/23 |
| Java로 엑셀 다운로그 구현하기 (0) | 2009/12/20 |



