我使用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时无法调用数据库函数(因为它是一个客户端类)。
那么,我该如何解决呢?我在加载个人资料时做了异步调用?
答案 0 :(得分:3)
有一点是您可以将它们添加到您的代码中,而您的IDE不会显示任何问题,另一件事是您的应用程序可以编译并作为GWT应用程序执行。
查看RefJREEmulation文档。
答案 1 :(得分:2)
首先提出几点建议。
使用以下内容替换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);
如果您没有最后两个班级中的任何一个,请告诉我们,我们将备份几个步骤。