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 组件。基本上,它将应用于合成本身(并呈现为无用),而不是如您所愿应用于目标组件。
您至少有两个选择:
也将 <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" />
子类 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?
我制作了一个使用 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 组件。基本上,它将应用于合成本身(并呈现为无用),而不是如您所愿应用于目标组件。
您至少有两个选择:
也将
<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" />
子类
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?