Как отформатировать свойство BigDecimal итерационной переменной Struts2 с помощью getText () - PullRequest
0 голосов
/ 10 июня 2018

У меня проблема с форматированием BigDecimal в Struts2 с использованием тега <s:property> вместе с getText().При первом использовании (до тега итератора) он работает как положено.Во второй раз, когда я пытаюсь использовать его, он имеет свойство переменной итератора.В этом случае он ничего не печатает.У меня Struts2 с devMod на , и я тоже не получаю никаких исключений.Тем не менее, то же свойство при выводе с использованием тега <s:property> без getText() работает, как и ожидалось.

Я перепробовал все виды альтернатив, таких как включение переменной в %{}, удаление всего включения, добавлениеимя переменной с hash tag и другими вариантами.

Существует ответ для использования тега <s:text>, но даже если это альтернатива, я хотел бы знать, как заставить это работать с getText.

Класс для объекта "reporte", предоставляемый 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>

1 Ответ

0 голосов
/ 11 июня 2018

Проблема была решена путем добавления #action. перед getText, когда он вызывается внутри тега итератора.

Насколько я понимаю, getText() является функцией-членом Action (SupportAction) поэтому, когда действие находится на вершине стека, оно может быть вызвано без указания переменной.

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

Внутри итератора элемент помещается в верхнюю часть стека, поэтому для вызова getText действия необходимо обратиться к имени переменной.

Подсказка: Что действительно помогло мне понять это, так это использование тега <s:degub>, и при использовании devMod параметр ?debug=xml следовал за действием, чтобы получить дамп стека (который требует IE).

...