`

GWT1.7学习之后台传送pojo到前台页面.RPC调用

    博客分类:
  • java
阅读更多

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
1
0
分享到:
评论
3 楼 xiahanmingqing 2013-06-04  
xiahanmingqing 写道
【这个POJO必须放到client包下面.否则会有问题.】

个人认为,这个pojo是作为client和service之间的数据传递用的,c/s都可以访问得到,应该放在shared包下,更合理。

而且,我的项目中都是放在shared包下,也没有问题。


或许是版本问题,我现在用的gxt3,刚看到你写的时候是gxt1.7
2 楼 xiahanmingqing 2013-06-04  
【这个POJO必须放到client包下面.否则会有问题.】

个人认为,这个pojo是作为client和service之间的数据传递用的,c/s都可以访问得到,应该放在shared包下,更合理。

而且,我的项目中都是放在shared包下,也没有问题。
1 楼 fishyu0817 2009-10-22  
收益匪浅,解开了我许多困惑。感谢感谢

相关推荐

    GWT1.7学习之 了解基本的使用

    **GWT1.7 学习之 了解基本的使用** Google Web Toolkit(GWT)是一种开源的Java框架,用于构建高性能的、跨浏览器的Web应用程序。GWT1.7是GWT的一个早期版本,虽然现在已经有了更新的版本,但学习它的基本使用仍然...

    GWT_1.7_API

    自己做的GWT 1.7的API文档 有需要的可以下载

    GWT 研究. 1.7 版本.

    通过研究源码,我们可以学习到GWT如何将Java代码编译成JavaScript,以及它是如何处理事件、异步通信和UI渲染的。这有助于开发者在遇到问题时进行调试,同时也能为自定义功能和性能优化提供可能。 ### 2. 开发工具 ...

    gwt-windows-1.7.1

    GWT(Google Web Toolkit)是Google推出的一款开源的JavaScript开发框架,它允许Java开发者使用Java语言来编写Web应用,然后自动生成优化过的JavaScript代码。"gwt-windows-1.7.1"指的是GWT的一个特定版本,即1.7.1...

    GWT介绍--基于eclipse可后台开发前台页面

    **GWT(Google Web Toolkit)** 是一个由Google开发的开源JavaScript开发框架,它允许开发者使用Java语言来编写Web应用程序,然后自动编译为优化过的JavaScript代码,从而在客户端浏览器中运行。GWT的设计目标是简化...

    GWT-RPC-1.pdf

    根据给定文件的信息,我们可以深入探讨GWT-RPC(Google Web Toolkit Remote Procedure Call)的核心概念、开发流程以及在不同模式下的测试方法。 ### GWT-RPC:大想法 GWT-RPC提供了一种机制,允许客户端...

    GWT RPC详细例子:代码加文档说明

    在这个“GWT RPC详细例子:代码加文档说明”的资源中,我们可以深入学习GWT RPC的使用方法。 首先,环境搭建是开始GWT开发的第一步。你需要安装Java Development Kit (JDK),确保版本符合GWT的要求。接着,下载并...

    gwt 练习 gwt学习

    8. **历史管理**:GWT的History API允许应用程序创建和管理URL片段,实现页面状态的导航,而无需刷新整个页面。 9. **单元测试**:GWT提供JUnit支持,允许在浏览器环境中进行客户端代码的单元测试。 10. **CSS和...

    GWT1.7+Spring2.5+Hibernate3集成(保证能用!)

    完整代码,绝对能用:Spring和...GWT部分集成了Spring的Service(网上的例子很少,要不代码不全,要不不能使用,这个保证完全可以使用)。请注意各个配置文件,程序所用的包都在WEB-INF下的图片上,请自行下载。

    GWT-RPC.pdf

    根据提供的文件信息,我们可以深入探讨GWT-RPC的相关知识点,主要围绕其概念、开发流程以及部署等几个方面展开。 ### GWT-RPC:基础知识与概念 #### RPC:远程过程调用 RPC(Remote Procedure Call)是一种协议,...

    GWT 1.7.0 参考手册 (CHM)

    最新版本的GWT的原版英文参考手册,如果需要其他的版本,请在我的资料库中查找……

    gwtext学习三部曲

    同时,你将接触到GWT Ext的布局管理,学习各种布局模式如绝对布局、网格布局、表格布局等,以便更灵活地设计页面结构。 第三部分:实战应用与最佳实践 这一部分将通过实例展示gwtext和GWT Ext在实际项目中的应用。...

    基于GWTRPC的通讯软件

    2. **RPC机制**:RPC(Remote Procedure Call)是一种分布式计算技术,使得一个程序可以调用位于另一台机器上的程序,就像调用本地函数一样。GWTRPC是GWT实现的特定于Web的RPC机制,它通过HTTP协议在客户端和服务器...

    GWT-RPC-2.pdf

    根据给定文件的信息,我们可以深入探讨GWT-RPC(Google Web Toolkit Remote Procedure Call)的高级特性,特别是关于处理多线程、部署以及异步方法的处理。这些知识点对于理解和运用GWT-RPC进行高效Web应用开发至关...

    gwt学习的书籍分享

    标题 "gwt学习的书籍分享" 提供了一个线索,表明我们即将探讨的是关于Google Web Toolkit (GWT) 的学习资源,特别是2007年出版的一本书籍《Packt Publishing - GWT Java AJAX Programming》。GWT是一个开源的Java...

    gwt学习资料和实例项目

    通过这个项目,开发者可以学习到GWT中的Widget库,如TextBox、Button等控件的使用,以及数据模型和视图之间的交互,还有可能涉及到数据持久化和异步服务调用(通过GWT的RPC机制)。 **StockWatcher.zip** 另一个...

    gwt-servlet-2.3.0.jar

    GWT(Google Web Toolkit)是一个开源的Java开发框架,它允许开发者使用Java语言来编写客户端的Web应用程序。GWT-Servlet是GWT框架的一部分,主要负责处理服务器端的交互。`gwt-servlet-2.3.0.jar`是GWT 2.3.0版本的...

    GWT Demo,GWT学习时的一些小例子

    例如,一个示例可能展示了如何创建一个按钮控件,当用户点击按钮时,通过GWT的RPC机制向服务器发送请求,获取数据并更新页面上的显示。另一个示例可能涉及使用GWT的Composite类来组合多个Widget,创建自定义的复杂...

    GWT学习手册,由本人整理打包

    中级教程可能还会讲解到GWT的异步通信机制——`com.google.gwt.user.client.rpc.RemoteService` 和 `com.google.gwt.user.client.rpc.ServiceDefTarget`,它们用于实现客户端与服务器间的RPC(Remote Procedure Call...

    gwt-windows-1.4.6.1

    5. **异步通信**:GWT支持AJAX技术,使得Web应用能够实现页面无刷新的交互体验,通过`com.google.gwt.user.client.rpc.RPC`服务进行服务器端调用。 6. **开发工具**:GWT提供了一个强大的集成开发环境(IDE)插件,...

Global site tag (gtag.js) - Google Analytics