2012-05-30 3 views
5

В файле aPage.xhtml, у меня есть следующие строки:JSF 2.0: Пустой оператор не работает с парами

<ui:include rendered="#{not empty param.target}" src="#{param.target}.html" /> 
<ui:include rendered="#{empty param.target}" src="About.html" /> 

С выше линией, я ожидал, что, когда я иду в http://localhost:8080/beta/aPage.xhtml, страница About.html будет включая param.target: null. Однако, GlassFish бросил мне следующее исключение:

java.io.FileNotFoundException: http://localhost:8080/beta/.html 

Так или иначе, param.target не считается null.

Кроме того, я стараюсь использовать == и != операторы следующим образом:

<ui:include rendered="#{param.target != null}" src="#{param.target}.html" /> 
<ui:include rendered="#{param.target == null}" src="About.html" /> 

Интересно, что на этот раз, на консоли GlassFish, я не видел ни одного исключения выброшен. Однако в браузере страница с ошибкой все еще появляется с исключением java.io.FileNotFoundException.

Я был бы очень признателен, если бы вы могли сказать мне, почему это произошло, и что я должен сделать, чтобы избежать этого.

UPDATE:

Благодаря подсказке от Joop Eggen, я, наконец, решить эту проблему с помощью следующих строк:

<ui:param name="noTarget" value="About.html" /> 
<ui:param name="hasTarget" value="#{param.target}.html" /> 
<ui:include src="#{empty param.target? noTarget : hasTarget}" /> 

наилучшими пожеланиями

+0

'param.target' кажется держать' -en' значение, что означает его не пусто, и именно поэтому вы refered на '-en.html' странице ... кажется, что проблема с значение, которое удерживается 'param.target' – Daniel

+0

@ Даниэль: oops, извините,' -en' не должно быть там. Я пропустил это, когда я упростил свой код для публикации здесь. –

ответ

4

src оценивается в обоих случаях, возможно, с испытанием на существование файла? У

<ui:include src="#{empty param.target? 'About' : param.target}.html" /> 
+2

Вы не можете использовать '+' для конкатенации строк в EL. Я исправил синтаксис. – BalusC

+0

@BalusC, скажите, почему мой предложенный solutio не работает в этом сценарии? потому что он всегда работает просто отлично для меня ... – Daniel

+2

@ Daniel: EL in 'src' из' 'оценивается во время времени просмотра, а не во время отображения времени просмотра. Он работает только в том случае, если 'src' указывает допустимый путь. – BalusC

3

ui:include не получил rendered атрибут .. . оберните его <h:panelGroup

like это

<h:panelGroup rendered="#{not empty param.target}"> 
    <ui:include src="#{param.target}.html" /> 
</h:panelGroup> 
<h:panelGroup rendered="#{empty param.target}" > 
    <ui:include src="About.html" /> 
</h:panelGroup> 

Редактировать

К сожалению, это будет работать только тогда, когда EL в ЦСИ точек действительный путь,

причиной

EL в ГКЗ <ui:include> оценивается во время зрения время сборки, а не во время просмотра изображения

+0

Несмотря на то, что NetBeans предположил, что 'ui: include' имеет атрибут' rendered', кажется, что вы можете быть правы. Тем не менее, я все еще сталкиваюсь с тем же исключением, используя ваше решение. –

+0

попытайтесь вывести param.target на своей странице ... что он вам показывает? '' вы видите что-нибудь между префиксом и суффиксом? – Daniel

+0

Я попытался заменить '' на '' в вашем предыдущем коде. Он напечатал правильное сообщение, когда 'param.target' имеет значение null, а не null. Я думаю, что Joop Eggen прав. Атрибут 'src' оценивался в обоих случаях. –

Смежные вопросы