Условно визуализировать JSF h:panelGrid на основе наличия строки запроса (или отсутствия строки запроса вообще)

Я пытаюсь динамически визуализировать некоторые композиции / шаблоны на основе наличия строки запроса или отсутствия строки запроса. Например:

локальный:9080/myWonderfulApp/test.xhtml Foo= бар

Это работает, A.xhtml втягивается.

локальный:9080/myWonderfulApp/test.xhtml

Это не работает, B.xhtml не втягивается.

У меня проблемы с отсутствием части строки запроса. Я могу отобразить A.xhtml, когда передам? Foo= bar, но я не могу воспроизвести B.xhtml, когда у меня нет строки запроса. Я пробовал некоторые варианты, я изначально полагал, что #{param['foo']!= 'Bar' будет работать, но я думаю, что это не работает, потому что у меня вообще нет параметра запроса foo. Я пытался проверить, если param == null, но это тоже не сработало.

Можно ли установить мой отображаемый атрибут на основе НЕТ строки запроса?

Я не могу просто установить другую строку запроса для B.xhtml, так как я работаю над устаревшим приложением, которое получает 2 разных обложки, поэтому модернизация всех старых приложений, которые ссылаются, не вариант. Новые приложения будут использовать строку запроса, старые должны получить ссылку на старый скин без строки запроса.

<!--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>

Кажется, это тоже не работает:

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

1 ответ

Вам просто нужно обратное условие: #{param.foo != 'bar'}, Эти условные операторы, возвращающие логические значения, не нужны, само уравнение возвращает логическое значение уже. #{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>
Другие вопросы по тегам