GWT AppEngine 保存对象序列号.

简介: 想这个Google的app 都是可以先自己放一个免费的程序到服务器上面. 就是一个高兴的事情.   前几天研究了下GWT.关于做界面还是非常容易的.   java的代码想怎么写就怎么写.非常的高效率.   现在研究下如何将数据保存.   参考官方的文档.是通过JDO实现的.我也没有想太多.直接照着官方的文档写了个demo.   1.定义一个JDO对象.   packa

想这个Google的app 都是可以先自己放一个免费的程序到服务器上面.

就是一个高兴的事情.

 

前几天研究了下GWT.关于做界面还是非常容易的.

 

java的代码想怎么写就怎么写.非常的高效率.

 

现在研究下如何将数据保存.

 

参考官方的文档.是通过JDO实现的.我也没有想太多.直接照着官方的文档写了个demo.

 

1.定义一个JDO对象.

 

package com.test.demo.jdo;

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;

@PersistenceCapable(identityType = IdentityType.APPLICATION)
public class LoginUser {

	@PrimaryKey
	@Persistent(valueStrategy = IdGeneratorStrategy.IDENTITY)
	private Long id;

	@Persistent
	private String userName;

	@Persistent
	private String passwd;

 

get set 方法和构造函数省略.

这里要说下.ID如果是要自增的话.id一定要用Long.而不能用String.

 

否则会报:ID自增错误.

 

然后用GWT写个对话框.

 

final DialogBox dialogBox = new DialogBox(false, true);
		// false:是否自动隐藏.(单击DialogBox之外的部分.true:是否是模式对话框.
		dialogBox.setTitle("登录对话框");
		dialogBox.setText("登录对话框");
		Grid grid = new Grid(3, 3);

		grid.setWidget(0, 0, new HTML("登录名:"));

		final TextBox userName = new TextBox();
		userName.setValue("demo");
		grid.setWidget(0, 1, userName);

		grid.setWidget(1, 0, new HTML("密码:"));

		final PasswordTextBox userPasswd = new PasswordTextBox();
		userPasswd.setValue("demo");
		grid.setWidget(1, 1, userPasswd);

		final Button submit = new Button("新增");
		submit.addClickHandler(new ClickHandler() {
			public void onClick(ClickEvent event) {
				// dialogBox.hide();
				// GWT.
				loginUserAction.saveLoginUser(userName.getValue(), userPasswd
						.getValue(), new AsyncCallback<Void>() {

					public void onSuccess(Void result) {
						// TODO Auto-generated method stub
						System.out.println("save !");
						Window.alert("save!");
					}

					public void onFailure(Throwable caught) {
						// TODO Auto-generated method stub

					}
				});
			}
		});

		final Button cancle = new Button("长度");
		cancle.addClickHandler(new ClickHandler() {
			public void onClick(ClickEvent event) {
				loginUserAction.findLoginUserSize(new AsyncCallback<Integer>() {

					public void onSuccess(Integer result) {
						// TODO Auto-generated method stub
						Window.alert(result + "");
					}

					public void onFailure(Throwable caught) {
						// TODO Auto-generated method stub

					}
				});
			}
		});

		grid.setWidget(2, 0, submit);
		grid.setWidget(2, 1, cancle);

		dialogBox.add(grid);
		dialogBox.center();
		dialogBox.show();
		// 将面板添加到dialog里面
 

 

private final LoginUserActionAsync loginUserAction = GWT
			.create(LoginUserAction.class);

 

在GWT里面调用jdo 保存数据和查询数据记录数.

 

http://toeoso.appspot.com/Login.html

 

public final class PMF {
    private static final PersistenceManagerFactory pmfInstance =
        JDOHelper.getPersistenceManagerFactory("transactions-optional");

    private PMF() {}

    public static PersistenceManagerFactory get() {
        return pmfInstance;
    }
}

 看了下官方写了一个PMF类.我也拷贝了下.

 

public void deleteLoginUserById(String id) {

	}

	public void saveLoginUser(String userName, String userPasswd) {
		PersistenceManager pm = PMF.get().getPersistenceManager();
		try {
			LoginUser loginUser = new LoginUser(userName, userPasswd);
			//loginUser.setId(Math.abs(new Random().nextInt())+"");
			pm.makePersistent(new LoginUser(userName, userPasswd));
		}catch (Exception e) {
			// TODO: handle exception
			e.printStackTrace();
		} finally {
			pm.close();
		}
	}

	public int findLoginUserSize() {
		PersistenceManager pm = PMF.get().getPersistenceManager();
		try {
			javax.jdo.Query query = pm.newQuery(LoginUser.class);
			List<LoginUser> results = (List<LoginUser>) query.execute("Smith");
			return results.size();
		}catch (Exception e) {
			e.printStackTrace();
			return 0;
		} finally {
			pm.close();
		}
	}

 用了下PMF.每次都要申请一个.然后在关闭下.不知道这么写对不对.

 

拷贝了下日志:

启动的时候创建了数据库表.

 
2009-9-19 11:22:00 com.google.apphosting.utils.jetty.JettyLogger info
信息: jetty-6.1.x
2009-9-19 11:22:00 com.google.apphosting.utils.jetty.JettyLogger info
信息: Started SelectChannelConnector@0.0.0.0:8080
The server is running at http://localhost:8080/
2009-9-19 11:23:09 org.datanucleus.plugin.NonManagedPluginRegistry resolveConstraints
INFO: Bundle "org.datanucleus.jpa" has an optional dependency to "org.datanucleus.enhancer" but it cannot be resolved
2009-9-19 11:23:09 org.datanucleus.plugin.NonManagedPluginRegistry resolveConstraints
INFO: Bundle "org.datanucleus" has an optional dependency to "org.eclipse.equinox.registry" but it cannot be resolved
2009-9-19 11:23:09 org.datanucleus.plugin.NonManagedPluginRegistry resolveConstraints
INFO: Bundle "org.datanucleus" has an optional dependency to "org.eclipse.core.runtime" but it cannot be resolved
2009-9-19 11:23:09 org.datanucleus.PersistenceConfiguration setProperty
INFO: Property datanucleus.rdbms.sql.allowAllSQLStatements unknown - will be ignored
2009-9-19 11:23:09 org.datanucleus.PersistenceConfiguration setProperty
INFO: Property datanucleus.rdbms.stringDefaultLength unknown - will be ignored
2009-9-19 11:23:09 org.datanucleus.PersistenceConfiguration setProperty
INFO: Property datanucleus.appengine.autoCreateDatastoreTxns unknown - will be ignored
2009-9-19 11:23:09 org.datanucleus.ObjectManagerFactoryImpl logConfiguration
INFO: ================= Persistence Configuration ===============
2009-9-19 11:23:09 org.datanucleus.ObjectManagerFactoryImpl logConfiguration
INFO: DataNucleus Persistence Factory - Vendor: "DataNucleus"  Version: "1.1.4"
2009-9-19 11:23:09 org.datanucleus.ObjectManagerFactoryImpl logConfiguration
INFO: DataNucleus Persistence Factory initialised for datastore URL="appengine" driver="" userName=""
2009-9-19 11:23:09 org.datanucleus.ObjectManagerFactoryImpl logConfiguration
INFO: ===========================================================
2009-9-19 11:23:09 org.datanucleus.PersistenceConfiguration setProperty
INFO: Property datanucleus.query.cached unknown - will be ignored
2009-9-19 11:23:10 org.datanucleus.jdo.metadata.JDOMetaDataManager <init>
INFO: Registering listener for metadata initialisation
2009-9-19 11:23:10 org.datanucleus.jdo.metadata.JDOAnnotationReader processClassAnnotations
INFO: Class "com.test.demo.jdo.LoginUser" has been specified with JDO annotations so using those.
2009-9-19 11:23:10 org.datanucleus.store.appengine.MetaDataValidator validate
INFO: Performing appengine-specific metadata validation for com.test.demo.jdo.LoginUser
2009-9-19 11:23:10 org.datanucleus.store.appengine.MetaDataValidator validate
INFO: Finished performing appengine-specific metadata validation for com.test.demo.jdo.LoginUser
2009-9-19 11:23:10 org.datanucleus.store.StoreDataManager registerStoreData
INFO: Managing Persistence of Class : com.test.demo.jdo.LoginUser [Table : <class name="LoginUser"
       identity-type="application"
       objectid-class="javax.jdo.identity.LongIdentity"
       persistence-modifier="persistence-capable"
>
<inheritance strategy="new-table">
</inheritance>
<field name="id"
       persistence-modifier="persistent"
       primary-key="true"
       null-value="none"
       default-fetch-group="true"
       embedded="false"
       value-strategy="identity"
       unique="false">
</field>
<field name="passwd"
       persistence-modifier="persistent"
       null-value="none"
       default-fetch-group="true"
       embedded="true"
       unique="false">
</field>
<field name="userName"
       persistence-modifier="persistent"
       null-value="none"
       default-fetch-group="true"
       embedded="true"
       unique="false">
</field>
</class>
, InheritanceStrategy : new-table]
2009-9-19 11:23:10 org.datanucleus.store.StoreDataManager registerStoreData
INFO: Managing Persistence of Class : com.test.demo.jdo.LoginUser [Table : <class name="LoginUser"
       identity-type="application"
       objectid-class="javax.jdo.identity.LongIdentity"
       persistence-modifier="persistence-capable"
>
<inheritance strategy="new-table">
</inheritance>
<field name="id"
       persistence-modifier="persistent"
       primary-key="true"
       null-value="none"
       default-fetch-group="true"
       embedded="false"
       value-strategy="identity"
       unique="false">
</field>
<field name="passwd"
       persistence-modifier="persistent"
       null-value="none"
       default-fetch-group="true"
       embedded="true"
       unique="false">
</field>
<field name="userName"
       persistence-modifier="persistent"
       null-value="none"
       default-fetch-group="true"
       embedded="true"
       unique="false">
</field>
</class>
, InheritanceStrategy : new-table]
2009-9-19 11:23:11 com.google.appengine.api.datastore.dev.LocalDatastoreService load
INFO: Time to load datastore: 141 ms
2009-9-19 11:23:11 org.datanucleus.jdo.metadata.JDOMetaDataManager$MetaDataRegisterClassListener registerClass
INFO: Listener found initialisation for persistable class com.test.demo.jdo.LoginUser
2009-9-19 11:23:49 org.datanucleus.ObjectManagerImpl close
INFO: Outstanding nontx update being committed to datastore
save !
2009-9-19 11:24:11 com.google.appengine.api.datastore.dev.LocalDatastoreService$PersistDatastore persist
INFO: Time to persist datastore: 0 ms
2009-9-19 11:52:28 org.datanucleus.ObjectManagerImpl close
INFO: Outstanding nontx update being committed to datastore
save !
2009-9-19 11:52:31 com.google.appengine.api.datastore.dev.LocalDatastoreService$PersistDatastore persist
INFO: Time to persist datastore: 62 ms

 

 

我在运行的时候遇到了

 

点击按钮的时候怎么也不响应.报后台类错误.

 

2009-9-19 10:56:15 com.google.apphosting.utils.jetty.JettyLogger warn
警告: EXCEPTION
java.lang.ClassNotFoundException: com.demo.test.server.LoginUserActionImpl
    at java.net.URLClassLoader$1.run(Unknown Source)
    at java.security.AccessController.doPrivileged(Native Method)
    at java.net.URLClassLoader.findClass(Unknown Source)
    at java.lang.ClassLoader.loadClass(Unknown Source)
    at com.google.appengine.tools.development.IsolatedAppClassLoader.loadClass(IsolatedAppClassLoader.java:142)
    at java.lang.ClassLoader.loadClass(Unknown Source)
    at org.mortbay.util.Loader.loadClass(Loader.java:91)
    at org.mortbay.util.Loader.loadClass(Loader.java:71)
    at org.mortbay.jetty.servlet.Holder.doStart(Holder.java:73)
    at org.mortbay.jetty.servlet.ServletHolder.doStart(ServletHolder.java:233)
    at org.mortbay.component.AbstractLifeCycle.start(AbstractLifeCycle.java:40)
    at org.mortbay.jetty.servlet.ServletHandler.initialize(ServletHandler.java:612)
    at org.mortbay.jetty.servlet.Context.startContext(Context.java:139)
    at org.mortbay.jetty.webapp.WebAppContext.startContext(WebAppContext.java:1218)
    at org.mortbay.jetty.handler.ContextHandler.doStart(ContextHandler.java:500)
    at org.mortbay.jetty.webapp.WebAppContext.doStart(WebAppContext.java:448)
    at org.mortbay.component.AbstractLifeCycle.start(AbstractLifeCycle.java:40)
    at org.mortbay.jetty.handler.HandlerWrapper.doStart(HandlerWrapper.java:117)
    at org.mortbay.component.AbstractLifeCycle.start(AbstractLifeCycle.java:40)
    at org.mortbay.jetty.handler.HandlerWrapper.doStart(HandlerWrapper.java:117)
    at org.mortbay.jetty.Server.doStart(Server.java:217)
    at org.mortbay.component.AbstractLifeCycle.start(AbstractLifeCycle.java:40)
    at com.google.appengine.tools.development.JettyContainerService.startContainer(JettyContainerService.java:152)
    at com.google.appengine.tools.development.AbstractContainerService.startup(AbstractContainerService.java:116)
    at com.google.appengine.tools.development.DevAppServerImpl.start(DevAppServerImpl.java:218)
    at com.google.appengine.tools.development.gwt.AppEngineLauncher.start(AppEngineLauncher.java:86)
    at com.google.gwt.dev.HostedMode.doStartUpServer(HostedMode.java:365)
    at com.google.gwt.dev.HostedModeBase.startUp(HostedModeBase.java:590)
    at com.google.gwt.dev.HostedModeBase.run(HostedModeBase.java:397)
    at com.google.gwt.dev.HostedMode.main(HostedMode.java:232)

 

 

其实就是配置没有写对.类下面的这个和web.xml里面的要一致.

 

@RemoteServiceRelativePath("LoginUserAction")
public interface LoginUserAction extends RemoteService {
    void saveLoginUser(String userName,String userPasswd);
    void deleteLoginUserById(String id);
    int findLoginUserSize();
}

 

 

  <servlet>
    <servlet-name>LoginUserAction </servlet-name>
    <servlet-class>com.test.demo.server.LoginUserActionImpl</servlet-class>
  </servlet>
 
 <servlet-mapping>
    <servlet-name>LoginUserAction </servlet-name>
    <url-pattern>/com.test.demo.Login/LoginUserAction </url-pattern>
  </servlet-mapping>

 

叫什么是无所谓了..而且在代码里面也不用.

 

只不过是GWT自己去找而已.

 

想着也挺方便的.

 

 



 附件是代码.新增是将数据保存.长度是获得有几条数据.

相关实践学习
基于Hologres轻量实时的高性能OLAP分析
本教程基于GitHub Archive公开数据集,通过DataWorks将GitHub中的项⽬、行为等20多种事件类型数据实时采集至Hologres进行分析,同时使用DataV内置模板,快速搭建实时可视化数据大屏,从开发者、项⽬、编程语⾔等多个维度了解GitHub实时数据变化情况。
阿里云实时数仓实战 - 用户行为数仓搭建
课程简介 1)学习搭建一个数据仓库的过程,理解数据在整个数仓架构的从采集、存储、计算、输出、展示的整个业务流程。 2)整个数仓体系完全搭建在阿里云架构上,理解并学会运用各个服务组件,了解各个组件之间如何配合联动。 3&nbsp;)前置知识要求:熟练掌握 SQL 语法熟悉 Linux 命令,对 Hadoop 大数据体系有一定的了解 &nbsp; 课程大纲 第一章&nbsp;了解数据仓库概念 初步了解数据仓库是干什么的 第二章&nbsp;按照企业开发的标准去搭建一个数据仓库 数据仓库的需求是什么 架构 怎么选型怎么购买服务器 第三章&nbsp;数据生成模块 用户形成数据的一个准备 按照企业的标准,准备了十一张用户行为表 方便使用 第四章&nbsp;采集模块的搭建 购买阿里云服务器 安装 JDK 安装 Flume 第五章&nbsp;用户行为数据仓库 严格按照企业的标准开发 第六章&nbsp;搭建业务数仓理论基础和对表的分类同步 第七章&nbsp;业务数仓的搭建&nbsp; 业务行为数仓效果图&nbsp;&nbsp;
目录
相关文章
|
12月前
|
人工智能 自动驾驶 算法
智能时代的伦理困境:AI决策的道德边界
在人工智能技术飞速发展的今天,我们面临着前所未有的伦理挑战。本文探讨了AI决策中的道德边界问题,分析了技术发展与人类价值观之间的冲突,并提出了建立AI伦理框架的必要性和可能路径。通过深入剖析具体案例,揭示了AI技术在医疗、司法等领域的应用中所引发的道德争议,强调了在追求技术进步的同时,必须审慎考虑其对社会伦理的影响,确保科技发展服务于人类的福祉而非成为新的困扰源。
|
机器学习/深度学习 算法 数据可视化
【机器学习】十大算法之一 “K-means”
k-means算法早在1957年就被发明了,最早由J. MacQueen提出。后来,Lloyd(1982年)、Hartigan(1975年)、Forgy(1965年)等学者对此算法进行了修正和改进。这个算法已被广泛应用于数据挖掘、模式识别、图像处理等领域,它可以用来识别数据集之间的模式,因此是一种十分实用的机器学习算法。本篇文章介绍了k-means算法,一种常见的聚类算法。我们详细讲解了该算法的发展史、原理、功能以及示例代码。
742 0
【机器学习】十大算法之一 “K-means”
|
传感器 编解码 监控
工业相机的帧率和曝光(快门)之间的关系
工业相机的帧率和曝光(快门)之间的关系
1376 0
|
弹性计算
阿里云服务器公网宽带价格表(固定宽带+按量计费+使用流量)
2023阿里云服务器公网宽带价格表(固定宽带+按量计费+使用流量),阿里云服务器公网带宽计费模式按固定带宽和按使用流量哪个划算?按固定带宽计费1M带宽一个月23元,按使用流量计费1GB流量0.8元,如果云服务器带宽使用率低于10%,那么首选按使用流量计费,如果带宽实际利用率较高的话,按固定带宽计费更划算一些。云服务器吧来详细说下阿里云服务器带宽不同计费模式下收费价格、费用计算方法及如何选择更合适说明:
939 0
阿里云服务器公网宽带价格表(固定宽带+按量计费+使用流量)
|
弹性计算 人工智能 虚拟化
阿里云gpu云服务器产品知识、常见问题及官方解答资料
作为阿里云弹性计算家族的一员,GPU云服务器结合了GPU计算力与CPU计算力,满足您在人工智能、高性能计算、专业图形图像处理等场景中的需求。下面是阿里云GPU云服务器的一些产品知识和常见问题及官方解答资料,以供大家参考和了解阿里云GPU云服务器。
1449 1
阿里云gpu云服务器产品知识、常见问题及官方解答资料
|
存储 前端开发 JavaScript
状态管理(State Management):构建复杂应用的关键要素
在现代应用程序开发中,状态管理是一个至关重要的概念,它用于管理应用程序的数据和状态。无论您是开发Web应用、移动应用还是桌面应用,都需要有效的状态管理来确保应用程序的可维护性和可扩展性。在本博客中,我们将深入研究状态管理的定义、原则、工具和最佳实践,以及如何充分利用状态管理来构建复杂的应用程序。
890 0
|
运维 负载均衡 监控
服务网格下的东西向与南北向流量管理实践|学习笔记
快速学习服务网格下的东西向与南北向流量管理实践
1730 0
服务网格下的东西向与南北向流量管理实践|学习笔记
|
程序员 调度 C#
协程是什么?为何说协程具有同步的编程方式又具有异步的性能?
协程是什么?为何说协程具有同步的编程方式又具有异步的性能?
475 0
|
存储 运维 Linux
和宝塔更好用的Linux 控制面板1Panel
和宝塔更好用的Linux 控制面板1Panel
345 1
|
缓存 监控 安全
宝塔数据库崩溃解决方案详解
宝塔数据库崩溃解决方案详解