当前位置: 首页 > 知识库问答 >
问题:

JSF Primefaces datatable处于cell editMode中,而不将编辑的值发送到托管bean

袁枫涟
2023-03-14

我的问题是,当我编辑单词列表上的字符串时,我的侦听器方法不会接收到新的值。事实上,当我调用event.getNewValue()方法时,我得到的是旧值。

我错过了什么?

我使用的是JavaServer Faces 2.2、Primefaces 5.0和Spring Framework 4.0.3。

<h:body>
    <h:form id="mainEntityForm">
        <p:panelGrid columns="1" fullPage="true" id="dashboard">
            <f:facet name="header">
                <h2>MainEntity Table</h2>
            </f:facet>
            <p:panel>
                <f:facet name="header">
                    MainEntity List
                    <p:commandButton value="New MainEntity"
                        actionListener="#{mainEntityController.createMainEntityDialog}"
                        styleClass="header-button">
                        <p:ajax event="dialogReturn" update=":mainEntityForm:mainEntityTable" />
                    </p:commandButton>
                </f:facet>
                <p:dataTable id="mainEntityTable" var="mainEntity" value="#{mainEntityController.mainEntities}"
                    editable="true" editMode="cell" widgetVar="cellMainEntity"
                    selectionMode="single" selection="#{mainEntityController.selectedMainEntity}"
                    rowKey="#{mainEntity.id}" tableStyle="width:auto">

                    <p:ajax event="rowSelect" update=":mainEntityForm:stringGrid :mainEntityForm:entityAGrid :mainEntityForm:entityBGrid" />
                    <p:ajax event="cellEdit" listener="#{mainEntityController.onEditMainEntity}" update=":mainEntityForm:mainEntityTable" />

                    <p:column headerText="ID">
                        <h:outputText value="#{mainEntity.id}" />
                    </p:column>
                    <p:column headerText="Name">
                        <p:cellEditor>
                            <f:facet name="output">
                                <h:outputText id="nameOutput" value="#{mainEntity.name}" />
                            </f:facet>
                            <f:facet name="input">
                                <h:inputText id="atyInput" value="#{mainEntity.qty}" />
                            </f:facet>
                        </p:cellEditor>
                    </p:column>
                    <p:column headerText="Commands">
                        <p:commandButton title="Remove MainEntity" icon="ui-icon-trash"
                            actionListener="#{mainEntityController.deleteMainEntity(mainEntity)}"
                            update=":mainEntityForm:mainEntityTable" />
                    </p:column>
                </p:dataTable>
            </p:panel>
            <p:panelGrid fullPage="true" id="mainEntityDetail">
                <f:facet name="header">
                    <p:row>
                        <p:column colspan="4">
                            <h2>MainEntity Detail</h2>
                        </p:column>
                    </p:row>
                </f:facet>
                <p:row>
                    <p:column>
                        <p:panel>
                            <f:facet name="header">
                                Word List
                                <p:commandButton value="New Word"
                                        actionListener="#{mainEntityController.addNewWord()}"
                                        styleClass="header-button"
                                        update=":mainEntityForm:wordGrid">
                                </p:commandButton>
                            </f:facet>
                            <p:dataTable id="wordGrid" var="word"
                                value="#{mainEntityController.selectedMainEntity.wordList}"
                                tableStyle="width:auto" editable="true" editMode="cell" widgetVar="cellWord">

                                <p:ajax event="cellEdit" listener="#{mainEntityController.onEditWord}" />

                                <p:column headerText="Word">
                                    <p:cellEditor>
                                        <f:facet name="output">
                                            <h:outputText id="wordOutput" value="#{word}" />
                                        </f:facet>
                                        <f:facet name="input">
                                            <h:inputText id="wordInput" value="#{word}" />
                                        </f:facet>
                                    </p:cellEditor>
                                </p:column>
                                <p:column headerText="Commands">
                                    <p:commandButton title="Remove Word"
                                        icon="ui-icon-trash"
                                        actionListener="#{mainEntityController.removeWord(word)}"
                                        update=":mainEntityForm:wordGrid" />
                                </p:column>
                            </p:dataTable>
                        </p:panel>
                    </p:column>
                </p:row>
            </p:panelGrid>
        </p:panelGrid>
    </h:form>
</h:body>
@ManagedBean
@SessionScoped
public class MainEntityController {

    //...

    private MainEntity selectedMainEntity;

    public List<MainEntity> mainEntities;

    //...

    public MainEntity getSelectedMainEntity(){
        return selectedMainEntity;
    }

    public void setSelectedMainEntity(MainEntity mainEntity){
        this.selectedMainEntity = mainEntity;
    }

    //...

    public void onEditWord(CellEditEvent event) {
        Object oldValue = event.getOldValue();
        Object newValue = event.getNewValue();

        if(newValue != null && !newValue.equals(oldValue)) {

            // THE PROBLEM IS HERE
            // I NEVER ACTUALLY REACH THIS CODE
            // newValue is always equal to oldValue!

            FacesContext context = FacesContext.getCurrentInstance();
            String word = context.getApplication().evaluateExpressionGet(context, "#{word}", String.class);
            System.out.println(newValue);
            System.out.println(word);

            FacesMessage msg = new FacesMessage(FacesMessage.SEVERITY_INFO, "Word Changed", "Old: " + oldValue + ", New:" + newValue);
            FacesContext.getCurrentInstance().addMessage(null, msg);
        }
    }
}
@Entity
public class MainEntity {

    @Id
    private String id;

    @ElementCollection(fetch=FetchType.EAGER)
    @CollectionTable(
                name="MainEntity_Word",
                joinColumns = @JoinColumn(name = "id", referencedColumnName="id")
            )
    @Column(name = "word")
    private Set<String> wordList;

    //...

    public void addWord(String word) {
        this.wordList.add(word);
    }

    public void removeWord(String word) {
        this.wordList.remove(word);
    }

    public Set<String> getWordList() {
        return wordList;
    }

    public void setWordList(Set<String> wordList) {
        this.wordList = wordList;
    }
}

共有1个答案

古明煦
2023-03-14

改变

<h:inputText id="wordInput" value="#{word}" />

<p:inputText id="wordInput" value="#{word}" />

<h:inputText id="wordInput" value="#{word}" >
<p:ajax event="change" process="@this"/>
</h:inputText>
<p:column headerText="Word" >
<p:cellEditor>
<f:facet name="output">
<h:outputText id="wordOutput" value="#{word}" />
</f:facet>
<f:facet name="input">
<h:inputText id="wordInput" value="#{word}" />
</f:facet>
</p:cellEditor>
</p:column>
<p:column headerText="Word" >
<p:cellEditor>
<f:facet name="output">
<h:outputText id="wordOutput" value="#{word}" />
</f:facet>
<f:facet name="input">
<p:inputText id="wordInput" value="#{word}" >
<p:ajax event="change" update="wordOutput" />
</p:inputText>
</f:facet>
</p:cellEditor>
</p:column>
 类似资料:
  • 我正计划将一个web应用程序从使用JSF托管bean转换为使用CDI托管bean。我知道我需要做以下工作: 在WEB-INF中添加空beans.xml文件。 将所有JSF@ManagedBean替换为CDI@Named Annotations。 用CDI或OmniFaces作用域注释替换所有JSF作用域注释。 将所有JSF@ManagedProperty替换为CDI@Inject Annotati

  • 我有一个托管bean,它有以下方法: 因此,方法将打开一个对话框,并传递给它两个参数(和)。 然后命令按钮将从调用方法: 但我在行中得到了一个NullPointerException: 所以我在这一行上附加了一个dubugger,我得到了这个: 您可以注意到,变量具有空值,而具有字符串值。

  • 问题内容: 我基于Apache骆驼的应用正在消耗来自IBM队列之一的消息,例如下面是连接工厂的详细信息 消耗和处理并将响应发送到来自消息头的ReplyQueue的骆驼流。 在骆驼标头中,我在JMSReplyQueue下面。您可以看到它是不同的队列管理器,并且该队列管理器来自不同的主机,但是在集群环境中。 队列管理器也在两者之间。喜欢 以下是我在发送消息时遇到的异常。 任何人都可以帮助我将消息发送到

  • 问题内容: 我基于Apache骆驼的应用正在消耗来自IBM队列之一的消息,例如下面是连接工厂的详细信息 消耗和处理并将响应发送到来自消息头的ReplyQueue的骆驼流。 在骆驼标头中,我在JMSReplyQueue下面。您可以看到它是不同的队列管理器,并且该队列管理器来自不同的主机,但是在集群环境中。 队列管理器也在两者之间。喜欢 以下是我在发送消息时遇到的异常。 任何人都可以帮助我将消息发送到

  • 我试图从summernote编辑器中捕获数据,并通过ajax将其发送到php文件。 我正在使用load()传递一些参数集到一个PHP文件,它完美地工作;但我明白了Summernote数据是由HMTL标签组成的,它将需要大量的努力来验证Summernote数据的传输。相反,我决定使用$. ajax()进行另一个ajax调用。每次我发送数据,load()ajax调用工作,但$. ajax()不工作,相

  • item_ids是一个传入的数组,它本质上是@[1234,1235],只是几个数字。接收此请求的web服务没有为$_POST设置任何内容,但是我发送的JSON确实显示在$HTTP_RAW_POST_DATA中。这是为什么?是我的请求做错了什么,还是更有可能是服务器端出现了问题? 提前感谢!