2011-12-20 1 views
-1

나는 데이터베이스에 사용자를 입력하는 간단한 응용 프로그램을 작성하고있다 & Eclipse에서 GWT RPC, Hibernate를 사용하는 사용자의 표시 목록. 내가 얻는 문제는 사용자 목록이 두 번 인쇄된다는 것입니다.GWT RPC - 데이터베이스 결과가 두 번 인쇄되는 이유는 무엇입니까?

여기에 삽입 코드 & 사용자 목록 메서드를 삽입하는 코드입니다.

package rpctest.client; 

import java.util.ArrayList; 

import rpctest.shared.User; 
import rpctest.shared.FieldVerifier; 
import com.google.gwt.core.client.EntryPoint; 
import com.google.gwt.core.client.GWT; 
import com.google.gwt.event.dom.client.ClickEvent; 
import com.google.gwt.event.dom.client.ClickHandler; 
import com.google.gwt.event.dom.client.KeyCodes; 
import com.google.gwt.event.dom.client.KeyPressEvent; 
import com.google.gwt.event.dom.client.KeyUpEvent; 
import com.google.gwt.event.dom.client.KeyUpHandler; 
import com.google.gwt.user.client.Window; 
import com.google.gwt.user.client.rpc.AsyncCallback; 
import com.google.gwt.user.client.ui.Button; 
import com.google.gwt.user.client.ui.DialogBox; 
import com.google.gwt.user.client.ui.FlexTable; 
import com.google.gwt.user.client.ui.HTML; 
import com.google.gwt.user.client.ui.HorizontalPanel; 
import com.google.gwt.user.client.ui.Label; 
import com.google.gwt.user.client.ui.RootPanel; 
import com.google.gwt.user.client.ui.TextBox; 
import com.google.gwt.user.client.ui.VerticalPanel; 

import com.google.gwt.event.dom.client.KeyCodes; 
import com.google.gwt.event.dom.client.KeyPressEvent; 
import com.google.gwt.event.dom.client.KeyPressHandler; 

/** 
* Entry point classes define <code>onModuleLoad()</code>. 
*/ 
public class Rpctest implements EntryPoint { 

    final TextBox firstName = new TextBox(); 
    final TextBox lastName = new TextBox(); 
    final Button ans = new Button("Add User"); 
    //final Label label1 = new Label("First Name"); 
    //final Label label2 = new Label("Last Name"); 
    private FlexTable userFlexTable = new FlexTable(); 
    //final Label errorLabel = new Label(); 

    private VerticalPanel mainpanel = new VerticalPanel(); 
    private HorizontalPanel addpanel1 = new HorizontalPanel(); 
    private HorizontalPanel addpanel2 = new HorizontalPanel(); 
    private final RpctestServiceAsync callService = GWT 
      .create(RpctestService.class); 

    /** 
    * This is the entry point method. 
    */ 
    public void onModuleLoad() { 

     userFlexTable.setText(0, 0, "User ID"); 
     userFlexTable.setText(0, 1, "First Name"); 
     userFlexTable.setText(0, 2, "Second Name"); 
     userFlexTable.setText(0, 3, "Remove"); 

     //add input boxes to panel 
     addpanel1.add(firstName); 
     addpanel1.add(lastName); 

     firstName.setFocus(true); 

     //add input/result panels 
     mainpanel.add(userFlexTable); 
     mainpanel.add(addpanel1); 
     addpanel1.add(ans); 

     ans.addClickHandler(new ClickHandler() { 
      @Override 
      public void onClick(ClickEvent event) { 
         addStock();     
      } 
     }); 

     lastName.addKeyPressHandler(new KeyPressHandler() { 
       public void onKeyPress(KeyPressEvent event) { 
        if (event.getCharCode() == KeyCodes.KEY_ENTER) { 
         addStock(); 
        } 
       } 
       }); 

     RootPanel.get().add(mainpanel); 
     getUser(); 
    } 

private void addStock(){ 

     String name1 = firstName.getValue(); 
     // Stock code must be between 1 and 10 chars that are numbers, letters, or dots. 
     /*if (!name1.matches("^[0-9A-Z\\.]{1,10}$")) { 
      Window.alert("'" + name1 + "' is not a valid name."); 
      firstName.selectAll(); 
      return; 
     }*/ 
     firstName.setValue(""); 

     String name2 = lastName.getValue(); 
     /*if (!name2.matches("^[0-9A-Z\\.]{1,10}$")) { 
       Window.alert("'" + name1 + "' is not a valid name."); 
       lastName.selectAll(); 
       return; 
      }*/ 
     lastName.setValue(""); 
     firstName.setFocus(true); 

     callService.addUser(name1,name2, 
      new AsyncCallback<String>() { 
      public void onFailure(Throwable caught) { 
       // Show the RPC error message to the user 
        Window.alert("check your inputs"); 
       } 

      @Override 
      public void onSuccess(String result) { 
      // TODO Auto-generated method stub 
       // Add the user to the table. 
       // int row = userFlexTable.getRowCount(); 
       // userFlexTable.setText(row, 1, result); 
       getUser(); 
      } 
     }); 
    } 

private void getUser(){ 

    callService.getUser(new AsyncCallback<User[]>() { 
      public void onFailure(Throwable caught) { 
       // Show the RPC error message to the user 
        Window.alert("Problem in database connection"); 
       } 

      @Override 
      public void onSuccess(User[] result) { 
       // TODO Auto-generated method stub 
       for(int i = 0; i < result.length; i ++) 
        { 
        //String s = result[i].getFirstName();    
        int row = userFlexTable.getRowCount(); 
        userFlexTable.setText(row, 0, result[i].getId().toString()); 
        userFlexTable.setText(row, 1, result[i].getFirstName()); 
        userFlexTable.setText(row, 2, result[i].getLastName()); 
         }      

      } 
     }); 

     } 
} 
+0

데이터가 DB에서 고유합니까? 그리고 UI에서 동일한 ID를 두 번 본 것입니까? –

+0

예. 1,2,3,4 & 다시 1,2,3,4 – enterprize

+0

처럼 모든 값이 두 번 인쇄됩니다. 입력 한 마지막 값은 이전에 두 번 인쇄되었습니다. & 같은 방식으로 항상 모든 이전 두 번 & 마지막 한 번 – enterprize

답변

0

모든 새 항목마다 getUser가 호출됩니다. & 모든 데이터가 테이블에 다시 입력됩니다.

0

남자는 당신이 입력 한 이름이 유효하고 서비스에 대한 호출이 성공적인 경우 두 번 인 getUser를 호출하는 것을 알 수 않았다?

그 중 하나를 제거해야합니다!

+0

onModuleLoad가 두 번 호출되지 않는다고 생각하면 문제가 될 것이라고 생각하지 않습니다. getUser 호출을 onModuleLoad 메서드에 넣으면 UI가 앱 시작시 빌드 될 때 모든 데이터도 표시됩니다. & 나중에 insert 호출이 성공하면 getUser가 호출되고 테이블에 새 항목이 채워집니다. 이러한 호출 중 하나를 제거하면 하나의 기능이 중지됩니다. 사실 나는 getUser가 모든 새 항목에 호출되고 모든 데이터가 다시 테이블에 입력되는 이유를 발견했습니다. 매번 새로운 항목이있는 체크 및 채우기 플렉스 테이블을 넣어야합니다. 답변 해 주셔서 감사합니다. – enterprize

+0

네 말이 맞아. 죄송합니다. 전화가 걸린 곳을 알지 못했습니다. 해결책을 찾았습니다. –

관련 문제