2013-01-09 2 views
5

웹 응용 프로그램을 JSF 2 웹 응용 프로그램을 개발하고 결과 값과 URL 값을 지정하는 페이지 간 암시 적 탐색을 사용하고 있습니다. 또한 모든 것을 제출할 필요없이 일부 페이지에서 변경 작업을 수행 할 수있는 Ajax 요청이 있습니다. 예를 들어, 내가 변경 사항을 사용자의 데이터를 편집하고 저장할 때,페이지 탐색 사이의 JSF 메시지 처리 방법 (POST-REDIRECT-GET)

내 문제는 온다. Managed Bean은 사용자 데이터를 저장하고 String을 반환하여 사용자 목록을 탐색합니다. 사용자가 제대로 저장되면 작업 방법이 완료되기 전에 FacesMessage이 추가됩니다. 방법

FacesContext.getCurrentInstance().addMessage(clientId, 
    new FacesMessage(FacesMessage.SEVERITY_INFO, msg, msg)); 

버튼

<p:commandButton value="#{msg.UPDATE}" action="#{manager.actionSave}" 
      ajax="false" /> 

코드 그러나, 심지어는 내 메인 페이지에 <h:messages /> 태그, 아무것도가 표시되지 않습니다 있습니다.

+2

메시지를 플래시 범위에서 직접 저장해야합니다. [이] (http://stackoverflow.com/a/10369601) – kolossus

+0

[다음 페이지에 FacesMessage 전달]의 중복 가능성 (http://stackoverflow.com/questions/12481506/passing-a-facesmessage-to 참조 -the-next-page) – Kowser

답변

9

문제 증상에 따라 결과에 faces-redirect=true 매개 변수 또는 <redirect/> 항목 (이전의 탐색 규칙을 사용하는 경우)에서 앞으로 (기본) 전달 대신 탐색하는 것이 좋습니다 faces-config.xml에 있습니다.

메시지가 요청 범위이며, 현재 요청에 의해 서비스 자원에 따라서 만 사용할 수 있습니다 얼굴. 리디렉션을 탐색 할 때 기본적으로 웹 브라우저에게 지정된 URL에 새로운 요청을 작성하도록 지시하고 있습니다. 얼굴 메시지는 해당 요청에서 전혀 사용할 수 없습니다.

리디렉션 정말 필수 인 경우, 예를 들어, — 인 POST-Redirect-GET 패턴을 달성하려면, 플래시 범위에 메시지를 저장해야합니다. Flash#setKeepMessages()으로 전화하여 true을 전달하면됩니다. 당신이 2.1.14보다 오래된 인 Mojarra 버전을 사용하고 있고 다른 기본 폴더에 리소스로 리디렉션하는 경우이 실패합니다

context.addMessage(clientId, message); 
context.getExternalContext().getFlash().setKeepMessages(true); 

참고. issue 2136도 참조하십시오.

+0

그게 옳은 방법입니다, 감사합니다 @BalusC. 그건 그렇고, 거기에 구성 파일이나 그런 식으로 그것을 할 수있는 방법은 무엇입니까? 기본적으로 내가 추가하는 모든 단일 메시지에 대해 메서드를 호출하지 못하도록합니다. –

+2

아무 것도 없습니다. 이를 위해 유틸리티 클래스를 사용하십시오. OmniFaces는 이것을위한 ['Messages'] (https://showcase-omnifaces.rhcloud.com/showcase/utils/Messages.xhtml) 클래스를 제공합니다. 예 : 'Messages.addFlashInfo (clientId, msg);' – BalusC

+0

시도해 보겠습니다. 탐색을 위해 PrettyFaces를 사용함에 따라 POST-Redirect-GET 패턴에 따라야한다는 점을 지적하고 싶었습니다. http://ocpsoft.org/support/prettyfaces-users/how-to-do-post-redirect-get-after-action-with-prettyfaces –