아직 JSF2에서 PRG 패턴의 최종 구현을 찾지 못했습니다.
BalusC 블로그는 a very good solution이지만, 저자 자신이 말한 것처럼, 그러한 해결책은 JSF2에는 적용되지 않습니다.
The solutions based on Flash scope 유효성 검사 오류가 발생하지 않으면 제대로 작동하지만 유효성 검사 오류가 발생하면 수명주기가 NavigationHandler를 호출하지 않기 때문에 REDIRECT가 실행되지 않습니다. 페이지가 브라우저에 의해 캐싱되지 않는다고 가정하면 (HTTP 응답에 올바른 헤더 설정), 유효성 검사 오류가 발생하고 사용자가 "다시로드"브라우저 버튼을 클릭하면 POST가 실행되고 GET은 실행되지 않습니다.
JSF2를 사용하여 유효성 검사 오류가 발생하더라도 강력한 PRG 패턴을 구현하는 가장 좋은 방법은 무엇입니까?JSF2 PRG 및 유효성 검사 오류
3
A
답변
0
나는 똑같은 도전에 직면 해있다. 100 % 만족스러운 해결책을 찾지 못했습니다. 그러나 this approach from BalusC을보십시오. 브라우저 캐시 제어없이 브라우저 뒤로 버튼을 누르면이 솔루션은 값을 보존하지 않습니다.
<h:form>
<h:inputText id="somefield" required="true" value="#{formbean.someProperty}"/>
<h:message for="somefield" />
<h:commandButton value="POST with redirect and ajax" action="third?faces-redirect=true">
<f:ajax execute="@form" render="@form" />
</h:commandButton>
</h:form>
페이지를로드하고 입력란을 비워두고 양식을 게시하고 (-> 오류 메시지가 나타나면) 데이터를 입력하고 다시 게시 한 다음 뒤로 버튼을 누릅니다. 그러면 양식이 다시 표시되고 오류 메시지가 사라졌지만 입력 필드 값도 사라졌습니다.
어떻게 든 formbeans 값 (세션 범위, 플래시, view-params ... 사용)을 유지한다고 가정하면 뒤로 버튼을 누를 때 페이지를 다시로드 (GET 요청) 할 수있는 브라우저 캐시를 비활성화 할 수 있습니다. 나는 다음과 같은 코드를 페이지 당 이런 짓을 :
JSF 페이지 :
<f:view>
<f:event type="preRenderView" listener="#{formbean.doNotCache}"/>
</f:view>
콩 :이 솔루션은 실제 사이트를 보유하고있는 경우
public void doNotCache(ComponentSystemEvent event) {
// Using Omnifaces to simplify code
Faces.getResponse().setHeader("Pragma", "no-cache");
Faces.getResponse().setHeader("Cache-Control", "no-cache");
Faces.getResponse().addHeader("Cache-Control", "must-revalidate");
Faces.getResponse().addHeader("Cache-Control", "no-store");
}
내가 볼 수 있습니다. 제 의견으로는 Post-Redirect-Get-Pattern의 결과적인 사용을 제공하는 검증 시스템을위한 구성 옵션이어야합니다. 잘못된 형식을 리디렉션해야합니다 (전달하지 않음). (아마도 사소한 작업이 아닙니다. 예를 들어 잘못된 필드를 다루거나 다시 표시하는 howto와 같은)? 아마 틀렸어. 비슷한 옵션이없는 것 같아.