반응형
플래시의 콘셉트는 Ruby on Rails 웹 프레임워크에서 차용되었으며, 플래시 스코프 변수를 사용하여 faces 라이프사이클에서 생성된 사용자 뷰 간에 임시 객체를 전달할 수 있다.

임시 객체라고 한 이유는 플래시 스코프가 세션 스코프보다 짧게 유지되기 때문인데, 세션 스코프는 수동으로 값을 제거해야 하는 반면에 플래시 스코프는 두 번째 뷰가 완료되면 자동으로 값을 지운다.
즉 JSF 플래시 범위에 저장된 변수는 단 한 번의 리디렉션만 살아남아 다음 뷰에 노출된 다음 삭제된다고 보면 된다.

 

 

◆ 플래시(Flash) 사용법


FacesContext.getCurrentInstance()에 있는 ExternalContext에서 getFlash()를 호출하여 플래시에 액세스 하면 Map<String,Object> 객체를 반환해 주는데 통상의 Java Map과 같이 put으로 값을 세팅하고 get으로 값을 취득한다.

또한 EL 표현식을 사용하여 플래시 변수의 값에 액세스 할수도 있다.

 

 

플래시(Flash) 사용 예시


1. 플래시 변수에 값 저장 후 test02.xhtml로 리디렉션.

import javax.faces.context.FacesContext;
import javax.faces.context.Flash;

@Named
@RequestScoped
public class Test01 implements Serializable {
	public String test() {
            SendParamDto sendParamDto = new SendParamDto();
            sendParamDto.setNm("홍길동");
            sendParamDto.setAge(20);

            FacesContext fc = FacesContext.getCurrentInstance();
            Flash flash = fc.getExternalContext().getFlash();
            flash.put("test01Flash", sendParamDto); //플래시 변수에 전달할 값 저장

            return "/test/test02.xhtml?faces-redirect=true
	}
}

 

2. test02.xhtml의 <f:viewAction>으로 뷰 렌더링 전 Test02 클래스의 init() 메서드를 호출.

<f:metadata>
	<f:viewAction action="#{test02.init}" phase="APPLY_REQUEST_VALUES" />
</f:metadata>

 

3. Test02클래스의 init() 메서드에서 Flash 값을 취득한 후, test02.xhtml 뷰가 렌더링되고 화면이 표시됨.

@Named
@RequestScoped
public class Test02 implements Serializable {
    public void init() {
    try {
        FacesContext fc = FacesContext.getCurrentInstance();
        Flash flash = fc.getExternalContext().getFlash();
        if (!flash.isEmpty()) {
            SendParamDto dto = (SendParamDto) flash.get("test01Flash"); //플래시 변수에 저장한 값 취득
            String name = dto.getNm();
            int age = dto.getAge();
        } else {
        	throw new SystemException();
        }
    } catch (Exception e) {
    	throw new SystemException();
    }
}

 

4. 이후 페이지에서 다시 자바 메소드를 호출할 때는, 플래시 스코프는 이미 비워져 있기 때문에 값을 읽어올 수 없다.

 

EL 표현식을 사용하여 플래시 변수의 값에 액세스 하는 경우는 아래와 같이 사용하면 된다.

<h:form>
	<h:outputText value="#{flash['test01Flash'].nm}" />
	<h:outputText value="#{flash['test01Flash'].age}" />
	<h:commandButton value="저장" action="#{test02.save}" />
</h:form>

 

 

참조
JSF 2 Flash Scope Example
https://javabeat.net/jsf-2-flash-scope/

Adding flash scope variables (JSF 2.0)
https://www.ibm.com/docs/en/radfws/9.7?topic=pages-adding-flash-scope-variables-jsf-20

 


글 내용 중 잘못된 부분이 있거나, 첨부하실 내용이 있으시면 댓글로 남겨주세요. 공부하는데 많은 도움이 됩니다.
-- 기억의 유효기간은 생각보다 짧다. --
반응형