путаница при запуске приложения GWT с небольшой историей

Когда я запускаю небольшое приложение для входа в систему, состоящее из управления историей, оно отлично работает у меня дома, где я использую последние версии Chrome и Firefox и GWT 2.4.

То же самое приложение, когда я запускаю его в своем офисе, работает дико. Я использовал глобальную статическую логическую переменную, которая имеет правильное значение в режиме отладки, но неправильное значение при обычном запуске. В Office я использую IE 7 и GWT 2.2

Кроме того, onModuleLoad() вызывается только один раз в моей домашней среде, тогда как он вызывается каждый раз, когда я набираю someURL#sometoken и нажимаю ввод, чтобы изменить внутреннюю страницу. Когда вызывается onModuleLoad(). Только один раз за сеанс или каждый раз пользователь загружает какую-либо страницу (или даже токен)?

Кто-нибудь может сказать, это какая-то проблема из-за IE 7 или GWT 2.2 или какой-то другой проблемы.

РЕДАКТИРОВАТЬ. Это очень маленькое приложение. Код ---

TestHistory.java

public class TestHistory implements EntryPoint, ValueChangeHandler<String> {

    static boolean isLoggedIn = false;
    static final String PAGENAME = "mainscreen";
    public void onModuleLoad()
    {
        History.addValueChangeHandler(this);

        String startToken = History.getToken();
        System.out.println("onModuleLoad Called..... start token= -------"+startToken+"--------");
        if(startToken.isEmpty())
            History.newItem("login");
        else
            History.fireCurrentHistoryState(); //to execute onValueChange 1st time since 1st time history is not setup
    }

    @Override
    public void onValueChange(ValueChangeEvent<String> event) {

        String token = event.getValue();
        System.out.println("onValueChange called with token = ***"+token+"***");

        String args = "";
        int question = token.indexOf("?");
        if (question != -1) {
        args = token.substring(question + 1);
        token = token.substring(0, question);
        }

        if(!isLoggedIn)
        {
            if(token.isEmpty() || "login".equals(token))    //1st time opened the site normally
                new Login().display(false, RootPanel.get());
            else {
                new Login().display(true, RootPanel.get());
            }
        }
        else    //User has logged in
        {
            if(token.isEmpty() || "login".equals(token))
            {
                if(isLoggedIn)
                    Window.alert("Ur already logged in!!!");
                else
                    new Login().display(false, RootPanel.get());
            }
            else if("withdraw".equals(token))
                new Withdraw().display(RootPanel.get(), args);
            else if("deposit".equals(token))
                new Deposit().display(RootPanel.get(), args);
            else //token not clear
                Window.alert("Unrecognized token=" + token);
        }           
    }
}

Логин.java

public class Login {
    static final String PAGENAME = "login";
    void display(final boolean hasTypedSomeToken,final Panel myPanel) //Process login
    {
        System.out.println("login display called");
        Label displayLabel = new Label("This is the Login Page");
        Label enterName = new Label("Enter ur name");
        final TextBox txtName = new TextBox();
        Label enterPasswd = new Label("Enter ur Passwd");
        final TextBox txtPasswd = new TextBox();
        Button btnLogIn = new Button("Login", new ClickHandler() {

            @Override
            public void onClick(ClickEvent event) {

                /* Real app will check DB. Here we r jst chckng d txt fields hv value */
                if(txtName.getValue().length()>0 && txtPasswd.getValue().length()>0)
                {
                    TestHistory.isLoggedIn = true;
                    if(hasTypedSomeToken) {
                        System.out.println("adsljasdlfjljkfsd");
                        History.fireCurrentHistoryState();
                        System.out.println("hoolala  "+History.getToken());
                    }
                    else
                    {
                        myPanel.clear();
                        Label displayLabel = new Label("Thank U for logging. U can now access the application.");
                        myPanel.add(displayLabel);
                    }
                }   
            }
        });         
        myPanel.clear();
        myPanel.add(displayLabel);
        myPanel.add(enterName);
        myPanel.add(txtName);
        myPanel.add(enterPasswd);
        myPanel.add(txtPasswd);
        myPanel.add(btnLogIn);
    }
}

Депозит.java

public class Deposit {
    static final String PAGENAME = "deposit";
    void display(Panel myPanel, String param)
    {
        System.out.println("deposit display called");
        myPanel.clear();
        Label displayLabel = new Label("This is the Deposit Page & ur parameter = "+param+")");
        myPanel.add(displayLabel);
    }   
}

Вывод средств по классу аналогичен депозиту. Проблема, с которой я столкнулся, заключается в том, что после входа в систему я должен иметь возможность открывать все внутренние страницы, которые отлично работают у меня дома (и onModuleLoad() вызывается только один раз), тогда как мне приходится каждый раз входить в систему, чтобы открыть внутреннюю страницу в моем доме. офис (и onModuleLoad() вызывается evrytime)


person abhihello123    schedule 21.12.2011    source источник
comment
можете ли вы опубликовать соответствующий код для этого, потому что это не похоже на простую ошибку установки   -  person Daniel Kurka    schedule 21.12.2011


Ответы (2)


onModuleLoad вызывается при загрузке страницы, но:

  • нажатие клавиши ввода в адресной строке может перезагрузить страницу в некоторых браузерах
  • изменение хэша в URL-адресе вне приложения (ввод в адресной строке или с помощью закладки) может привести к путанице в IE6/7; когда GWT обнаруживает это, он перезагружает страницу (загляните внутрь класса HistoryImplIE6). Обратите внимание, что этого не происходит при навигации по истории (для этого и нужен скрытый iframe)
person Thomas Broyer    schedule 21.12.2011
comment
+1 за объяснение, и да, во время навигации этого не происходит! - person abhihello123; 21.12.2011
comment
Я оставил свой ручной ввод в адресной строке. И использовали гиперссылки, как в реальном приложении, и во всех случаях это работало нормально. Большое спасибо, Томас Бройер! - person abhihello123; 22.12.2011

Вы включили скрытый iframe для поддержки истории в gwt на своей главной странице html?

См. http://code.google.com/intl/de-DE/webtoolkit/doc/latest/DevGuideCodingBasicsHistory.html#mechanism

person Daniel Kurka    schedule 21.12.2011
comment
да в обоих случаях ‹iframe src=javascript:'' id=__gwt_historyFrame tabIndex='-1' style=position: absolute; ширина: 0; высота: 0; граница: 0› ‹/iframe› в html-файле - person abhihello123; 21.12.2011