2013-06-03 3 views
0
<p:column headerText="Cancel" width="60">  
    <p:commandLink actionListener="#{userLeaveBean.cancelForLeave}" title="Cancel Request" process="@this" update="leaveDataTable" disabled="false"> 
    <h:graphicImage url="resources/images/cancel.gif"/> 
     <f:attribute name="userId" value="#{employee.name}"/> 
     <f:attribute name="leaveId" value="#{leaveDetails.strLeaveId}"/> 
</p:commandLink></p:column> 

안녕하세요이 코드를 작성하여 데이터 테이블의 행 값을 수정했습니다. 나는 이미지 버튼을 클릭하면데이터 테이블 값 편집 추가 행 추가

는이 값을 수정
public void cancelForLeave(ActionEvent actionEvent){ 

    String userId = (String)actionEvent.getComponent().getAttributes().get("userId"); 
    String leaveId = (String)actionEvent.getComponent().getAttributes().get("leaveId"); 
    int currentYear = Calendar.getInstance().get(Calendar.YEAR); 
    ConnectLdap connectLdap = new ConnectLdap(); 
    UserTotalLeaveInfoBean userTotalLeaveInfoBean = connectLdap.getUserLeaveBean(""+currentYear, userId); 

    if(userTotalLeaveInfoBean != null){ 

     UserGeneralLeaveDetailsBean[] userGeneralLeaveDetailsBean = userTotalLeaveInfoBean.getArrUserGeneralLeaveDetailsBean(); 
     if(userGeneralLeaveDetailsBean != null){ 
      for(int i=0;i<userGeneralLeaveDetailsBean.length;i++){ 

       String beanLeaveId = userGeneralLeaveDetailsBean[i].getStrLeaveId(); 
       if(leaveId.trim().equalsIgnoreCase(beanLeaveId)){ 

        if(userGeneralLeaveDetailsBean[i].getStrLeaveStatus().trim().equalsIgnoreCase(LeaveStatus.LVST_APPLIED)){ 
         userGeneralLeaveDetailsBean[i].setStrLeaveStatus(LeaveStatus.LVST_CANCELED); 
        }if(userGeneralLeaveDetailsBean[i].getStrLeaveStatus().trim().equalsIgnoreCase(LeaveStatus.LVST_APPROVED)){ 
         userGeneralLeaveDetailsBean[i].setStrLeaveStatus(LeaveStatus.LVST_CANCELREQ); 
        } 
        userTotalLeaveInfoBean.setArrUserGeneralLeaveDetailsBean(userGeneralLeaveDetailsBean); 
        connectLdap.addAppliedLeaveInLdap(userTotalLeaveInfoBean, ""+currentYear, userId); 
        leaveDetails.add(userGeneralLeaveDetailsBean[i]); 
       } 
      } 
     } 
    } 

} 

private List<UserGeneralLeaveDetailsBean> leaveDetails; 
//Getter and Setter 

이제 문제가되는 것을 'cancelForLeave'라는 이름 호출 된 방법은 다음과 같이 데이터 책상에서 방법의 행 값의 세부 사항이 수정 행에 대해 수정 된 값과 함께 데이터 테이블에 추가 행을 추가합니다. 그러나 로그 아웃 한 다음 다시 로그인하면 여분의 행이없고 수정하려고 시도한 행이 수정 된 값으로 표시됩니다.

데이터 테이블 행의 값 변경을 시도하면서 실행시 추가 행을 방지하기 위해 수행해야하는 작업은 무엇입니까?

I 얻을 로그 세부 사항을 다음

Monday, June 03, 2013 3:59:55 PM : Initiating ajax request. Monday, June 03, 2013 3:59:55 PM : Form to post applyLeaveForm. Monday, June 03, 2013 3:59:55 PM : URL to post /DemoApplication/applyLeave.xhtml. Monday, June 03, 2013 3:59:55 PM : Post Data:javax.faces.partial.ajax=true&javax.faces.source=applyLeaveForm%3AleaveDataTable%3A0%3Aj_idt90&javax.faces.partial.execute=applyLeaveForm%3AleaveDataTable%3A0%3Aj_idt90&javax.faces.partial.render=applyLeaveForm%3AleaveDataTable&applyLeaveForm%3AleaveDataTable%3A0%3Aj_idt90=applyLeaveForm%3AleaveDataTable%3A0%3Aj_idt90&applyLeaveForm=applyLeaveForm&applyLeaveForm%3AfromDate_input=&applyLeaveForm%3AtoDate_input=&applyLeaveForm%3Aj_idt59=morning&applyLeaveForm%3Aj_idt60=endofday&applyLeaveForm%3AleaveDataTable%3A0%3AeditFrom_input=03-Jun-2013&applyLeaveForm%3AleaveDataTable%3A0%3Aj_idt68=morning&applyLeaveForm%3AleaveDataTable%3A0%3AeditTo_input=04-Jun-2013&applyLeaveForm%3AleaveDataTable%3A0%3Aj_idt72=endofday&javax.faces.ViewState=-3803632482959899224%3A-5634910090194656061 Monday, June 03, 2013 3:59:55 PM : Response received succesfully. Monday, June 03, 2013 3:59:56 PM : DOM is updated. Monday, June 03, 2013 3:59:56 PM : Response completed.

답변

1

당신은 목록에 다시 수정 된 항목을 추가 할 필요가 없습니다 :

leaveDetails.add(userGeneralLeaveDetailsBean[i]); 
내가 페이지에서 로그인을 넣으면

이 줄을 제거해야하며 문제가 해결되어야합니다. 직전에 소스를 업데이트하고 있으며 현재보기에서만 추가 기능을 적용하므로 적절한 데이터를 새로 고치는 것이 그 이유입니다.

또한 콩은 @ViewScoped 또는 @SessionScoped 이상이어야합니다.