GWT RPC - 为啥来自数据库的结果被打印两次?

Posted

技术标签:

【中文标题】GWT RPC - 为啥来自数据库的结果被打印两次?【英文标题】:GWT RPC - Why the results from database are printed twice ?GWT RPC - 为什么来自数据库的结果被打印两次? 【发布时间】:2011-12-20 01:02:22 【问题描述】:

我正在编写一个简单的应用程序来将用户输入数据库并使用 GWT RPC、Eclipse 中的 Hibernate 显示用户列表。我遇到的问题是用户列表被打印了两次。

这是我调用插入用户和显示用户列表方法的代码。

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());
                                               

            
        );

      

【问题讨论】:

数据库中的数据是否唯一?在 UI 中,您是否两次看到相同的 ID? 是的,所有值都打印两次,例如 1,2,3,4 和再次打印 1,2,3,4 我输入的最后一个值被打印一次,之前都是两次。 & 一直以同样的方式前两次和最后一次 【参考方案1】:

您是否注意到如果输入的名称有效并且调用服务成功,您会调用 getUser 两次??

你必须删除其中一个!

【讨论】:

我认为这不是问题,因为我认为 onModuleLoad 不会被调用两次。我将 getUser 调用放在 onModuleLoad 方法中,以便在应用程序启动时构建 UI 时,它也会显示所有数据。 & 稍后当插入调用成功时,再次调用 getUser 并用新条目填充表。删除其中任何一个调用都会停止一个函数。实际上,我找到了原因,即在每个新条目上都会调用 getUser,并且所有数据都再次输入到表中。我只需要每次检查并用新条目填充弹性表。感谢您的回复。 是的,你是对的。对不起,我的错,没有注意到电话的位置。很高兴您找到了解决方案【参考方案2】:

getUser 在每个新条目上都会被调用,所有数据都会再次输入到表中。

【讨论】:

以上是关于GWT RPC - 为啥来自数据库的结果被打印两次?的主要内容,如果未能解决你的问题,请参考以下文章

GWT:客户端过程和 rpc 请求总是被多次调用,具有多个线程 id

真的很奇怪 GWT RPC 行为 + 显示

来自 GWT 的 RPC 调用中的异常

为啥 GWT RPC 需要同步接口?

尝试在来自 GWT-RPC 项目的 Tomcat 7 上部署战争

GWT RPC 未生成正确的 gwt.rpc 文件