GWT1.7学习之后台传送pojo到前台页面.RPC调用
2013-03-04 15:51
369 查看
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还是很吸引我的想做点东西.从最简单的开始.从实践开始.
同时希望能够和大家一起学习进步.有不对的地方还请多指教.
大小: 20.1 KB
大小: 18.9 KB
大小: 5.2 KB
大小: 14.3 KB
查看图片附件
相关文章推荐
- GWT1.7学习之后台传送pojo到前台页面.RPC调用
- 通过AJAX调用页面后台代码方法实现省级三级联动效果 (简单练习)前台
- Asp.Net前台页面如何调用后台cs变…
- js跳转另一个页面在本页显示及后台调用前台方法
- 页面使用Ajax控件,后台不能调用前台Javascript脚本弹出消息框的解决办法
- 在前台页面调用后台代码的方法
- 后台线程调用前台页面上的内容:windows Form
- ASP.NET,DEV ASPxCallback 前台调用后台方法,不刷新页面
- Asp.Net前台页面调用后台cs变量
- C#后台调用前台页面js方法
- 遍历获取ASP.NET页面控件的名称及值 后台调用前台javascript方法报错:“缺少对象”的解决方法 xml与DataSet的互转换类
- .net 中 前台aspx页面调用后台.cs文件中的变量
- 前台页面调用后台方法(省市联查)(springMVC)
- C#后台调用前台页面js方法
- json_后台传送json格式的对象到前台页面
- .net 中 前台aspx页面调用后台.cs文件中的变量
- 登录页面在输入了正确的用户名和密码后仍跳转到登录页面而不是期望的系统首页面,debug的时候发现,登录页面调用的action类方法被调用了两次,后台无法获取前台页面传过来的参数。
- 页面后台调用前台JS脚本
- Ajax实现前台页面调用后台方法(mvc)
- Net前台页面如何调用后台cs变量