0

履歴管理で構成される小さなログインアプリケーションを実行している場合、最新のchromeおよびfirefoxバージョンとGWT2.4を使用している自宅で正常に動作します。

私が自分のオフィスで実行しているときの同じアプリケーションは、うまく機能します。デバッグモードでは正しい値を持ち、通常の実行では間違った値を持つグローバル静的ブ​​ール変数を使用しました。IE7とGWT2.2を使用するOfficeImで

また、onModuleLoad()は、自宅の環境では1回だけ呼び出されますが、someURL#sometokenと入力し、Enterキーを押して内部ページを変更すると、毎回呼び出されます。onModuleLoad()が呼び出されたとき。セッションごとに1回だけ、またはevrytimeユーザーがページ(またはトークン)をロードしますか?

これはIE7またはGWT2.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);
        }           
    }
}

Login.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);
    }
}

Deposit.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()は一度だけ呼び出されます)が、私は自分の内部ページを開くために毎回ログインする必要がありますoffice(およびonModuleLoad()はevrytimeと呼ばれます)

4

2 に答える 2

1

onModuleLoadページが読み込まれたときに呼び出されますが、次のようになります。

  • アドレスバーで Enter キーを押すと、一部のブラウザでページがリロードされる場合があります
  • アプリケーションの外部から URLのハッシュを変更すると(アドレス バーに入力するか、ブックマークを使用して)、IE6/7 が混乱する可能性があります。GWT がそれを検出すると、ページをリロードします (クラス内を見てください)。履歴をナビゲートするときは発生しないことに注意してください(これが非表示の目的です)HistoryImplIE6iframe
于 2011-12-21T17:00:37.083 に答える
0

HTML ホスト ページの gwt で履歴をサポートするための非表示の iframe を含めましたか?

http://code.google.com/intl/de-DE/webtoolkit/doc/latest/DevGuideCodingBasicsHistory.html#mechanismを参照してください。

于 2011-12-21T15:02:42.553 に答える