2012-09-08 3 views
0

primefaces 3.3을 사용하고 있습니다. 페이지에 3 개의 구성 요소가 있습니다. 데이터 테이블, 편집 영역, 명령 단추. 나는 이상한 문제가있다 : 페이지를 열면 데이터가 데이터 테이블에 표시되지만 버튼을 클릭하면 해당 버튼 코드가 ​​호출되지 않는다고 디버거가 제안한다. 그러나 테이블의 레코드를 클릭하면 편집 영역이 채워지고 버튼을 클릭하면 작업이 시작됩니다. 아래의 페이지 코드, 나는 1 개의 양식 등 모든 내용을 퍼팅, 다른 옵션을 시도, 아무도 작동합니다.JSF DataTable 명령 단추가 작동하지 않습니다.

<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; 
    }  

} 
+0

왜 버튼을위한 별도의 양식이 있습니까? –

답변

0

ActionListener 방법을 ActionEvent 매개 변수를 사용하고 void 반환 형식으로해야한다 (당신이 같은 actionListener 속성에 사용되는). 명령 단추에서 actionListener 특성을 제거하고 메서드 서명을 유지하려면 action 특성을 사용하십시오. 버튼에서 이벤트가 발생하면 바로 이벤트를 처리해야하므로 ActionListenerinterface을 충족하도록 메소드 서명을 변경해야합니다.

관련 문제