2011-12-20 31 views
-1

我正在編寫一個簡單的應用程序來將用戶輸入數據庫&使用GWT RPC,Eclipse中的Hibernate顯示數據庫用戶列表。我遇到的問題是用戶列表在客戶端頁面上打印兩次。GWT RPC:如何檢查插入的重複值從數據庫到可伸縮

我發現的原因是,因爲每個新條目都會調用getUser方法(即打印列表),以便新條目可以填充到客戶端頁面上的FlexTable中,所以每次都填充所有條目。我怎樣才能進行檢查,以便在調用方法時只填充新條目。或者什麼可能是一個更好的方式來實現我想要做的事情。

這是我爲entryPoint代碼:

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, "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

我不能肯定這是否會工作或沒有,但有可能使用Session變量,然後應用基於會話狀態的邏輯?例如,第一次調用getUser()時,可以設置一個Session變量來指示它已被調用,然後可以執行邏輯以檢查在隨後調用中是否已設置Session變量。
種類大聲思考,但似乎使用會話狀態可能會有所幫助...

+0

非常感謝你Zack:我想有點相同的東西,但還沒有能夠找到一個邏輯,即代碼做到這一點..... – enterprize 2011-12-22 14:57:50