动态h:输入文本以支持jsf中的Bean数组[ClassCastException]

时间:2012-11-29 20:24:30

标签: java jsf

我正在使用JSF 2.0 我有一个问题是将inputTexts的值设置为double表。

我可以这样做:

<h:inputText value="#{myBean.table[0]}" /> 

但是,我想在这样的循环中这样做:

<c:forEach var="i" begin="0" end="#{myBean.inputsNumber}">              
    <h:inputText  value="#{myBean.table[i]}" />     <br/>            
</c:forEach>   
<h:commandButton action="#{myBean.calculate}" value="Calculate" /> 
Result: #{myBean.result}

这是我的支持bean:

@ManagedBean
@SessionScoped
public class MyBean {

    private double[] table;
    private double result;

    public MyBean() {
        table = new double[100];
    }

    public void calculate() {
        for (int i = 0; i < table.length; i++) {
            result += table[i];
        }
    }

    public double[] getTable() {
        return table;
    }

    public int getInputsNumber() {
        return table.length;
    }

    public double getResult() {
        return result;
    }

}

我尝试将所有组件绑定到HtmlInputText的数组,但我无法解决它。 我遇到了这个异常:ClassCastException

1 个答案:

答案 0 :(得分:3)

有两个问题:

  1. <c:forEach end>包含在内。您需要从中取1,否则在提交时最终会得到ArrayIndexOutOfBoundsException

    <c:forEach var="i" begin="0" end="#{myBean.inputsNumber - 1}">
    

    然而,更好的方法是迭代数组本身并通过varStatus得到索引。

    <c:forEach items="#{myBean.table}" varStatus="loop">
        <h:inputText value="#{myBean.table[loop.index]}" />
    </c:forEach>
    

  2. EL中的double被视为Double,而不是double。因此,您需要Double[]而不是double[],否则在提交时最终会得到ClassCastException

    private Double[] table;