8

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

その後、例外はスローされませんが、それでも呼び出されます。

これはどのように発生し、どうすれば解決できますか?

4

3 に答える 3

20

スタックトレースをよく見てください。関連する部分は次のとおりです。

...
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タグなしで書いているようなものです。

いくつかのオプションがあります。

  1. コメントブロックを完全に削除します。

  2. コメントのEL式を、次の\ようにプレフィックスを付けてエスケープします。

    \#{screenShotBean.takeScreenshot}
    

    それらが評価されないように。

  3. コメントブロック全体をラップして<ui:remove>、コンポーネントツリー(または生成されたHTML出力)に表示されないようにします。

  4. 次のコンテキストパラメータを次のように追加して、Faceletsによるすべてのコメントの解析を無効にしますweb.xml

    <context-param>
        <param-name>javax.faces.FACELETS_SKIP_COMMENTS</param-name>
        <param-value>true</param-value>
    </context-param>
    

    この方法で生成されたHTML出力にコメントが含まれることはないことに注意してください。

于 2013-02-04T18:21:34.167 に答える
2

BalusC がすでに提供しているオプションに加えて、属性を に追加することもできrendered="false"ますcommandLink

すばやく切り替えたいコンポーネントが複数ある場合は、Bean にデバッグ プロパティを作成するか、プロジェクト ステージを使用することを検討してください。

rendered="#{facesContext.application.projectStage == 'Development'}"
于 2016-09-21T14:10:56.160 に答える