2011-12-20 110 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

數據庫中數據是否唯一?在用戶界面中,你看到兩次相同的ID嗎? – 2011-12-20 01:10:37

+0

是的,所有的值都打印兩次,如1,2,3,4&再次1,2,3,4 – enterprize 2011-12-20 01:40:29

+0

我輸入的最後一個值打印一次,全部先前兩次。同樣的方式一直以前所有的前兩次和最後一次 – enterprize 2011-12-20 01:52:25

回答

0

getUser在每個新條目上被調用&所有數據都被重新輸入到表中。

0

如果輸入的名稱有效且對服務的調用成功,您是否注意到您正在調用getUser兩次?

你必須刪除其中的一個!

+0

我不認爲這是一個問題,因爲我認爲onModuleLoad不會被調用兩次。我將getUser調用放在onModuleLoad方法中,以便在應用程序啓動時構建UI時,還會顯示所有數據。 &稍後當插入調用成功時,再次調用getUser&table將填充新條目。刪除這些呼叫中的任何一個都會停止一個功能。其實我找到了原因,那就是getUser在每個新條目上都被調用,並且所有數據都會再次輸入到表中。我需要每次只用新條目檢查和填充Flex表。感謝您的答覆。 – enterprize 2011-12-20 17:49:39

+0

是的,你是對的。對不起我的壞,沒有注意到電話的位置。很好,你找到了一個解決方案 – 2011-12-21 09:00:08

相關問題