【问题标题】:JSF DataTable command buttons not workingJSF DataTable 命令按钮不起作用
【发布时间】:2012-09-02 06:32:02
【问题描述】:

我使用的是 primefaces 3.3,页面上有 3 个组件:数据表、编辑区域、命令按钮。我有一个奇怪的问题:当我打开页面时,数据显示在数据表中,但是如果我单击任何按钮,调试器会提示相应的按钮代码甚至没有被调用。但是,如果我单击表中的任何记录,则会填充编辑区域,然后如果我单击按钮,它们就会开始工作。 下面是页面代码,我尝试了不同的选项,将所有内容放在 1 种形式等中,没有一个有效。请帮忙

    <ui:define name="content">
        <h:form id="form" prependId="false">
            <p:growl id="growl" showDetail="true"/>  
            <p:dataTable id="table" var="var" 
                         value="#{regions.list}" 
                         selection="#{regions.selected}"  
                         rowKey="#{var.idRegion}"
                         selectionMode="single" 
                         paginator="true" rows="10" 
                         paginatorPosition="bottom"                                  
                         >                                
                <p:ajax event="rowSelect" listener="#{regions.onRowSelect}" update=":frmEdit :form:growl"  />  
                <p:ajax event="rowUnselect" listener="#{regions.onRowUnSelect}"  update=":frmEdit :form:growl"/>  

                <f:facet name="header">  
                    List of Regions  
                </f:facet>  
                <p:column sortBy ="#{var.shortName}">
                    <f:facet name="header">Short Name</f:facet> 
                    <h:outputText value="#{var.shortName}" />
                </p:column>
                <p:column sortBy ="#{var.fullName}">
                    <f:facet name="header">Full Name</f:facet>
                    <h:outputText value="#{var.fullName}" />
                </p:column>
                <p:column sortBy ="#{var.created}">
                    <f:facet name="header">Created On</f:facet>
                    <h:outputText value="#{var.created}" />
                </p:column>
            </p:dataTable>
                            </h:form>
            <p:panel header="Add/Edit Properties">
        <h:form id="frmEdit">
                <h:panelGrid id="display" columns="6" cellpadding="4" >

                    <h:outputText value="Short Name:" />
                    <h:inputText value="#{regions.selected.shortName}" />

                    <h:outputText value="Full Name:" />
                    <h:inputText value="#{regions.selected.fullName}" />

                </h:panelGrid>
        </h:form>
        <h:form id="frmBtn">
                <h:panelGrid id="command" columns="6"  cellpadding="4" >
                    <p:commandButton id="new" value="New" actionListener="#{regions.add()}"  process="@this :frmEdit"  update="result :frmEdit :form" >                                
                    </p:commandButton>
                    <p:commandButton id="save" value="Save" actionListener="#{regions.save()}" process="@this :frmEdit"  update="result :frmEdit :form" >                                
                    </p:commandButton>
                    <p:commandButton id="delete"  value="Delete" actionListener="#{regions.delete()}"  process="@this :frmEdit"  update="result :frmEdit :form" >                                
                    </p:commandButton>
                    <p:commandButton id="refresh"  value="Refresh" actionListener="#{regions.refresh()}"  process="@this :frmEdit"  update="result :frmEdit :form" >                                
                    </p:commandButton>
                </h:panelGrid>

                <p:messages id="result" showDetail="true" autoUpdate="true"/>  
        </h:form>
            </p:panel>
    </ui:define>

以下是 JSF MB 代码:

@ManagedBean
@ViewScoped
public class Regions implements Serializable {
    private List<Region> list;
    private Region selected;
    private @EJB RegionFacade esvc;  //entity services    
    private FacesContext context;
    private FacesMessage msg;
    private boolean newRec =false;

    @SuppressWarnings("OverridableMethodCallInConstructor")
    public Regions() {
//        context = FacesContext.getCurrentInstance();
//        HttpSession session = (HttpSession)context.getExternalContext().getSession(false);
//        Users user = (Users)session.getAttribute("user");
//        if (user != null)
//            init();
//        else {
//            msg = new FacesMessage("Session Expired, Return to Login Page");
//            context.addMessage(null, msg);
//        }
    }

    @PostConstruct
    public void init(){        
        try{
            list = esvc.findAll();
        }catch (Exception ex){
            System.out.println(ex);
        }
    }

    public String add(){
        selected = new Region();          
        newRec = true;
        return "region";
    }

    public String save(){
        int result;
        if (newRec){
            result=esvc.insert(selected);
            newRec=false;
        }
        else{       
            result=esvc.update(selected);
        }
        refresh();
        context = FacesContext.getCurrentInstance();
        if (result>0){
            msg = new FacesMessage(FacesMessage.SEVERITY_INFO,"Success", "Record Saved");
            refresh();
        }else{
            msg = new FacesMessage(FacesMessage.SEVERITY_INFO,"Failure", "Record not Saved");            
        }
        context.addMessage(null, msg);
        return "region";
    }

    public String delete(){
        int result;
        result= esvc.delete(selected);
        context = FacesContext.getCurrentInstance();
        refresh();
        if (result>0){
            msg = new FacesMessage(FacesMessage.SEVERITY_INFO,"Success", "Record Deleted");            
            refresh();
        }else {
            msg = new FacesMessage(FacesMessage.SEVERITY_INFO,"Failure", "Record not Deleted");            
        }
        context.addMessage(null, msg);
        return "region";
    }

    public void refresh(){
        selected=null;
        list=getList();         
    }

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

    public Region getSelected() {
        return selected;
    }

    public void setSelected(Region selected) {
        this.selected = selected;
    }

    public void onRowSelect(SelectEvent event) {
        context = FacesContext.getCurrentInstance();
        msg = new FacesMessage("Selected", ((Region) event.getObject()).getFullName());
        context.addMessage(null, msg);
    }


    public void onRowUnSelect(UnselectEvent event) {
        context = FacesContext.getCurrentInstance();
        selected=null;
    }    

}

【问题讨论】:

  • 为什么你的按钮有一个单独的表单?

标签: jsf jsf-2 datatable primefaces managed-bean


【解决方案1】:

ActionListener 方法(像您一样用于actionListener 属性)必须采用ActionEvent 参数和void 返回类型。如果要保留方法签名,请删除命令按钮上的 actionListener 属性并使用 action 属性。但是,如果您需要在按钮上触发事件时立即处理事件,则必须更改方法签名以实现 ActionListener interface

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-04-30
    • 2013-02-06
    • 2011-01-12
    • 1970-01-01
    • 1970-01-01
    • 2011-07-09
    相关资源
    最近更新 更多