GWT Java rpc调用工作;但是,替换GWTBootstrap-rpc调用不起作用

GWT Java rpc调用工作;但是,替换GWTBootstrap-rpc调用不起作用,java,gwt,rpc,gwt-bootstrap,Java,Gwt,Rpc,Gwt Bootstrap,我刚刚开始使用bootstrap转换现有的GWT项目。原始rpc调用在以下代码中工作。但是,替换代码直接放在原始代码之后,触发时屏幕上会弹出“连接失败-请重试”。日志里什么也没有。窗口显示“返回正确的值”。我将在引导程序工作时替换原始代码 package org.AwardTracker.client; /** * The purpose of this View is to allow the account holder * to login to their account using

我刚刚开始使用bootstrap转换现有的GWT项目。原始rpc调用在以下代码中工作。但是,替换代码直接放在原始代码之后,触发时屏幕上会弹出“连接失败-请重试”。日志里什么也没有。窗口显示“返回正确的值”。我将在引导程序工作时替换原始代码

package org.AwardTracker.client;
/**
 * The purpose of this View is to allow the account holder
 * to login to their account using an Account Name and password.
 */

import com.google.gwt.user.client.ui.Composite;
import com.google.gwt.user.client.ui.RootPanel;
import com.google.gwt.user.client.ui.VerticalPanel;
import com.google.gwt.user.client.ui.Label;
import com.google.gwt.user.client.ui.FlexTable;
import com.google.gwt.user.client.ui.TextBox;
import com.google.gwt.user.client.ui.PasswordTextBox;
import com.google.gwt.user.client.ui.Button;
import com.google.gwt.core.client.GWT;
import com.google.gwt.dom.client.Document;
import com.google.gwt.event.dom.client.ClickHandler;
import com.google.gwt.event.dom.client.ClickEvent;
import com.google.gwt.event.logical.shared.AttachEvent;
import com.google.gwt.event.logical.shared.AttachEvent.Handler;
import com.google.gwt.user.client.History;
import com.google.gwt.user.client.Window;
import com.google.gwt.user.client.rpc.AsyncCallback;
import com.google.gwt.user.client.rpc.ServiceDefTarget;
import com.google.gwt.user.client.ui.HorizontalPanel;
import com.google.gwt.user.client.ui.HasHorizontalAlignment;
import com.google.gwt.user.client.ui.HasVerticalAlignment;

public class LoginView extends Composite {

    private DBConnectionAsync rpc;

    final VerticalPanel verticalPanel = new VerticalPanel();
    final HorizontalPanel horizontalPanel = new HorizontalPanel();
    final Label lblWelcomeToThe = new Label("Welcome to the Award Tracker login page.\r\n\r\nPlease Sign into your account.");
    final FlexTable flexTable = new FlexTable();
    final Label lblAccountName = new Label("*Account name:");
    final Label lblAccountName2 = new Label("(username (e.g., email))");
    final Label lblPassword = new Label("*Password:");

    private PasswordTextBox passwordTextBox;
    private TextBox textBoxAccountName;

    int loginAttempt = 0;
    public String youthMemberID = null;
    int youthMembersLinked = 0;

    public String accountID = null;
    public String accountLevel = null;
    public String scoutGroup = null;
    public String scoutGroupSection = null;

    public LoginView() {
        verticalPanel.addAttachHandler(new Handler() {
            public void onAttachOrDetach(AttachEvent event) {
                if (event.isAttached()) {

                    rpc = (DBConnectionAsync) GWT.create(DBConnection.class);
                    ServiceDefTarget target = (ServiceDefTarget) rpc;
                    String moduleRelativeURL = GWT.getModuleBaseURL() + "MySQLConnection";
                    target.setServiceEntryPoint(moduleRelativeURL);

                    //Display the login page

                    //This is the nice green background with the small Scout logo
                    verticalPanel.setStyleName("gwt-Scout-Background");
                    verticalPanel.setWidth("100%");
                    verticalPanel.setHeight("100%");
                    verticalPanel.setVerticalAlignment(HasVerticalAlignment.ALIGN_MIDDLE);
                    verticalPanel.setHorizontalAlignment(HasHorizontalAlignment.ALIGN_CENTER);
                    verticalPanel.setBorderWidth(0);

                    //This is the nice green background with the small Scout logo
                    horizontalPanel.setStyleName("gwt-Scout-Background");
                    horizontalPanel.setWidth("100%");
                    horizontalPanel.setHeight("100%");
                    horizontalPanel.setVerticalAlignment(HasVerticalAlignment.ALIGN_MIDDLE);
                    horizontalPanel.setHorizontalAlignment(HasHorizontalAlignment.ALIGN_CENTER);
                    verticalPanel.add(horizontalPanel);

                    //Display the welcome message
                    lblWelcomeToThe.setStyleName("gwt-Label-Login");
                    verticalPanel.add(lblWelcomeToThe);
                    lblWelcomeToThe.setWidth("321px");

                    verticalPanel.add(flexTable);
                    verticalPanel.setCellHorizontalAlignment(flexTable, HasHorizontalAlignment.ALIGN_CENTER);

                    //Display the Account Name text and text box
                    lblAccountName.setStyleName("gwt-Label-Login");
                    flexTable.setWidget(0, 0, lblAccountName);
                    //lblAccountName.setSize("110px", "16px");
                    flexTable.getCellFormatter().setHorizontalAlignment(0, 0, HasHorizontalAlignment.ALIGN_RIGHT);

                    textBoxAccountName = new TextBox();
                    flexTable.setWidget(0, 1, textBoxAccountName);
                    textBoxAccountName.setSize("155px", "20px");

                    //Display the Account Name hint
                    lblAccountName2.setStyleName("gwt-Label-Login");
                    flexTable.setWidget(0, 2, lblAccountName2);
                    //lblAccountName2.setSize("200px", "16px");
                    flexTable.getCellFormatter().setHorizontalAlignment(0, 2, HasHorizontalAlignment.ALIGN_LEFT);

                    //Display the password text and text box.
                    lblPassword.setStyleName("gwt-Label-Login");
                    flexTable.setWidget(1, 0, lblPassword);
                    //lblPassword.setSize("73px", "16px");
                    flexTable.getCellFormatter().setHorizontalAlignment(1, 0, HasHorizontalAlignment.ALIGN_RIGHT);

                    passwordTextBox = new PasswordTextBox();
                    flexTable.setWidget(1, 1, passwordTextBox);
                    passwordTextBox.setSize("155px", "20px");

                    //The following code will be replaced when the bootstrap code is working
                    //Display the sign in button and handle the click event
                    Button btnSignIn2 = new Button("Sign In");
                    btnSignIn2.addClickHandler(new ClickHandler() {
                        public void onClick(ClickEvent event) {
                            //Store whether details have been entered for error handling
                            //textBoxAccountName.setText("accountName");

                            Integer tracker = 0;
                            if (textBoxAccountName.getText().length() == 0) {
                                    tracker = tracker + 1;
                            }
                            if (passwordTextBox.getText().length() == 0) {
                                tracker = tracker + 2;
                            }

                            //Check if details have been entered and display an error if
                            //they have not been entered.
                            if (tracker == 1) {
                                textBoxAccountName.setStyleName("gwt-TextBox-Error");
                                passwordTextBox.setStyleName("gwt-TextBox");
                                Window.alert("Please enter your Account name.");
                                }else if (tracker == 2) {
                                    textBoxAccountName.setStyleName("gwt-TextBox");
                                    passwordTextBox.setStyleName("gwt-TextBox-Error");
                                    Window.alert("Please enter your Password.");
                                }else if (tracker == 3) {
                                    textBoxAccountName.setStyleName("gwt-TextBox-Error");
                                    passwordTextBox.setStyleName("gwt-TextBox-Error");
                                    Window.alert("Please enter your Account name and Password.");
                                }else {
                                    //If the required details have been entered then search the database for a match
                                    textBoxAccountName.setStyleName("gwt-TextBox");
                                    passwordTextBox.setStyleName("gwt-TextBox");
                                    AsyncCallback<AccountGroup> callback = new AuthenticationHandler<AccountGroup>();
                                    rpc.authenticateAccountGroup(textBoxAccountName.getText(), passwordTextBox.getText(), callback);
                                }
                        }   
                    });
                    flexTable.setWidget(3, 1, btnSignIn2);

                    //The following code is for bootstrap
                    RootPanel.get("payPalDonate");
                    RootPanel.get("payPalDonate").setVisible(true);
                    RootPanel.get("login"); //From bootstrap
                    RootPanel.get("login").setVisible(true);
                    Button btnSignIn = Button.wrap(Document.get().getElementById("submit")); //From bootstrap
                    final TextBox textBoxAccountName = TextBox.wrap(Document.get().getElementById("accountName")); //From bootstrap
                    final PasswordTextBox passwordTextBox = PasswordTextBox.wrap(Document.get().getElementById("enterPassword")); //From bootstrap

                    //Display the sign in button and handle the click event
                    btnSignIn.addClickHandler(new ClickHandler() {
                        public void onClick(ClickEvent event) {
                            //Store whether details have been entered for error handling

                            Integer tracker = 0;
                            if (textBoxAccountName.getText().length() == 0) {
                                    tracker = tracker + 1;
                            }
                            if (passwordTextBox.getText().length() == 0) {
                                tracker = tracker + 2;
                            }

                            //Check if details have been entered and display an error if
                            //they have not been entered.
                            if (tracker == 1) {
                                textBoxAccountName.setStyleName("gwt-TextBox-Error");
                                passwordTextBox.setStyleName("gwt-TextBox");
                                Window.alert("Please enter your Account name.");
                                }else if (tracker == 2) {
                                    textBoxAccountName.setStyleName("gwt-TextBox");
                                    passwordTextBox.setStyleName("gwt-TextBox-Error");
                                    Window.alert("Please enter your Password.");
                                }else if (tracker == 3) {
                                    textBoxAccountName.setStyleName("gwt-TextBox-Error");
                                    passwordTextBox.setStyleName("gwt-TextBox-Error");
                                    Window.alert("Please enter your Account name and Password.");
                                }else {
                                    //If the required details have been entered then search the database for a match
                                    textBoxAccountName.setStyleName("gwt-TextBox");
                                    passwordTextBox.setStyleName("gwt-TextBox");
                                    Window.alert("textBoxAccountName.getText() = " + textBoxAccountName.getText());
                                    Window.alert("passwordTextBox.getText() = " + passwordTextBox.getText());
                                    AsyncCallback<AccountGroup> callback = new AuthenticationHandler<AccountGroup>();
                                    rpc.authenticateAccountGroup(textBoxAccountName.getText(), passwordTextBox.getText(), callback);
                                }
                        }   
                    });
                }
            }
        });
        initWidget(verticalPanel);

    }

    class AuthenticationHandler<T> implements AsyncCallback<AccountGroup> {
        public void onFailure(Throwable ex) {
            System.out.println("RPC call failed - AuthenticationHandler - Notify Administrator.");
            Window.alert("Connection failed - please retry.");
        }
        public void onSuccess(AccountGroup result) {
            AccountGroup account = result;
            if (account == null) {
                //Only three invalid login attempts are allowed. Disable the account after
                //three invalid login attempts. 
                if (loginAttempt > 2){
                    AsyncCallback<Void> callback = new DisableHandler<Void>();
                    rpc.disableAccount(textBoxAccountName.getText(), 0, callback);
                }else{
                    Window.alert("Incorrect Account name or Password entered. Please try again.");
                }
            }else{
                if (account.getLevel() == null) {
                    Window.alert("Your account has not yet been set up. Please contact your administrator.");
                }else{
                    if (account.getArchived() != null) {
                        Window.alert("Your account has been archived. Please contact your administrator.");
                    }else{
                        if (account.getEnabled() == 1){
                            accountLevel = account.getLevel();
                            accountID = account.getAccountId();
                            scoutGroup = account.getScoutGroupId();
                            scoutGroupSection = account.getGroupSection();

                            //Is a Leader or Administrator.
                            //Store the LoginView data for use in subsequent Views.
                            AsyncCallback<ViewData> callback2 = new ViewDataStoreHandler<ViewData>();
                            rpc.setViewData(account.getAccountId(), account.getLevel(), null, null, null,
                                    scoutGroup, null, 0, scoutGroupSection, null, null, callback2);                         
                        }else{
                            //The account has had three or more invalid passwords entered and has been disabled.
                            Window.alert("Account is disabled. Please contact your administrator.");
                        }
                    }
                }
            }
        }
    }

    class ViewDataStoreHandler<T> implements AsyncCallback<ViewData> {

        public void onFailure(Throwable ex) {
            System.out.println("RPC call failed - ViewDataStoreHandler - Notify Administrator.");
            Window.alert("Connection failed - please retry.");
        }
        public void onSuccess(ViewData result) {
            //The details have been stored
            RootPanel.get("payPalDonate").setVisible(false);
            RootPanel.get("payPalDonate").clear();
            RootPanel.get("login").setVisible(false);
            RootPanel.get("login").clear();

            History.newItem("selectPerson", true);
        }
    }


    class DisableHandler<T> implements AsyncCallback<Void> {
        public void onFailure(Throwable ex) {
            System.out.println("RPC call failed - DisableHandler - Notify Administrator.");
            Window.alert("Connection failed - please retry.");
        }
        public void onSuccess(Void result) {
            Window.alert("You have exceeded your password tries and your Account has been disabled. Please contact your administrator.");
        }
    }

}
如果帐户不正确(即未使用BCrypt),则不会返回错误。但是,当使用BCrypt时(即,无论密码是否正确,帐户都是正确的),将返回一个错误代码(Throwable value=com.google.gwt.user.client.rpc.StatusCodeException:0)

然后我发现:

我发现如果在服务器上挂起rpc调用(Thread.wait())浏览器被刷新,然后在客户端再次加载页面之前,它将使用上述状态代码调用等待回调的onFailure方法,这表明它在客户端中生成,或者它是非特定捕获异常的一般错误代码


我的浏览器正在刷新!所以现在的问题是如何停止刷新?

经过大量调查,我发现问题不在于Java代码。当您从gwtBootstrap中的表单返回数据时,if刷新并返回“Throwable value=com.google.gwt.user.client.rpc.StatusCodeException:0”,该值在GWTJava中作为错误代码提取。因此,不要在HTML中使用表单use div。完整的解释和解决方案位于

Hi-Glyn,我相信连接失败-请重试。消息显示在
AuthenticationHandler
回调中,但您没有显示其代码。还不清楚哪些元素来自引导。你能提供一个吗?好的,所以代码会点击
窗口。警报(“连接失败-请重试”)
onFailure()。它位于
AuthenticationHandler
ViewDataStoreHandler
DisableHandler
中。你能检查一下可丢弃的
值吗?嗨,亚当,它在AuthenticationHandler中。我在“public void on failure(Throwable ex){”下添加了“Window.alert(“Throwable value=“+ex”);”,结果是“Throwable value=com.google.gwt.user.client.rpc.StatusCodeException:0”。您好,我读到:。我想这可能与最后一条评论有关“我发现,如果您在服务器上挂起rpc调用(Thread.wait())然后在客户端刷新浏览器,在再次加载页面之前,它将调用onFailure方法“因为页面确实刷新,并且我输入的数据不会显示。我接下来要解决这个问题。听起来我可能需要先处理刷新。顺序是:我输入详细信息;单击“登录”;详细信息通过Window.alert显示;异常通过Window.alert显示;屏幕刷新(不再显示我输入的详细信息)。
    if (stored_hash == null){
        System.out.println("Incorrect account.");
        account = null;
    }else{
        //Check that the hashed value of the password equals the stored hashed value
        //If it does not then account will be set to null.
        if (BCrypt.checkpw(pass, stored_hash))  {
            System.out.println("Success!");
        }else{
            System.out.println("Incorrect password.");
            account = null;
        }
    }
    //Done
    return account;