如何使用 getText() 格式化 Struts2 迭代器变量的 BigDecimal 属性

How to format BigDecimal property of Struts2 iterator variable using getText()

我在使用 <s:property> 标签和 getText() 格式化 Struts2 中的 BigDecimal 时遇到问题。 我第一次使用它(在迭代器标记之前)时,它按预期工作。 我第二次尝试使用它时,它带有一个 属性 的迭代器变量。在这种情况下,它不会打印任何内容。 我有 Struts2devMod on,我也没有得到任何异常。 但是,当使用不带 getText()<s:property> 标记输出时,相同的 属性 会按预期工作。

我已经尝试了各种替代方案,例如将变量包含在 %{} 中,一起删除封闭的变量, 添加带有 hash tag 和更多变体的变量名称。

有一个使用 <s:text> 标签的答案,但即使这是一个替代方案,我也想知道如何使用 getText

"reporte" 对象的 class 可用于操作中 getter 和 setter 的 JSP。

public class Reporte {

    List<Reporte.Item> detalle = new ArrayList<>();
    BigDecimal totalGeneral;

    public List<Reporte.Item> getDetalle() {
        return detalle;
    }

    public void setDetalle(List<Reporte.Item> detalle) {
        this.detalle = detalle;
    }

    public void setTotalGeneral(BigDecimal totalGeneral){
        this.totalGeneral = totalGeneral;
    }

    public BigDecimal getTotalGeneral(){
        return this.totalGeneral;
    }


    public static class Item{ 
        private BigDecimal total;

        public BigDecimal getTotal() {
            return total;
        }
        public void setTotal(BigDecimal total) {
            this.total = total;
        }   
    }
}

JSP

<!DOCTYPE html PUBLIC 
    "-//W3C//DTD XHTML 1.1 Transitional//EN"
    "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

<%@taglib prefix="s" uri="/struts-tags" %>

<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
<head>
    <title>Reporte</title>
</head>
<body>
    <s:property value="getText('{0,number,#,##0.00}',{reporte.totalGeneral})"/> <br/>  <%-- works --%>

    <s:iterator var="det" value="reporte.detalle">
        <s:property value="total"/> <%-- works --%>
        <s:property value="getText('{0,number,#,##0.00}', {total})"/><br/> <%-- doesn't print anything --%>
    </s:iterator>
</body>
</html>

在迭代器标记内调用时,通过在 getText 之前添加 #action. 解决了问题。

我的理解是 getText()Action (SupportAction) 的成员函数,所以当动作在栈顶时可以调用它而无需指定多变的。

<s:property value="#action.getText('{0,number,#,##0.00}', {total})"/><br/>

在迭代器内部,项目被放在栈顶,所以要调用动作的getText需要引用变量名。

提示: 真正让我费解的是 <s:degub> 标签的使用,而在使用 devMod 时,?debug=xml 操作后的参数以获取堆栈转储(需要 IE)。