2012-09-10 1 views
2

저는 PrettyFaces 및 PrimeFaces를 사용하는 응용 프로그램을 보유하고 있습니다. URL 패턴 /#{ location : navigationBean.location }/#{ year : navigationBean.year }을 사용하여 한 페이지에 액세스합니다.selectOneMenu의 PrettyFaces 탐색 변경

해당 페이지에서 가능한 위치 값을 포함하는 p:selectOneMenu이 있습니다. 이 메뉴를 변경하면 같은 해와 새 위치로 페이지를 새로 고치고 싶습니다.

AJAX를 사용하여 navigationBean에서 위치를 설정 한 다음 pretty:view (URL 매핑 ID 인 view) 인 p:commandButton을 눌러 테스트했습니다. 이 작동하지만 버튼을 제거 싶어요.

나는 다음을 시도했지만 슬프게도 메서드의 반환 문자열은 탐색을 수행하지 않습니다.

은 JSF :

<p:selectOneMenu value="#{navigationBean.location}"> 
    <p:ajax listener="#{navigationBean.navigate}"/> 
    <f:selectItems value="#{locationBean.locations}"/> 
</p:selectOneMenu> 

백업 콩 :

public String navigate(AjaxBehaviorEvent event) 
{ 
    return (location != null) ? "pretty:view" : null; 
} 

PrettyFaces의 설정 :

<url-mapping id="view"> 
    <pattern value="/#{ location : navigationBean.location }/#{ /\\d{4}/ year : navigationBean.year }/"/> 
    <view-id value="/view.xhtml"/> 
</url-mapping> 

답변

2

당신은 (아약스) 액션 리스너에서 탐색 결과를 반환 할 수 없습니다. <h:commandButton action>에서 사용 된 실제 액션 메서드에서만 반환 할 수 있습니다.

대신 NavigationHandler#handleNavigation()을 사용하십시오.

public void navigate() { 
    FacesContext context = FacesContext.getCurrentInstance(); 
    context.getApplication().getNavigationHandler() 
     .handleNavigation(context, null, (location != null) ? "pretty:view" : null); 
} 
+0

멋진 감사! 'ExternalContext # redirect()'레코드는 PrettyFaces에서 작동하지 않았습니다. 서투른 코드는 실수를 대신합니다 (예제를 단순화하는 자리를 놓친 것, 제 질문이 업데이트되었습니다). – siebz0r

+1

당신을 진심으로 환영합니다. 'ExternalContext # redirect()'는 JSF 뷰 ID 나 네비게이션 결과가 아닌 ** 실제 ** URL 만 사용합니다. PrettyFaces는 ID 또는 네비게이션 결과를 보지 않습니다. – BalusC

+0

많이 설명합니다. 업데이트 된 답변과 일치하도록 정당성을 이유로 답변을 수정했습니다. 다시 한번 감사드립니다. – siebz0r