2

使用 a DataModel<MyObject>,我根据此响应填写数据表

现在在每一行的末尾我有一个删除按钮,它调用我的 bean 的某个方法。数据被彻底删除。但由于删除后数据已更改,我想重新加载页面以反映更改。

我的尝试是在以下位置添加导航规则faces-config.xml

概述 /overview.jsp 已删除订阅 /overview.jsp

如果我有<redirect />或没有,无论哪种方式,它都不会重新加载或做任何其他事情。数据被删除,因此实际调用了 bean 的方法。

我的按钮如下所示:

<h:dataTable border="1" value="#{overviewBean.overviewModel }" var="item" first="0">
    <h:column id="column13">
        <f:facet name="header">
            <h:outputText value="#{messages.overviewDeleteItem }"></h:outputText>
        </f:facet>
        <h:commandButton action="#{overviewBean.deleteItem}" value="X"/>
    </h:column>
</h:dataTable>

设置属性type="submit"实际上解决了问题。页面被重新加载。

我现在的问题是:真的需要提交吗?JSF (Apache MyFaces) 不是有一些使用 AJAX 来消除刚刚删除的行的机制吗?

感谢您尝试帮助 JSF 新手。

4

1 回答 1

4

只需从数据模型的支持列表中删除该项目。更改将反映在模型中。

基本上:

private List<MyObject> overviewList;
private DataModel overviewModel;

public OverviewBean() {
    overviewList = overviewDAO.list();
    overviewModel = new ListDataModel(overviewList);
}

public void deleteItem() {
    MyObject myObject = (MyObject) overviewModel.getRowData();
    overviewDAO.delete(myObject);
    overviewList.remove(myObject); // See?
}

此后不需要重定向。如果 action 方法返回 void(或null),它无论如何都会转到同一页面。

Ajaxical 功能已在 JSF 2.0 中引入,但如果我没记错的话,您仍然使用 JSF 1.x。在您认为有必要的情况下,您最好的选择是采用像 Ajax4jsf(目前是 RichFaces 的一部分)这样的第 3 方组件库。

于 2011-01-18T00:29:05.667 回答