【发布时间】:2018-06-10 00:48:01
【问题描述】:
我在使用<s:property> 标记和getText() 格式化Struts2 中的BigDecimal 时遇到问题。
我第一次使用它(在迭代器标记之前),它按预期工作。
我第二次尝试使用它时,它带有迭代器变量的属性。在这种情况下,它不会打印任何东西。
我有Struts2 和devMod 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 我设法通过引用循环内的操作来解决问题。