GWT - многие классы не поддерживаются, но все еще работают - PullRequest
1 голос
/ 17 ноября 2010

Я делаю свое собственное приложение, используя GWT framework. Я говорю, что многие Class не поддерживаются (например, Calendar, Connection, Statement, 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);
    }
}

прямо сейчас, под вы можете увидеть асинхронный вызов, где (как вы сказали) я могу поместить все виды серверных вызовов (база данных, набор результатов, оператор, 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();
    }
}

Если я хорошо понимаю, я не могу вызывать функции базы данных при загрузке профиля (потому что это клиентский класс).

Итак, как я могу это исправить? Я делаю асинхронный вызов при загрузке профиля?

Ответы [ 2 ]

3 голосов
/ 17 ноября 2010

Во-первых, вы можете добавить их в свой код, и в вашей IDE не возникнет никаких проблем, а во-вторых, ваше приложение может компилироваться и выполняться как приложение GWT.

Ознакомьтесь с RefJREEmulation документацией.

2 голосов
/ 17 ноября 2010

Сначала пара указателей.

  1. Никогда не включайте ничего в * .server в классе в * .client.
  2. Противоположность вышесказанному также правда: никогда не включайте ничего в * .client в классе в * .server.
  3. Конечные точки сервера gwt rpc's находятся в * .server и заканчиваются на Impl. Они могут делать вещи на сервере.
  4. Конечные точки клиента gwt rpc's находятся в * .client, и один из них заканчивается в асинхронном. Другой не добавляется с чем угодно. Эти двое файлы являются интерфейсами, и, следовательно, не иметь логики.

замените callCheckLogin в PageMenuLogin следующим текстом:

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");
                                }
                            }
                        });
            }
        });
    }

заменить 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);

Если у вас нет ни одного из последних двух классов, дайте мне знать, и мы вернемся на пару шагов.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...