GWT1.7学习之后台传送pojo到前台页面.RPC调用
1,在GWT中可以直接将一个pojo对象由server传送到client.
比如:
一个序列化的User对象.是JDO保存到数据库的POJO.
注意:这个POJO必须放到client包下面.否则会有问题.
package com.i.web.desktop.client;
import javax.jdo.annotations.IdGeneratorStrategy;
import javax.jdo.annotations.IdentityType;
import javax.jdo.annotations.PersistenceCapable;
import javax.jdo.annotations.Persistent;
import javax.jdo.annotations.PrimaryKey;
import com.google.gwt.user.client.rpc.IsSerializable;
@PersistenceCapable(identityType = IdentityType.APPLICATION)
public class User implements IsSerializable
{
@PrimaryKey
@Persistent(valueStrategy = IdGeneratorStrategy.IDENTITY)
private Long id;/* 用户主键 */
@Persistent
private String userName;/* 用户名 */
@Persistent
private String loginName;/* 登录名 */
@Persistent
private String passwd;/* 密码. */
@Persistent
private String email;/* 电子邮件. */
public User(Long id, String userName, String loginName, String passwd,
String email) {
super();
this.id = id;
this.userName = userName;
this.loginName = loginName;
this.passwd = passwd;
this.email = email;
}
public User() {
}
/*省略getset方法.*/
}
这里要有默认的构造函数.
在client包下面.
并且要实现接口implements IsSerializable
这样才可以将这个序列化的对象传送到客户端.
2,这里可以传送的参数只有基本类型,基本类型的分装类.和实现序列化的类.
所以这里可以传入的参数没有List,Set之类的.虽然可以使用
/**
* @gwt.typeArgs <com.i.web.desktop.client.User>
*/
注释将返回的list类型设置下.但貌似还有点问题.调试成功.
所以就用了User[] 的数组进行list的传递.
代码也是要改下.
public User[] getAllUser() {
PersistenceManager pm = PMF.get().getPersistenceManager();
try {
javax.jdo.Query query = pm.newQuery(User.class);
List<User> results = (List<User>) query.execute("Smith");
User[] users = new User[results.size()];
results.toArray(users);
return users;
} catch (Exception e) {
e.printStackTrace();
return null;
} finally {
pm.close();
}
}
这里直接使用了一个List下面的方法results.toArray(users);将list转换成User[] 数组了.
这样测试是可以实验成功的.
final UserActionAsync userAction = GWT.create(UserAction.class);
userAction.getAllUser(new AsyncCallback<User[]>() {
public void onFailure(Throwable caught) {
// TODO Auto-generated method stub
}
public void onSuccess(User[] result) {
// TODO Auto-generated method stub
System.out.println("get size:"+result.length);
for (int j = 0; j < result.length; j++) {
System.out.print(result[j].getUserName());
System.out.print(result[j].getId()+"");
System.out.println(result[j].getPasswd());
}
}
});
在client进行调用.可以显示User[] 数组.
总结:
1,可以把一个JDO对象当作一个参数传从server传到client.
前提是这JDO对象在client包下.实现了IsSerializable 接口,有自己的构造函数.
2,没有能将List直接传到client.而是用List.toArray()转换之后在进行操作.
2在Client进行分层设计.
可以将页面变成一个一个小的面板.每一个面板里面都可以做为一个单独的类.
在这个单独的类里面进行操作.
比如在初始化页面:
调用登录面板:
public void onModuleLoad() {
System.out.println("系统加载的时候显示....");
LoginPanel loginPanel = new LoginPanel();
loginPanel.show();
loginPanel.center();
/*在ModuleLoad()方法调用的时候,初始化登录按钮.*/
登录面板是另一个java类.
import com.google.gwt.core.client.GWT;
import com.google.gwt.event.dom.client.ClickEvent;
import com.google.gwt.event.dom.client.ClickHandler;
import com.google.gwt.user.client.Window;
import com.google.gwt.user.client.rpc.AsyncCallback;
import com.google.gwt.user.client.ui.Button;
import com.google.gwt.user.client.ui.DialogBox;
import com.google.gwt.user.client.ui.Grid;
import com.google.gwt.user.client.ui.Label;
import com.google.gwt.user.client.ui.PasswordTextBox;
import com.google.gwt.user.client.ui.RootPanel;
import com.google.gwt.user.client.ui.TextBox;
public class LoginPanel extends DialogBox {
private final UserActionAsync userAction = GWT.create(UserAction.class);
public LoginPanel() {
setText("用户登录");
final Grid grid = new Grid(3, 3);
grid.setWidget(0, 0, new Label("登录名:"));
final TextBox loginName = new TextBox();
grid.setWidget(0, 1, loginName);
grid.setWidget(1, 0, new Label("密码:"));
final PasswordTextBox passwd = new PasswordTextBox();
grid.setWidget(1, 1, passwd);
final Button loginButton = new Button("登录", new ClickHandler() {
public void onClick(ClickEvent event) {
// hide();
userAction.userLogin(loginName.getValue(), passwd.getValue(), new AsyncCallback<String>() {
public void onSuccess(String result) {
System.out.println("sssssssss" +result);
if("".equals(result)){
Window.alert("用户名密码错误!");
}else{
hide();
RootPanel.get().add(new Label("登录成功."));
ForumsPanel forumsPanel = new ForumsPanel();
RootPanel.get().add(forumsPanel);
}
}
public void onFailure(Throwable caught) {
}
});
}
});
grid.setWidget(2, 0, loginButton);
final Button RegisterButton = new Button("注册", new ClickHandler() {
public void onClick(ClickEvent event) {
hide();
RegisterUserPanel registerUserPanel = new RegisterUserPanel();
registerUserPanel.show();
registerUserPanel.center();
}
});
grid.setWidget(2, 1, RegisterButton);
setWidget(grid);
}
}
在登录面板下面还有一个注册面板.
import com.google.gwt.core.client.GWT;
import com.google.gwt.event.dom.client.ClickEvent;
import com.google.gwt.event.dom.client.ClickHandler;
import com.google.gwt.user.client.Window;
import com.google.gwt.user.client.rpc.AsyncCallback;
import com.google.gwt.user.client.ui.Button;
import com.google.gwt.user.client.ui.DialogBox;
import com.google.gwt.user.client.ui.Grid;
import com.google.gwt.user.client.ui.Label;
import com.google.gwt.user.client.ui.PasswordTextBox;
import com.google.gwt.user.client.ui.TextBox;
public class RegisterUserPanel extends DialogBox {
private final UserActionAsync userAction = GWT.create(UserAction.class);
public RegisterUserPanel() {
setText("用户注册");
final Grid grid = new Grid(5, 5);
grid.setWidget(0, 0, new Label("用户名:"));
final TextBox userName = new TextBox();
grid.setWidget(0, 1, userName);
grid.setWidget(1, 0, new Label("登录名:"));
final TextBox loginName = new TextBox();
grid.setWidget(1, 1, loginName);
grid.setWidget(2, 0, new Label("密码:"));
final PasswordTextBox passwd = new PasswordTextBox();
grid.setWidget(2, 1, passwd);
grid.setWidget(3, 0, new Label("email:"));
final TextBox email = new TextBox();
grid.setWidget(3, 1, email);
final Button RegisterButton = new Button("返回", new ClickHandler() {
public void onClick(ClickEvent event) {
hide();
LoginPanel loginPanel = new LoginPanel();
loginPanel.show();
loginPanel.center();
}
});
final Button loginButton = new Button("注册", new ClickHandler() {
public void onClick(ClickEvent event) {
// hide();
String errorMsg = "";
if ("".equals(userName.getValue())) {
errorMsg += "用户名,";
}
if ("".equals(loginName.getValue())) {
errorMsg += "登录名,";
}
if ("".equals(passwd.getValue())) {
errorMsg += "密码,";
}
if ("".equals(email.getValue())) {
errorMsg += "email,";
}
if ("".equals(errorMsg)) {
userAction.saveUser(userName.getValue(), loginName
.getValue(), passwd.getValue(), email.getValue(),
new AsyncCallback<Void>() {
public void onSuccess(Void result) {
Window.alert("注册成功,请重新登录.");
hide();
LoginPanel loginPanel = new LoginPanel();
loginPanel.show();
loginPanel.center();
}
public void onFailure(Throwable caught) {
}
});
} else {
Window.alert(errorMsg + "不能为空.");
}
}
});
grid.setWidget(4, 0, loginButton);
grid.setWidget(4, 1, RegisterButton);
setWidget(grid);
}
}
注册成功之后将信息保存到数据库.然后再跳回到登录页面.
这样就用GWT实现了两个页面的切换.
显示最简单的两个登录注册面板.
代码还在整理当中.还想添加些其他的功能.
3.关于GoogleApps
登录:http://appengine.google.com/
登录之后你可以注册 10 个 应用的名称:
然后在上传apps的代码的时候指定 名称的名字:
这样你就可以在一个帐号下面同时管理 10 个应用:
说明:这个名称不一定是你自己的邮件的名字.当然可以是相同的.也可以是不同的.
先申请了先得到.
不用也先占着几个好名字吧.做自己的网站的名字.
google的apps还是很吸引我的想做点东西.从最简单的开始.从实践开始.
同时希望能够和大家一起学习进步.有不对的地方还请多指教.