【问题标题】:How to format BigDecimal property of Struts2 iterator variable using getText()如何使用 getText() 格式化 Struts2 迭代器变量的 BigDecimal 属性
【发布时间】:2018-06-10 00:48:01
【问题描述】:

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

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

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

“reporte”对象的类可通过 Action 中的 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>

【问题讨论】:

  • 使用迭代变量det.total
  • @jspcal 据我了解,我正在这样做。我也试过 {#det.total}。更新:{det.total} 也没有用。
  • 您不应该在参数名称周围使用花括号;我什至不确定它为什么会起作用。由于det 将在堆栈上,因此您不需要det.total,只需total 即可。实际上,您不需要设置var,这只是如何命名被压入堆栈的内容。 getText 的第一个参数应该是格式字符串的属性键——也许你现在可以直接传递格式,我没有跟上,不知道为什么它适用于 reporte.totalGeneral。我必须设置一个快速测试应用来检查。
  • @DaveNewton 我设法通过在循环内引用动作来解决我的问题。
  • @jspcal 我设法通过引用循环内的操作来解决问题。

标签: jsp struts2 el ognl


【解决方案1】:

当在迭代器标签内调用 getText 之前添加 #action. 解决了问题。

我的理解是getText()Action (SupportAction) 的成员函数,因此当操作位于堆栈顶部时,可以在不指定变量的情况下调用它。

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

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

提示:真正帮助我弄清楚的是&lt;s:degub&gt; 标记的使用,以及在使用devMod 时,?debug=xml 参数在操作后获得转储堆栈(需要 IE)。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多