如何在JSF中实现计算字段

时间:2012-07-14 12:47:04

标签: jsf

我有一个实体OrderLine,其字段为unitPrice,quantity和totalPrice。并计算totalPrice值:totalPrice = unitPrice * quantity。

totalPrice是一个持久字段。

我想在视图中将totalPrice显示为ouputtext。

第一种选择: <h:outputText id="total" value="#{unitPrice*quantity}"/>使用此替代方法,实体字段totalPrice将永远不会更新,但在视图中将显示总价格的正确值。

第二种选择:<h:outputText id="total" value="#{orderLine.totalPrice }"/>

使用此替代方法,将显示从数据库获取的值,但此值将始终为null。

是否可以仅使用JSF,在显示页面时显示值#{orderLine.totalPrice},并在同一页面中修改unitPrice或数量时设置更新值#{unitPrice * quantity}? / p>

感谢

2 个答案:

答案 0 :(得分:2)

如果我是你,我可能会尝试在客户端使用jQuery的JavaScript进行此操作。

但如果你真的想用普通的Java&amp; JSF,您可以做的一件事是,只要更新其中一个字段totalPriceunitPrice,就会更新字段quantity

public void setUnitPrice(BigDecimal unitPrice) {
    this.unitPrice = unitPrice;
    this.updateTotalPrice();
}
public void setQuantity(BigDecimal quantity) {
    this.quantity = quantity;
    this.updateTotalPrice();
}
private void updateTotalPrice() {
    // update total price accordingly:
    if (unitPrice != null && quantity != null){
        this.totalPrice = this.unitPrice.multiply(this.quantity);
    }
}

这样您也可以使模型始终保持最新状态。

然后你只需要在onchangeunitPrice表单控件的事件quantity上重新呈现使用ajax显示它的组件,如下所示:

<h:panelGrid>
    <label>Unit Price</label>
    <h:inputText value="#{myBean.unitPrice}">
        <f:convertNumber type="currency" />
        <f:ajax render="totalPrice" />
    </h:inputText>
    <label>Quantity</label>
    <h:inputText value="#{myBean.quantity}">
        <f:convertNumber type="currency" />
        <f:ajax render="totalPrice" />
    </h:inputText>
    <h:outputText id="totalPrice" value="#{myBean.totalPrice}">
        <f:convertNumber type="currency" />
    </h:outputText>
</h:panelGrid>

答案 1 :(得分:1)

您可能需要使用包装器将逻辑放在包装的getTotalPrice方法中,而不是直接使用实体。通过这种方式,您可以获得更好的逻辑/表示分离,在这种情况下,您将能够向getTotalPrice添加舍入逻辑(大多数时候IEEE浮动数学不适合与金钱相关的数学...)