Код Outcommented Facelets все еще вызывает выражения EL, такие как # {bean.action()} и вызывает javax.el.PropertyNotFoundException на # {bean.action}
У меня есть следующий фрагмент кода в моей Facelet:
<h:commandLink id="cmdbtn">
<f:ajax event="click" execute="@form"
listener="#{screenShotBean.takeScreenshot}" />
</h:commandLink>
Он отлично работает, но когда я его наружу,
<!-- <h:commandLink id="cmdbtn"> -->
<!-- <f:ajax event="click" execute="@form" -->
<!-- listener="#{screenShotBean.takeScreenshot}" /> -->
<!-- </h:commandLink> -->
то это вызывает следующее исключение:
javax.el.PropertyNotFoundException: Property 'takeScreenshot' not found on type monstage.test.com.ScreenShotBean
at javax.el.BeanELResolver$BeanProperties.get(BeanELResolver.java:237)
at javax.el.BeanELResolver$BeanProperties.access$400(BeanELResolver.java:214)
at javax.el.BeanELResolver.property(BeanELResolver.java:325)
at javax.el.BeanELResolver.getValue(BeanELResolver.java:85)
at com.sun.faces.el.DemuxCompositeELResolver._getValue(DemuxCompositeELResolver.java:176)
at com.sun.faces.el.DemuxCompositeELResolver.getValue(DemuxCompositeELResolver.java:203)
at org.apache.el.parser.AstValue.getValue(AstValue.java:169)
at org.apache.el.ValueExpressionImpl.getValue(ValueExpressionImpl.java:189)
at com.sun.faces.facelets.el.ELText$ELTextVariable.toString(ELText.java:217)
at com.sun.faces.facelets.el.ELText$ELTextComposite.toString(ELText.java:157)
at com.sun.faces.facelets.compiler.CommentInstruction.write(CommentInstruction.java:77)
at com.sun.faces.facelets.compiler.UIInstructions.encodeBegin(UIInstructions.java:82)
at com.sun.faces.facelets.compiler.UILeaf.encodeAll(UILeaf.java:183)
at javax.faces.render.Renderer.encodeChildren(Renderer.java:168)
at javax.faces.component.UIComponentBase.encodeChildren(UIComponentBase.java:845)
at javax.faces.component.UIComponent.encodeAll(UIComponent.java:1779)
at javax.faces.component.UIComponent.encodeAll(UIComponent.java:1782)
at com.sun.faces.application.view.FaceletViewHandlingStrategy.renderView(FaceletViewHandlingStrategy.java:424)
at com.sun.faces.application.view.MultiViewHandler.renderView(MultiViewHandler.java:125)
at com.sun.faces.lifecycle.RenderResponsePhase.execute(RenderResponsePhase.java:121)
at com.sun.faces.lifecycle.Phase.doPhase(Phase.java:101)
at com.sun.faces.lifecycle.LifecycleImpl.render(LifecycleImpl.java:139)
at javax.faces.webapp.FacesServlet.service(FacesServlet.java:594)
Когда я меняю выражение метода с круглыми скобками, как показано ниже,
<!-- <h:commandLink id="cmdbtn"> -->
<!-- <f:ajax event="click" execute="@form" -->
<!-- listener="#{screenShotBean.takeScreenshot()}" /> -->
<!-- </h:commandLink> -->
Затем не генерирует исключение, но оно все равно вызывается.
Как это вызвано и как я могу его решить?
Ответы
Ответ 1
Посмотрите ближе на трассировку стека. Здесь соответствующая часть:
...
org.apache.el.ValueExpressionImpl.getValue(ValueExpressionImpl.java:189)
com.sun.faces.facelets.el.ELText$ELTextVariable.toString(ELText.java:217)
com.sun.faces.facelets.el.ELText$ELTextComposite.toString(ELText.java:157)
com.sun.faces.facelets.compiler.CommentInstruction.write(CommentInstruction.java:77)
...
Таким образом, вычисляется EL в блоке комментариев (распознается CommentInstruction
). Блок комментариев рассматривается как текст шаблона. Facelets оценивает по умолчанию также EL #{}
в тексте шаблона. Это похоже на то, что вы пишете <p>#{screenShotBean.takeScreenshot}</p>
без какого-либо тега JSF.
У вас есть несколько вариантов:
-
Удалить блок комментариев вообще.
-
Выделите EL-выражения в комментарии, указав его с помощью \
, как в
\#{screenShotBean.takeScreenshot}
чтобы они не были оценены.
-
Оберните весь блок комментариев в <ui:remove>
, чтобы он не отображался в дереве компонентов (а также в сгенерированном HTML-выходе).
-
Отключить синтаксический анализ комментариев all от Facelets, добавив следующий параметр контекста в web.xml
:
<context-param>
<param-name>javax.faces.FACELETS_SKIP_COMMENTS</param-name>
<param-value>true</param-value>
</context-param>
Обратите внимание, что ни один комментарий в результате не будет создан в виде HTML-вывода таким образом.
Ответ 2
В дополнение к настройкам BalusC, уже предоставленным, вы также можете добавить атрибут rendered="false"
к commandLink
.
Если у вас есть несколько компонентов, которые вы хотите быстро переключаться, вам может потребоваться создать свойство отладки в bean или использовать этап проекта:
rendered="#{facesContext.application.projectStage == 'Development'}"
Ответ 3
Вы также можете использовать параметр контекста, который пропускает комментарии в вашем web.xml.
Это параметр:
javax.faces.FACELETS_SKIP_COMMENTS