【问题标题】:a4j:commandButton actionListener not being invokeda4j:commandButton actionListener 未被调用
【发布时间】:2014-04-22 14:42:50
【问题描述】:

我有一个问题,即<a4j:commandButton> 上的actionListener 没有在服务器上被调用。我已经制作了我的真实代码的简化版本,并确认它证明了这个问题。

有人能解释一下为什么没有调用 actionListener 吗?

使用了 3 个文件:index.xhtml、MyManagedBean.java 和 MyEntity.java。以下是列表:

index.xhtml

<!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://java.sun.com/jsf/html" xmlns:a4j="http://richfaces.org/a4j"
    xmlns:rich="http://richfaces.org/rich" xmlns:f="http://java.sun.com/jsf/core"
    xmlns:ui="http://java.sun.com/jsf/facelets">

<f:metadata>
    <f:event type="preRenderView" listener="#{myManagedBean.preRenderView}" />
</f:metadata>

<h:head>
    <title>A simple example</title>
</h:head>

<h:body>
    <rich:panel id="treePanel" header="Tree Panel">
        <h:form>
            <rich:tree var="entity" selectionType="ajax" selectionChangeListener="#{myManagedBean.onSelectionChanged}"
                render="treePanel,editPopup">
                <rich:treeModelAdaptor nodes="#{myManagedBean.someEntities}">
                    <rich:treeNode>
                        <h:outputText value="#{entity.someString}" />
                    </rich:treeNode>
                </rich:treeModelAdaptor>
            </rich:tree>
            <a4j:commandButton value="Rename..." onclick="#{rich:component('editPopup')}.show()"
                disabled="#{empty myManagedBean.selectedEntity}" />
        </h:form>
    </rich:panel>

    <rich:popupPanel id="editPopup" modal="true" autosized="true" resizeable="false"
        rendered="#{not empty myManagedBean.selectedEntity}" domElementAttachment="form">
        <f:facet name="header">
            <h:outputText value="Edit entity" />
        </f:facet>
        <h:form>
            <h:panelGrid columns="2">
                <h:outputLabel for="id" value="ID:" />
                <h:outputText id="id" value="${myManagedBean.selectedEntity.id}" />

                <h:outputLabel for="someString" value="Some string:" />
                <h:inputText id="someString" value="${myManagedBean.selectedEntity.someString}"
                    validatorMessage="Alphanumerics and spaces only.">
                    <f:validateRegex pattern="^[ 0-9A-Za-z]*$" />
                    <rich:validator />
                </h:inputText>
                <h:outputText />
                <rich:message for="someString" />
            </h:panelGrid>

            <a4j:commandButton actionListener="#{myManagedBean.updateSelectedEntity}" value="Update"
                oncomplete="#{rich:component('editPopup')}.hide()" render="treePanel" />
            <a4j:commandButton value="Cancel" onbegin="#{rich:component('editPopup')}.hide()" />
        </h:form>
    </rich:popupPanel>

</h:body>
</html>

MyManagedBean.java

package com.example.simple;

import java.util.ArrayList;
import java.util.List;

import javax.annotation.Resource;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.SessionScoped;
import javax.persistence.EntityManager;
import javax.persistence.PersistenceContext;
import javax.persistence.PersistenceContextType;
import javax.persistence.TypedQuery;
import javax.persistence.criteria.CriteriaBuilder;
import javax.persistence.criteria.CriteriaQuery;
import javax.persistence.criteria.Root;
import javax.transaction.HeuristicMixedException;
import javax.transaction.HeuristicRollbackException;
import javax.transaction.NotSupportedException;
import javax.transaction.RollbackException;
import javax.transaction.SystemException;
import javax.transaction.UserTransaction;

import org.richfaces.component.UITree;
import org.richfaces.event.TreeSelectionChangeEvent;

@ManagedBean
@SessionScoped
public class MyManagedBean {

    private List<MyEntity> someEntities;

    private MyEntity selectedEntity = null;

    @PersistenceContext(type = PersistenceContextType.EXTENDED)
    private EntityManager em;

    @Resource
    UserTransaction utx;

    public void preRenderView() throws NotSupportedException, SystemException, SecurityException, IllegalStateException, RollbackException, HeuristicMixedException, HeuristicRollbackException {
        System.out.println( "preRenderView executed" );
        CriteriaBuilder cb = em.getCriteriaBuilder();
        CriteriaQuery<MyEntity> cq = cb.createQuery( MyEntity.class );
        Root<MyEntity> entity = cq.from( MyEntity.class );
        cq.select( entity );
        TypedQuery<MyEntity> q = em.createQuery( cq );
        someEntities = q.getResultList();

        if ( someEntities.isEmpty() ) {
            utx.begin();

            for ( int i = 0; i < 10; i++ ) {
                MyEntity newEntity = new MyEntity();
                newEntity.setSomeString( new StringBuilder( "Entity number " ).append( i ).toString() );
                em.persist( newEntity );
                someEntities.add( newEntity );
            }


            em.flush();
            utx.commit();
        }
    }

    public List<MyEntity> getSomeEntities() {
        return someEntities;
    }

    public void setSomeEntities( List<MyEntity> someEntities ) {
        this.someEntities = someEntities;
    }

    public MyEntity getSelectedEntity() {
        return selectedEntity;
    }

    public void setSelectedEntity( MyEntity selectedEntity ) {
        this.selectedEntity = selectedEntity;
    }

    public void onSelectionChanged( TreeSelectionChangeEvent event ) {
        List<Object> selection = new ArrayList<Object>( event.getNewSelection() );
        Object newSelectionKey = selection.get( 0 );
        UITree tree = (UITree) event.getSource();
        tree.setRowKey( newSelectionKey );
        setSelectedEntity( (MyEntity) tree.getRowData() );
    }

    public void updateSelectedEntity() throws NotSupportedException, SystemException, SecurityException, IllegalStateException, RollbackException, HeuristicMixedException, HeuristicRollbackException {
        utx.begin();
        em.merge( selectedEntity );
        em.flush();
        utx.commit();
    }
}

MyEntity.java

package com.example.simple;

import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;

@Entity
public class MyEntity {

    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    private Integer id;

    private String someString;

    public Integer getId() {
        return id;
    }

    public void setId( Integer id ) {
        this.id = id;
    }

    public String getSomeString() {
        return someString;
    }

    public void setSomeString( String someString ) {
        this.someString = someString;
    }

    public String toString() {
        return someString;
    }
}

【问题讨论】:

    标签: jakarta-ee richfaces


    【解决方案1】:

    您似乎有嵌套的表单,摆脱它们(即只保留一个)。

    顺便说一句,这看起来不像是简化版。 &lt;my:editForm&gt; 对问题有任何影响吗?

    【讨论】:

    • 好的,我已经从场景中删除了组合以进一步简化,因为它不会影响行为。无论如何,我看不到表单的嵌套位置。您是否假设复合将包含
      元素?它没有。
    • 弹出面板将自身附加到表单 - 因此按钮位于表单内,最终位于另一个表单内。
    • 好的,因此将 popupPanel 移动到其包含表单的内部确实可以解决此特定问题。稍后我将编辑答案以保持一致性并接受。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-06-02
    • 1970-01-01
    • 1970-01-01
    • 2013-05-25
    • 1970-01-01
    • 2011-12-24
    相关资源
    最近更新 更多