GWT1.7學習之後臺傳送pojo到前臺頁面.RPC呼叫

freegolang發表於2013-03-04

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還是很吸引我的想做點東西.從最簡單的開始.從實踐開始.

 

同時希望能夠和大家一起學習進步.有不對的地方還請多指教.


相關文章