f:convertNumber 的复合组件将不起作用

Composite Component with f:convertNumber won't work

我制作了一个使用 f:convertNumber 的 JSF 复合组件。但是,它不能转换价值。这是怎么造成的,我该如何解决?

currency.xhtml

<?xml version='1.0' encoding='UTF-8' ?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml"
    xmlns:composite="http://java.sun.com/jsf/composite"
    xmlns:f="http://java.sun.com/jsf/core">

    <composite:interface>
    </composite:interface>

    <composite:implementation>
        <f:convertNumber pattern="#,###" currencyCode="\"/> 
    </composite:implementation>
</html>

index.xhtml

...

<h:outputText value="10000000">
  <mycomp:currency />
</h:outputText>

...

结果

10000000

这确实行不通。

复合组件被解释为 UI 组件。然而,<f:convertNumber> 是一个标记处理程序,而不是 UI 组件。基本上,它将应用于合成本身(并呈现为无用),而不是如您所愿应用于目标组件。

您至少有两个选择:

  1. 也将 <h:outputText> 移动到合成中,

    <composite:interface>
        <composite:attribute name="value" />
    </composite:interface>
    <composite:implementation>
        <h:outputText value="#{cc.attrs.value}">
            <f:convertNumber pattern="#,###" currencyCode="\" />
        </h:outputText>
    </composite:implementation>
    

    所以你最终可以如下使用它。

    <mycomp:currency value="10000000" />
    
  2. 子类 NumberConverter 在构造函数中设置了默认值并使用它代替。

    @FacesConverter("defaultCurrencyConverter")
    public class DefaultCurrencyConverter extends NumberConverter {
    
        public DefaultCurrencyConverter() {
            setPattern("#,###");
            setCurrencyCode("\");
        }
    
    }
    

    <h:outputText value="10000000" converter="defaultCurrencyConverter" />
    

    当您按照此处所述在标记文件中注册此转换器时 Creating custom tag for Converter with attributes

    <tag>
        <tag-name>currency</tag-name>
        <converter>
            <converter-id>defaultCurrencyConverter</converter-id>
        </converter>
    </tag>
    

    然后您最终可以按预期使用它。

    <h:outputText value="10000000">
        <mycomp:currency />
    </h:outputText>
    

另请参阅:

  • How to avoid repetitions / use constants in Facelets page?
  • When to use <ui:include>, tag files, composite components and/or custom components?