GWT - 许多类不受支持,但仍然有效

时间:2010-11-17 16:07:45

标签: gwt

我使用GWT框架制作自己的应用程序。我说许多类不受支持(如日历,连接,语句,DriverManager,ResultSet等),但我可以使用它(它们可以工作)。

这是正常的吗? :)它们应该被替换吗?

示例:

当应用程序启动时,它会加载一些带有一些按钮的FlowPanel。当我点击menu_login_button时,我会进行异步调用

package org.sinfonet.client;

public class PageMenuLogin extends FlowPanel {
    private PageCenter center;
    public PageMenuLogin(PageCenter center) {
        this.center=center;
        designLogin();
    }

    public void designLogin() {
        final InlineLabel menu_login_label1=new InlineLabel("Username");
        menu_login_label1.setStyleName("menu_span");
        this.add(menu_login_label1);
        final TextBox menu_login_input1 = new TextBox();
        menu_login_input1.setText("admin");
        this.add(menu_login_input1);
        final InlineLabel menu_login_label2=new InlineLabel("Password");
        menu_login_label2.setStyleName("menu_span");
        this.add(menu_login_label2);
        final TextBox menu_login_input2 = new TextBox();
        menu_login_input2.setText("pass");
        this.add(menu_login_input2);
        Button menu_login_button=new Button("Login");
        this.add(menu_login_button);

        PageMenuLogin.this.center.getContent().clear();
        PageMenuLogin.this.center.getContent().add(new TitleContent("Homepage"));
        PageMenuLogin.this.center.getContent().add(new Main());

        final AsyncCallback<java.lang.Boolean> callCheckLogin = new AsyncCallback<java.lang.Boolean>() {
            public void onSuccess(Boolean result) {
                if(result) {
                    designLogout(menu_login_input1.getText());
                } else {
                    menu_err.setText("Username e password non validi");
                }
            }

            public void onFailure(Throwable caught) {
                menu_login_label1.setText("Comunicazione Fallita");
            }
        };

        menu_login_button.addClickHandler(new ClickHandler(){
            public void onClick(ClickEvent event) {
                getService().checkLogin(menu_login_input1.getText(), menu_login_input2.getText(), callCheckLogin);
            }
        });
    }

    public void designLogout(String login_user) {
        PageMenuLogin.this.center.getContent().add(new Profile(login_user));
    }

    public static GWTServiceAsync getService() {
        return GWT.create(GWTService.class);
    }
}

现在,在你可以看到asynch调用,在哪里(如你所说)我可以放置各种服务器调用(数据库,结果集,语句,ecc)

package org.sinfonet.server;

public class GWTServiceImpl extends RemoteServiceServlet implements GWTService {
    public boolean checkLogin(String nickname, String password) {
        Database mydb=Configuration.getDatabase();
        mydb.connetti();

        // faccio md5 ed escape
        String log_check_user=nickname;
        String log_check_pass=password;

        // controllo che l'utente esista
        ArrayList<String[]> db_result=null;
        db_result=mydb.selectQuery("SELECT nickname FROM users WHERE nickname='"+log_check_user+"' AND password='"+log_check_pass+"'");
        if(db_result.size()!=0) {
            return true;
        }

        // sconnessione al database
        mydb.disconnetti();

        return false;
    }
}

如果函数返回true,我可以加载Profile类(客户端)。

package org.sinfonet.client.profile;

import com.google.gwt.user.client.ui.Button;
import com.google.gwt.user.client.ui.FlowPanel;
import com.google.gwt.user.client.ui.Image;
import com.google.gwt.user.client.ui.InlineLabel;
import com.google.gwt.user.client.ui.TextArea;
import com.google.gwt.user.client.ui.TextBox;
import org.sinfonet.server.mgmt.Configuration;
import org.sinfonet.server.mgmt.Database;

public class Profile extends FlowPanel {
    private String[] record;
    private String value;
    private TextBox field_1, field_2, field_3, field_4, field_5;
    private TextArea field_A;

    private FlowPanel profilo_1=new FlowPanel();
    private FlowPanel profilo_2=new FlowPanel();
    private FlowPanel profilo_3=new FlowPanel();
    private FlowPanel pm_inbox=new FlowPanel();
    private FlowPanel pm_outbox=new FlowPanel();
    private FlowPanel pm_button=new FlowPanel();

    public Profile(String value) {
        // memorizzo nome utente
        this.value=value;

        // imposto div principale
        this.setStyleName("content_span");
        profilo_1.setStyleName("profilo_1");
        profilo_2.setStyleName("profilo_2");
        profilo_3.setStyleName("profilo_3");
        pm_inbox.setStyleName("pm_cont1");
        pm_outbox.setStyleName("pm_cont2");
        pm_button.setStyleName("pm_but");
        this.add(profilo_1);
        this.add(profilo_2);
        this.add(profilo_3);
        designMainProfile();
    }

    public final void designMainProfile() {
        Database mydb=Configuration.getDatabase();

        mydb.connetti();
        mydb.disconnetti();
    }
}

如果我很好理解,我加载Profile时无法调用数据库函数(因为它是一个客户端类)。

那么,我该如何解决呢?我在加载个人资料时做了异步调用?

2 个答案:

答案 0 :(得分:3)

有一点是您可以将它们添加到您的代码中,而您的IDE不会显示任何问题,另一件事是您的应用程序可以编译并作为GWT应用程序执行。

查看RefJREEmulation文档。

答案 1 :(得分:2)

首先提出几点建议。

  1. 切勿在* .server中包含任何内容 在* .client。
  2. 的课程中
  3. 与上述相反的是 true:从不包含任何内容 *。客户端中的* .client。
  4. gwt rpc的服务器端点 在* .server中,以Impl结尾。 他们可以做服务器事情。
  5. gwt rpc的客户端点 在* .client中,其中一个 以Async结尾。另一个不是 附有任何东西。这两个 文件是接口,因此 没有逻辑。
  6. 使用以下内容替换PageMenuLogin中的callCheckLogin:

    public class PageMenuLogin extends FlowPanel {
    ...
      public void designLogin() {
            final InlineLabel menu_login_label1 = new InlineLabel("Username");
            menu_login_label1.setStyleName("menu_span");
            this.add(menu_login_label1);
            final TextBox menu_login_input1 = new TextBox();
            menu_login_input1.setText("admin");
            this.add(menu_login_input1);
            final InlineLabel menu_login_label2 = new InlineLabel("Password");
            menu_login_label2.setStyleName("menu_span");
            this.add(menu_login_label2);
            final TextBox menu_login_input2 = new TextBox();
            menu_login_input2.setText("pass");
            this.add(menu_login_input2);
            Button menu_login_button = new Button("Login");
            this.add(menu_login_button);
    
            this.center.getContent().clear();
            this.center.getContent().add(new TitleContent("Homepage"));
            this.center.getContent().add(new Main());
    
            menu_login_button.addClickHandler(new ClickHandler() {
                public void onClick(ClickEvent event) {
                    getService().checkLogin(menu_login_input1.getText(),
                            menu_login_input2.getText(),
                            new AsyncCallback<Boolean>() {
    
                                @Override
                                public void onFailure(Throwable caught) {
                                    menu_login_label1
                                            .setText("Comunicazione Fallita");
                                }
    
                                @Override
                                public void onSuccess(Boolean result) {
                                    if (result) {
                                        designLogout(menu_login_input1.getText());
                                    } else {
                                        menu_err.setText("Username e password non validi");
                                    }
                                }
                            });
                }
            });
        }
    

    使用以下内容替换Profile中的designMainProfile:

        public final void designMainProfile() {
    
            PageMenuLogin.getService().foo(new AsyncCallback<Void>() {
    
                @Override
                public void onFailure(Throwable caught) {
                    // TODO Auto-generated method stub
    
                }
    
                @Override
                public void onSuccess(Void result) {
                    // TODO Auto-generated method stub
    
                }
            });
    
        }
    

    在GWTServiceImpl中,添加以下内容:

    @Override
        public void foo() {
            Database mydb = Configuration.getDatabase();
    
            mydb.connetti();
            mydb.disconnetti();
    
        }
    

    在GWTService中,添加以下内容:

    void foo();
    

    在GWTServiceAsync中,添加以下内容:

    void foo(AsyncCallback<Void> asyncCallback);
    

    如果您没有最后两个班级中的任何一个,请告诉我们,我们将备份几个步骤。