我有一个实体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>
感谢
答案 0 :(得分:2)
如果我是你,我可能会尝试在客户端使用jQuery的JavaScript进行此操作。
但如果你真的想用普通的Java&amp; JSF,您可以做的一件事是,只要更新其中一个字段totalPrice
或unitPrice
,就会更新字段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);
}
}
这样您也可以使模型始终保持最新状态。
然后你只需要在onchange
和unitPrice
表单控件的事件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浮动数学不适合与金钱相关的数学...)