2012-03-22 3 views
2

쿼리 문자열의 존재 여부 또는 쿼리 문자열의 부재를 기반으로 일부 컴포지션/템플릿을 동적으로 렌더링하려고합니다. 예를 들어 :조건부 렌더링 JSF h : 쿼리 문자열의 존재를 기반으로하는 panelGrid (또는 전혀 쿼리 문자열 없음)

는 로컬 호스트 : 9080/myWonderfulApp/test.xhtml foo는 =이 작동

이 A.xhtml가 당겨 도착 바

로컬 호스트 :. 9080/myWonderfulApp/test.xhtml

이 작동하지 않습니다. B.xhtml이 가져 오지 않습니다.

쿼리 문자열 부분이 없으면 문제가 있습니다. ? foo = bar를 전달하면 A.xhtml을 렌더링 할 수 있지만 쿼리 문자열이 없을 때 B.xhtml이 렌더링되지 않습니다. 나는 약간의 변이를 시도했다, 나는 처음에 # {param [ 'foo']! = 'bar'가 작동한다고 생각했지만, 나는 foo 쿼리 매개 변수가 전혀 없기 때문에 작동하지 않는다고 생각한다. param == null인지 확인하려고했지만 그 중 하나가 작동하지 않았습니다.

NO 쿼리 문자열을 기반으로 렌더링 된 속성을 설정할 수 있습니까?

B.xhtml에 대한 다른 쿼리 문자열을 설정할 수 없습니다. 두 가지 스킨을 가져 오는 레거시 앱에서 작업 중이므로 링크 된 모든 이전 앱을 추가로 설치할 수 없습니다. 새 앱은 검색어 문자열을 사용하며, 이전 앱은 검색어 문자열없이 연결되는 오래된 스킨을 가져와야합니다. #{param.foo != 'bar'} :

<h:panelGrid rendered="#{empty facesContext.externalContext.requestParameterMap.foo ? true : false}"> 

답변

1

그냥 역 조건이 필요합니다

<!--This works--> 
<h:panelGrid rendered="#{param['foo'] == 'bar' ? true : false}"> 
    <ui:composition template="A.xhtml">...</ui:composition> 
</h:panelGrid> 

<!--This doesn't work--> 
<h:panelGrid rendered="#{param == null ? true : false}"> 
    <ui:composition template="B.xhtml">...</ui:composition> 
</h:panelGrid> 

이 역시 작동하지 않습니다. 부울을 반환하는 조건부 연산자는 불필요하며, 방정식 자체가 이미 부울을 반환합니다. #{param}은 결코 null이 아닙니다. 매개 변수가없는 경우 Map<String, String>을 (아니 null!)으로 반환합니다. 중괄호 표기법은 매개 변수 이름에 중첩 속성으로 해석 될 기간이 포함되어 있지만 요청 매개 변수 이름에 마침표가 없어야하는 경우에만 유용합니다.

그래서,이 수행해야합니다

<h:panelGrid rendered="#{param.foo == 'bar'}"> 
    <ui:composition template="A.xhtml">...</ui:composition> 
</h:panelGrid> 

<h:panelGrid rendered="#{param.foo != 'bar'}"> 
    <ui:composition template="B.xhtml">...</ui:composition> 
</h:panelGrid> 

을 다른 대안으로, 당신은 조건 연산자 올바른 방법을 사용하려는 경우, 당신은 또한

<ui:composition template="#{param.foo == 'bar' ? 'A' : 'B'}.xhtml">...</ui:composition> 
+0

을하지 않는다 어느 쪽도 제대로 작동 할 수 있습니다. 귀하의 버전에서 B.xhtml은 쿼리 문자열없이 페이지에 액세스하면 A.xhtml이로드되지 않습니다. 내 템플릿에서 EL을 사용하는 것처럼 보이지 않습니다. 스택 오버플로가 발생하고 편집기 (RAD)가 충돌하며 다시 실행되지 않습니다. 다른 편집기에서 파일을 편집해야합니다 (템플릿의 EL을 제거하십시오). 그러면 RAD가 실행됩니다. JSF 1.2에서도 마찬가지입니다. –

+0

필자는 이것이 을 사용하는 아주 이상한 방법이라는 것을 인정해야하지만 기능 요구 사항과 기타 세부 사항을 알지 못하고이 구조를 사용한 적이 없기 때문에 이상한 사용법을 무시했습니다. 그러나 결국에는 ''또는 적어도 ''을 사용하여 다른 구성을 제거하지 않으시겠습니까? – BalusC

+0

BTW, 그것은 어제 시도했던 것뿐만 아니라 구성을 렌더링하지 않고도 작동합니다.
이 출력은 true와 false이고 올바르게 작동하지만, 템플릿을 렌더링하려고하면 그냥 작동하지 않습니다 .Ui : decorate도 해봤지만 중복 된 ID 오류가 발생했습니다. 두 템플릿을 모두 가져 오는 것 같았습니다. –