gpt4 book ai didi

jsf - 写入 h :inputText in h:dataTable 中的 map 属性

转载 作者:行者123 更新时间:2023-12-03 01:07:40 24 4
gpt4 key购买 nike

我想添加一个输入文本,用户可以在其中编辑 h:dataTable 中的数量

<h:dataTable id="checkout_table" value="#{cartController.cart.entrySet()}"
var="item" >
<h:column>
<f:facet name="header">Movie</f:facet>
#{item.key.title} - #{item.key.getAvailable()}
</h:column>
<h:column>
<f:facet name="header">Quantity</f:facet>
<h:inputText id="quantity"
value="#{item.value}" redisplay="true"
converterMessage="Please provide an integer" required="true"
requiredMessage="Please enter a quantity">
<!-- <f:validateLongRange minimum="1"
maximum="#{item.key.getAvailable()}" />
this validation must be performed on set-->
<f:ajax event="blur" render="quantityMessage" />
</h:inputText>
</h:column>
<h:column><h:commandButton value="edit"
action="#{cartController.addMovieToCart(item.key, item.value)}" />
</h:column>
<h:column><h:commandButton value="delete"
action="#{cartController.removeMovie(item.key)}" />
</h:column>
<h:column><h:message id="quantityMessage" for="quantity" /></h:column>
</h:dataTable>

现在抛出异常类“java.util.LinkedHashMap$Entry”没有可写属性“value”。我读过各种关于装订的东西,但不能完全理解它们。我应该如何为该输入字段定义 getter 和 setter?还有其他我可以使用的组件吗?

如果也可以处理验证,我们将不胜感激!

编辑:在 @BalusC 回答之后,我设法读取和写入 map - 有一个警告 - 我得到一个 CCE java.lang.String 无法转换为 java.lang bean 中的 .Integer

private Map<Movie, Integer> cart = new LinkedHashMap<>();

public String addMovieToCart(Movie movie, Integer quantity) {
if (quantity > movie.getAvailable()) {
String message = "Available copies are " + movie.getAvailable();
FacesContext.getCurrentInstance().addMessage(null,
new FacesMessage(FacesMessage.SEVERITY_ERROR, message, null));
return null;
}
Integer ordered = cart.get(movie); // CCE here !
// etc
}

最终解决了这个问题:

<h:inputText id="quantity"
value="#{cartController.cart[item.key]}"
converterMessage="Please provide an integer" required="true"
requiredMessage="Please enter a quantity" converter="javax.faces.Integer">

注意转换器 - 显然 JSF 将映射元素转换为 String ?必须显式转换为整数

没有全向面的验证似乎很困难(由于渲染/查看时间)

最佳答案

如果你想有一个可写的Map EL 中的值,则需要大括号
#{map[entry.key]}其中您将 key 作为另一个变量传递。 #{entry.value}确实不起作用,因为这是只读的,如异常所示。

因此,这应该适合您的特定情况:

<h:dataTable value="#{cartController.cart.entrySet()}" var="item">
...
<h:inputText ... value="#{cartController.cart[item.key]}" />

对于验证器,这个答案适用:Using validator with a variable attribute in ui:repeat

顺便说一句,redisplay <h:inputText> 不支持该属性。也许您对 <h:inputSecret> 感到困惑?

关于jsf - 写入 h :inputText in h:dataTable 中的 map 属性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21957974/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com