web-dev-qa-db-ja.com

<c:iftest>はJSF2フェイスレットで常にtrueと評価されるようです

FaceletsでJSF2を使用しています。

ページで<ui:param>を定義します。

<ui:composition template="/WEB-INF/templates/ui.xhtml"
  xmlns="http://www.w3.org/1999/xhtml"
  xmlns:f="http://Java.Sun.com/jsf/core"
  xmlns:h="http://Java.Sun.com/jsf/html"
  xmlns:ui="http://Java.Sun.com/jsf/facelets"
>
  <ui:param name="title" value="OnAir WebDemo" />
  ...
</ui:composition>

私が持っているui.xhtmlテンプレートに:

<html
  xmlns="http://www.w3.org/1999/xhtml"
  xmlns:f="http://Java.Sun.com/jsf/core"
  xmlns:h="http://Java.Sun.com/jsf/html"
  xmlns:ui="http://Java.Sun.com/jsf/facelets"
  xmlns:c="http://Java.Sun.com/jstl/core"
>
  <c:if test="#{not empty title}">
    <h1>#{title}</h1>
  </c:if>
</html>

ただし、<c:if test>が指定されていない場合でも、<ui:param>は常にtrueを評価するようです。 <c:if test>が指定されていないときに<ui:param>が実際にfalseを評価するように、コードを変更するにはどうすればよいですか?

10
Dejell

XML名前空間が無効です。そのはず

xmlns:c="http://Java.Sun.com/jsp/jstl/core"

はい、驚くべきことに、URIの/jsp部分があります! /jspのないものは、JSF1.xのFacelets1.xでのみ機能します。 Webブラウザで生成されたHTML出力を確認した場合は、HTML出力で<c:if>が解析されないままになっていることにも気付くはずです。


とはいえ、技術的に不可能でない限り(つまり、実際にビューのbuildingを制御したい場合は、ビューのレンダリング)。自分でわかったh:panelGroupは良い候補ですが、オーバーヘッドが少ないのでui:fragmentの方が適しています。

<ui:fragment rendered="#{not empty title}">
    <h1>#{title}</h1>
</ui:fragment>

最初のJSF2.0バージョンの<ui:fragment>タグ定義ファイルのJSF担当者のミスにより、Netbeansはタグがrendered属性をサポートしていないとジャークしますが、これは正しくありません。 。それは確かにそれをサポートします。 JSF2.1タグ定義で修正されました。

参照:

43
BalusC

上手、

代わりに、次のようにrenderedを使用しました。

<h:panelGroup rendered="#{title!=null}">

                <h1>#{title}</h1>

        </h:panelGroup>
3
Dejell