如何使用 getText() 格式化 Struts2 迭代器变量的 BigDecimal 属性
How to format BigDecimal property of Struts2 iterator variable using getText()
我在使用 <s:property>
标签和 getText()
格式化 Struts2
中的 BigDecimal
时遇到问题。
我第一次使用它(在迭代器标记之前)时,它按预期工作。
我第二次尝试使用它时,它带有一个 属性 的迭代器变量。在这种情况下,它不会打印任何内容。
我有 Struts2
和 devMod
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)。
我在使用 <s:property>
标签和 getText()
格式化 Struts2
中的 BigDecimal
时遇到问题。
我第一次使用它(在迭代器标记之前)时,它按预期工作。
我第二次尝试使用它时,它带有一个 属性 的迭代器变量。在这种情况下,它不会打印任何内容。
我有 Struts2
和 devMod
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)。