如何记住GWT中的文本框输入历史记录

时间:2011-08-12 07:45:38

标签: gwt

我正在开发一个GWT Web应用程序。我有一个登录页面,其中包含一个用于用户名的文本框,一个用于密码的passwordtextbox和一个提交按钮。

现在我希望我的登录页面具有以下功能:当用户再次登录时,在用户名的文本框中,他可以找到以前的所有输入。

目前,我不知道如何做到这一点。我应该寻找什么?这个功能需要什么样的技术?

此功能的一个示例是登录hotmail。它可以记住您之前输入的电子邮件。我不需要我的应用程序来记住密码。

如果有人能给我一个例子,那就太好了。

提前致谢!

祝你好运

2 个答案:

答案 0 :(得分:1)

仅仅使用JS是不可能的。您必须为服务器端的文本输入输出HTML(以便浏览器解析的初始响应已包含字段),然后使用GWT对其进行操作。这是GWT邮件列表中类似response中的thread

  

我曾经做过一个做同样事情的项目。他们注意到了   密码记得迟到的东西(他们几乎忽略了它)和我   不得不解决这个问题。

     

经过一番研究后得出的结论是,最好的   保持登录过程尽可能“经典”。按经典我的意思是,   HTML不应该生成HTML,而是由服务器编写,   POST请求不应该通过Ajax发送,而是使用   正常形式请求。如果不这样做,结果会有所不同   跨浏览器(此列表来自内存):

     
      
  1. 除非将HTML视为HTML,否则任何浏览器都不会记住用户/通过组合   它解析页面。所以,没有JS生成表单元素。

  2.   
  3. 据我所知,Firefox是唯一提供该功能的浏览器   记住Ajax请求的密码对话框(启发式是相当的   聪明)。其他浏览器需要经典请求。

  4.   
  5. Chrome记忆密码对话框非常挑剔   仅在重定向后的第一页上显示。如果它发生了   成功登录后进行两次重定向,然后不显示任何对话框。   哦,页面的响应应该是2XX,但那就是   预期

  6.         

    我现在还记得很多其他问题。所以   我的建议是寻找经典的HTML表单/请求。你可以拥有   使用“display:none”形成,并在GWT代码加载后重新定位它   您可以在页面上的任何位置,甚至读取文本输入值和   用它们填充另一个表单元素。但是,正如我所说,提交   不应该通过JS来完成。

您可以更进一步,将登录页面作为经典HTML网页提供,只需在用户登录后,他/她就能看到GWT应用程序。

答案 1 :(得分:1)

我认为Cookies可以解决问题。顺便说一句,我注意到由于某种原因SuggestBox不支持添加鼠标或焦点处理程序,所以我在我的示例中使用了折旧的focusListener。这样做的正确方法是使用FocusPanel包装SuggestBox以捕获焦点事件。

public class LoginExample implements EntryPoint {

    static long forgetMeIn = 1000 * 60 * 60 * 24 * 365 * 30; //30 years
    MultiWordSuggestOracle oracle;
    SuggestBox suggestBox;
    Button loginButton;
    Button showCookieButton;

    public void onModuleLoad() {
        oracle = new MultiWordSuggestOracle();
        suggestBox = new SuggestBox(oracle);
        updateSuggestBox();
        suggestBox.addFocusListener(new FocusListener() {
            @Override
            public void onLostFocus(Widget sender) {
            }               
            @Override
            public void onFocus(Widget sender) {
                suggestBox.showSuggestionList();
            }
        });
        loginButton = new Button("Login");
        loginButton.addClickHandler(new ClickHandler() {
            @Override
            public void onClick(ClickEvent event) {
                String username = suggestBox.getValue();
                if (username!=null && !username.equals("") && !cookieContains(username)){
                    addToCookie(username);
                    suggestBox.setValue("");
                    updateSuggestBox();
                    Window.alert("Next time I will remember " + username);
                }
            }
        });
        showCookieButton = new Button("ShowCookie");
        showCookieButton.addClickHandler(new ClickHandler() {
            @Override
            public void onClick(ClickEvent event) {
                Window.alert(LoginExample.this.getUsernames().toString());
            }
        });
        RootPanel.get().add(suggestBox);
        RootPanel.get().add(loginButton);
        RootPanel.get().add(showCookieButton);
    }

    private boolean cookieContains(String s){
        boolean contains = false;
        String users = Cookies.getCookie("usernames");
        if (users!=null){
            for (String username : users.split(":")){
                if (username.equals(s))
                    contains= true;
            }
        }
        return contains;
    }
    private void addToCookie(String username){
        String users = Cookies.getCookie("usernames");
        if (users!=null)
            Cookies.setCookie("usernames", users+":"+username, new Date(new Date().getTime() + forgetMeIn));
        else
            Cookies.setCookie("usernames", username, new Date(new Date().getTime() + forgetMeIn));
    }
    private List<String> getUsernames(){
        ArrayList<String> usernames = new ArrayList<String>();
        String users = Cookies.getCookie("usernames");
        if (users!=null){
            for (String username : users.split(":")){
                usernames.add(username);
            }
        }
        return usernames;
    }

    private void updateSuggestBox(){
        oracle.clear();
        List<String> usernames = getUsernames();
        oracle.setDefaultSuggestionsFromText(usernames);
        for (String username : usernames){
            oracle.add(username);
        }
    }
}