2014-01-20 43 views
1

這是我再次,ActionListener與ViewScope無法正常工作?

我有這個麻煩,因爲開關使用actionactionListener。這是一個奇怪的麻煩,我不知道它爲什麼發生。

當我試圖從PrimeFaces數據表中刪除一個項目,我會得到NullPointerException。但是,如果我先編輯該項目然後回來刪除,它會好的!?

我使用actionListener在JSF中使用Ajax。當我採取行動時,它仍然正常工作。

JSF頁面

<p:commandButton id="editButton" icon="ui-icon-pencil" 
       value="#{appBundle.Edit}" 
       action="detail.xhtml?faces-redirect=true"> 
    <f:setPropertyActionListener value="#{a}" 
           target="#{academicManagedBean.academicSelected}"/> 
</p:commandButton> 
<p:commandButton id="deleteButton" icon="ui-icon-trash" 
       value="#{appBundle.Delete}" 
       actionListener="#{academicManagedBean.delete}" 
       update=":growl,datalist"> 
    <p:confirm header="Confirmation" message="Are you sure?" icon="ui-icon-alert" /> 
    <f:setPropertyActionListener value="#{a}" 
           target="#{academicManagedBean.academicSelected}" /> 
</p:commandButton> 
<p:confirmDialog global="true" showEffect="fade" hideEffect="explode"> 
    <p:commandButton value="Yes" type="button" 
        styleClass="ui-confirmdialog-yes" icon="ui-icon-check"/> 
    <p:commandButton value="No" type="button" 
        styleClass="ui-confirmdialog-no" icon="ui-icon-close"/>  
</p:confirmDialog> 

Managed Bean的類

@ManagedBean 
@ViewScoped 
public class AcademicManagedBean extends TblAcademic implements Serializable { 

    private List<TblAcademic> all; 
    private static TblAcademic academicSelected; 

    public AcademicManagedBean() { 
     super(); 
    } 

    public List<TblAcademic> getAll() { 
     try { 
      all = new com.rdb.bll.AcademicBLL().getAll(); 
      return all; 
     } catch (Exception ex) { 
      Logger.getLogger(AcademicManagedBean.class.getName()).log(Level.SEVERE, null, ex); 
      return null; 
     } 
    } 

    public void add(ActionEvent actionEvent) throws Exception { 
     boolean check = new com.rdb.bll.AcademicBLL().add(this); 
     if (check) { 
      JsfUtil.addSuccessMessage("Congratulation, new student has been added successfully!"); 
     } else { 
      JsfUtil.addErrorMessage(ResourceBundle.getBundle("com.rdb.service.AppBundle").getString("PersistenceErrorOccured")); 
     } 
    } 

    public void update(ActionEvent actionEvent) throws Exception { 
     boolean check = new com.rdb.bll.AcademicBLL().update(AcademicManagedBean.academicSelected); 
     if (check) { 
      JsfUtil.addSuccessMessage("Congratulation, student has been updated successfully!"); 
     } else { 
      JsfUtil.addErrorMessage(ResourceBundle.getBundle("com.rdb.service.AppBundle").getString("PersistenceErrorOccured")); 
     } 
    } 

    public void delete(ActionEvent actionEvent) throws Exception { 
     boolean check = new com.rdb.bll.AcademicBLL().delete(AcademicManagedBean.academicSelected); 
     if (check) { 
      JsfUtil.addSuccessMessage("Congratulation, student has been deleted successfully!"); 
     } else { 
      JsfUtil.addErrorMessage(ResourceBundle.getBundle("com.rdb.service.AppBundle").getString("PersistenceErrorOccured")); 
     } 
    } 

    public String studentDetail() { 
     TblStudent std = new com.rdb.bll.StudentBLL().getById(AcademicManagedBean.academicSelected.getStudentRollNo()); 
     new StudentManagedBean().setStudentSelected(std); 

     return "/backend/student/detail.xhtml?faces-redirect=true"; 
    } 

    public String getClassNameById(int classId) { 
     TblClass objClass = new com.rdb.bll.ClassBLL().getById(classId); 
     return objClass.getClassName(); 
    } 

    public TblAcademic getAcademicSelected() { 
     return academicSelected; 
    } 

    public void setAcademicSelected(TblAcademic academicSelected) { 
     AcademicManagedBean.academicSelected = academicSelected; 
    } 

難道我做錯什麼?請幫助我使其正確,謝謝。

回答

2
<p:commandButton id="deleteButton" icon="ui-icon-trash" 
       value="#{appBundle.Delete}" 
       actionListener="#{academicManagedBean.delete}" 
       update=":growl,datalist"> 
    <p:confirm header="Confirmation" message="Are you sure?" icon="ui-icon-alert" /> 
    <f:setPropertyActionListener value="#{a}" 
           target="#{academicManagedBean.academicSelected}" /> 
</p:commandButton> 

您正在執行刪除actionListener方法而不是操作方法。這個不對。業務行爲應該在action方法中執行。所有動作listeners,包括<f:setPropertyActionListener>,都在action方法之前以與在命令組件上聲明和分配的順序相同的順序被調用。因此,在效果中,首先調用刪除,然後設置屬性。這就解釋了爲什麼在刪除過程中該屬性爲空。

修復的方法是簡單的:使之成爲真正的操作方法:

<p:commandButton id="deleteButton" icon="ui-icon-trash" 
       value="#{appBundle.Delete}" 
       action="#{academicManagedBean.delete}" 
       update=":growl,datalist"> 
    <p:confirm header="Confirmation" message="Are you sure?" icon="ui-icon-alert" /> 
    <f:setPropertyActionListener value="#{a}" 
           target="#{academicManagedBean.academicSelected}" /> 
</p:commandButton> 

不要忘了刪除動作事件的說法:

public void delete() { 
    // ... 
} 

這是從回答中提取發表JSF大師Balcus這裏Posted by JSF Guru

+0

我不明白。在詳細信息頁面或添加新頁面中,我也使用'actionListener',它仍然正常工作。總之,你的解決方案解決了我的問題。謝謝。 –

+0

如果它有幫助,然後接受這個答案。 – Makky