在commandLink操作时,可数据项设置为null

时间:2013-11-29 15:02:12

标签: jsf primefaces datatable null jsf-2.2

如果我运行该应用并点击第一个p:commandLinkitem将按预期设置。单击另一个p:commandLink时,前一个将被删除(null)。 h:commandLink没有这个问题。

如果我将:theform:output添加到update的{​​{1}}参数,之前点击的项目就会停止消失。

这种行为的原因是什么?

的Env

  • Java 1.7.45
  • Netbeans 7.4
  • JSF Mojarra 2.2.4
  • Primefaces 4.0

的index.xhtml

p:commandLink

XtestListBean.java

<?xml version='1.0' encoding='UTF-8' ?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml"
      xmlns:h="http://xmlns.jcp.org/jsf/html"
      xmlns:f="http://xmlns.jcp.org/jsf/core"
      xmlns:p="http://primefaces.org/ui">
    <h:head>
        <title>Test</title>
    </h:head>
    <h:body>
        <h:form id="theform">
            <h:panelGroup layout="block" styleClass="tableBorder" id="tableWrapper">
                <h:dataTable value="#{xtestListBean.list}" var="item">
                    <h:column> 
                        <h:outputText value="#" styleClass="tableItem" />
                    </h:column>
                    <h:column> 
                        <h:commandLink 
                            value="#{item.name}" 
                            actionListener="#{xtestEntityBean.setItem(item)}">
                            <f:ajax render=":theform:tableWrapper" />
                        </h:commandLink>
                        <p:commandLink 
                            value="#{item.name}" 
                            actionListener="#{xtestEntityBean.setItem(item)}"
                            update=":theform:tableWrapper">
                        </p:commandLink>
                    </h:column>
                </h:dataTable>
            </h:panelGroup>
            <h:inputText value="#{xtestEntityBean.item.name}" size="40" id="output" />
        </h:form>
    </h:body>
</html>

XtestEntityBean.java

package beans;

import dto.Item;
import java.io.Serializable;
import java.util.ArrayList;
import java.util.List;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.ViewScoped;

@ManagedBean
@ViewScoped
public class XtestListBean implements Serializable {

    private List<Item> list;

    public XtestListBean() {
        list = new ArrayList();
        list.add(new Item("Test 1"));
        list.add(new Item("Test 2"));
        list.add(new Item("Test 3"));
        list.add(new Item("Test 4"));
        list.add(new Item("Test 5"));
        list.add(new Item("Test 6"));
        list.add(new Item("Test 7"));
    }

    public List<Item> getList() {
        return list;
    }
}

1 个答案:

答案 0 :(得分:1)

只是这样。只是在调用<h:inputText value="#{xtestEntityBean.item.name}">时也会处理<p:commandLink>。在效果中,项目的name以空/空值提交,并反映在表格中。这不是整个Item实例变为null左右。

这是怎么造成的?好吧,<f:ajax execute>默认为@this,这意味着在表单提交期间只处理当前组件(即命令链接)。但是,PrimeFaces等效,<p:commandLink process>默认为@form,这意味着在表单提交期间处理整个父表单,包括引用项目名称的空输入字段。

如果您明确将<p:commandLink process>设置为@this,与<f:ajax execute>的默认设置相同,那么它应该按预期工作。

<p:commandLink 
    value="#{item.name}" 
    actionListener="#{xtestEntityBean.setItem(item)}"
    process="@this" update=":theform:tableWrapper">
</p:commandLink>