【问题标题】:how to parse the value to integer in <ui:repeat value="..." var="...">?如何将 <ui:repeat value="..." var="..."> 中的值解析为整数?
【发布时间】:2010-11-25 17:28:44
【问题描述】:

我有这样的代码:

<ui:repeat value="#{myController.fileList}}"  var="element" >
<t:inputFileUpload value="#{myController.uploadedFile[element]}"  />
</ui:repeat>

但这会返回错误:java.lang.NumberFormatException:对于输入字符串:“[0]}”。 UploadedFile 是一个文件数组。当我写这样的代码时

...
<t:inputFileUpload value="#{myController.uploadedFile[0]}"  />
...

一切正常,但我希望有 0-8 之间的值,不仅是“0”,而且必须从我的控制器返回。那么如何将这个'元素'转换为&lt;t:inputFileUpload value="#{myController.uploadedFile[element]}" /&gt;中的int值呢?感谢您的帮助。

【问题讨论】:

    标签: jsf facelets


    【解决方案1】:

    您可以使用varStatus attribute 获取循环状态。

    <ui:repeat value="#{myController.fileList}" var="element" varStatus="loop">
        <t:inputFileUpload value="#{myController.uploadedFile[loop.index]}" />
    </ui:repeat>
    

    (顺便说一下,仅在 JSF 2.x 中可用,在 JSF 1.x 中您最好的选择可能是c:forEach

    但是你为什么不直接使用下面的呢?

    <ui:repeat value="#{myController.uploadedFile}" var="uploadedFile">
        <t:inputFileUpload value="#{uploadedFile}" />
    </ui:repeat>
    


    更新fileList 必须是 List&lt;Integer&gt;Integer[]int[] 类型,uploadedFile 必须是 List&lt;SomeObject&gt;SomeObject[] 类型才能获取您的初始代码工作。


    更新 2:这是一个小的可重复测试 sn-p:

    XHTML:

    <h:form>
        <h:selectManyCheckbox value="#{bean.selectedIndexes}">
            <f:selectItems value="#{bean.selectIndexes}" />
        </h:selectManyCheckbox>
        <h:commandButton value="submit" />
    </h:form>
    <ui:repeat value="#{bean.selectedIndexes}" var="selectedIndex">
        <p><h:outputText value="#{bean.list[selectedIndex]}" /></p>
    </ui:repeat>
    

    Bean:

    private List<SelectItem> selectIndexes; // +getter
    private List<Integer> selectedIndexes; // +getter +setter
    private List<String> list; // +getter
    
    public Bean() {
        selectIndexes = new ArrayList<SelectItem>();
        selectIndexes.add(new SelectItem(0, "one"));
        selectIndexes.add(new SelectItem(1, "two"));
        selectIndexes.add(new SelectItem(2, "three"));
        selectIndexes.add(new SelectItem(3, "four"));
        selectedIndexes = new ArrayList<Integer>();
        list = Arrays.asList("one", "two", "three", "four");
    }
    

    在 Mojarra 2.0.3 和 Apache Tomcat 6.0.29 上运行良好。您只需将selectedIndexes 替换为fileListlist 替换为uploadedFile

    【讨论】:

    • 我不能使用第一个解决方案。原因是:用户正在选择应该由他修改的文件。有0-8个文件。文件的名称也是 0-8。如果他只选择第二个和第四个文件,我只想向他显示两个 元素 - 他只能覆盖他之前选择的这两个文件。在这种情况下,我想知道应该替换哪些文件。如果他选择所有八个文件,您的解决方案就可以工作。感谢您的快速回复。
    • 啊,我明白你的意思了。 fileList 包含您要使用相关uploadedFile 的选定文件。好的,我更新了答案。
    • 我在控制器中写了这样的东西: List result = new LinkedList();我要返回这个列表。我首先认为它会起作用,但仍然出现错误。
    • 抱歉,我无法重现您的问题。查看小测试 sn-p 的答案更新。
    • 你赢了t believe - my previous code worked but i had stupid mistake on my xhtml page - value="#{myController.fileList}}" - i used there double brackets '}}' so server couldnt 将其转换为 int 并将其视为字符串。抱歉有问题,感谢您的回复。你的建议像往常一样很有帮助:)。问候。
    猜你喜欢
    • 2023-04-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-04-06
    • 2021-12-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多