0

我已经阅读了BalusC 的using-databatables并且我尝试使用请求范围添加一行示例,但我发现一个问题是当我添加

<h:inputHidden binding="#{myBean.dataItemId}" />

我页面的所有按钮都不起作用。起初我以为问题出在转换器上

<h:inputHidden binding="#{myBean.dataItemId}" converter="javax.faces.Integer"/>

但也没有转换器我有同样的问题

第二个更有趣的是,我从示例代码中不明白,当向数据表添加新行时,表之前如何获取我添加的行

例如,如果我在添加时添加第一行并将数据放在第二行,我意识到添加函数会创建一个新的ArrayList,我认为它将删除第一行

4

1 回答 1

2

正如那篇文章顶部的“通知”块中所提到的,它是针对 JSF 1.2 的。使用 JSF 2.0 视图范围可以更轻松地添加一行。

根据 JSF 1.2 文章中给出的示例,您只需进行 2 处更改:

  1. 将 bean 放在视图范围内。

  2. 删除整个<h:inputHidden>addCount属性及其上的任何引用。

这是 JSF 2.0 风格的启动示例:

@ManagedBean
@ViewScoped
public class Bean {

    private List<Item> items;

    @EJB
    private ItemService service; // Or just DAO. Whatever you want.

    @PostConstruct
    public void init() {
        items = service.list();
    }

    public void add() {
        items.add(new Item());
    }

    public void save() {
        service.save(items);
    }

    public List<Item> getItems() { 
        return items;
    }

}

和观点:

<h:dataTable value="#{bean.items}" var="item">
    <h:column>
        <h:outputText value="#{item.id}" rendered="#{item.id != null}" />
        <h:outputText value="new" rendered="#{item.id == null}" />
    </h:column>
    <h:column>
        <h:outputText value="#{item.name}" rendered="#{item.id != null}" />
        <h:inputText value="#{item.name}" rendered="#{item.id == null}" />
    </h:column>
    <h:column>
        <h:outputText value="#{item.value}" rendered="#{item.id != null}" />
        <h:inputText value="#{item.value}" rendered="#{item.id == null}" />
    </h:column>
</h:dataTable>
<h:commandButton value="Add" action="#{bean.add}" />
<h:commandButton value="Save" action="#{bean.save}" />
于 2012-12-26T21:31:41.337 回答