首先我不知道这篇文章发到Android开发板块是否适合的,因为只部分内容大多数是有关Google appEngine的,但因为这是AppEngine和Android的配合开发,故对Android开发者也有一定的参考意义,故发到这里来了。

其次,在写文章前先谢谢UCWeb Android的产品经理huang,谢谢他的赏识,虽然最后因为一些个人原因我没留在UC,但从笔试和面试的过程中,我发觉UC真是一家严谨、惜才的公司,搞Android的朋友如果有兴趣,可以考虑应聘一下UC的社招。


OK,进入正题!

在做游戏开发的时候,很多游戏都会提供一个全球分数排名的的功能,这就需要使用服务器了,当然,你可以选择搭建自己的服务器,但从成本,稳定性和开发周期上看,我认为Google AppEngine是个很不错的选择,现在Google AppEngine关于Python的参考资料比较详尽,Java的就比较少,所以我把我写的小Demo放上来,做抛砖引玉之用,因为我也是初学者,所以demo一切从简,大侠请不要见笑哦!

Demo1:对象的存储:

步骤1.定义JavaBean:

Java代码
  1. packagecom.ray.test;
  2. importjava.util.Date;
  3. importjavax.jdo.annotations.IdGeneratorStrategy;
  4. importjavax.jdo.annotations.IdentityType;
  5. importjavax.jdo.annotations.PersistenceCapable;
  6. importjavax.jdo.annotations.Persistent;
  7. importjavax.jdo.annotations.PrimaryKey;
  8. //标记对象可以持久化
  9. @PersistenceCapable(identityType=IdentityType.APPLICATION)
  10. publicclassEmployee{
  11. //标记主键,作以后查询之用
  12. @PrimaryKey
  13. @Persistent(valueStrategy=IdGeneratorStrategy.IDENTITY)
  14. privateStringfirstName;
  15. @Persistent
  16. privateStringlastName;
  17. @Persistent
  18. privateDatebirthDate;
  19. publicEmployee(StringfirstName,StringlastName,DatebirthDate){
  20. this.firstName=firstName;
  21. this.lastName=lastName;
  22. this.birthDate=birthDate;
  23. }
  24. publicStringgetFirstName(){
  25. returnfirstName;
  26. }
  27. }

步骤2.存取Bean(可以写在Servlet的doGet()或者doPost()里面):

Java代码
  1. packagecom.ray.test;
  2. importjava.io.IOException;
  3. importjava.util.Date;
  4. importjavax.jdo.PersistenceManager;
  5. importjavax.servlet.ServletException;
  6. importjavax.servlet.http.HttpServlet;
  7. importjavax.servlet.http.HttpServletRequest;
  8. importjavax.servlet.http.HttpServletResponse;
  9. @SuppressWarnings("serial")
  10. publicclassHelloServletextendsHttpServlet{
  11. publicvoiddoGet(HttpServletRequestreq,
  12. HttpServletResponseresp)throwsIOException{
  13. resp.setContentType("text/plain");
  14. Employeee=newEmployee("Alfred","Smith",newDate());
  15. //获取用以存取对象的PersistenceManager
  16. PersistenceManagerpm=PMF.get().getPersistenceManager();
  17. try{
  18. //存储对象
  19. resp.getWriter().println("savingobject!");
  20. pm.makePersistent(e);
  21. }catch(Exceptionex){
  22. resp.getWriter().println("cannotpersistent!");
  23. ex.printStackTrace();
  24. }
  25. finally{
  26. pm.close();
  27. }
  28. try{
  29. //再次获取用以存取对象的PersistenceManager
  30. pm=PMF.get().getPersistenceManager();
  31. //由主键检索对象,Alfred之前被定义为主键的
  32. EmployeenewE=pm.getObjectById(Employee.class,"Alfred");
  33. //读取新对象的信息检测对象检索是否成功
  34. resp.getWriter().println("Employee:"+newE.getFirstName());
  35. }catch(Exceptionex){
  36. ex.printStackTrace();
  37. resp.getWriter().println("cannotgetdata!");
  38. pm.close();
  39. }
  40. }
  41. @Override
  42. protectedvoiddoPost(HttpServletRequestreq,
  43. HttpServletResponseresp)throwsServletException,IOException{
  44. this.doGet(req,resp);
  45. }
  46. }

其中PMF类的代码如下,没看错应该是个单例模式:

Java代码
  1. packagecom.ray.test;
  2. importjavax.jdo.JDOHelper;
  3. importjavax.jdo.PersistenceManagerFactory;
  4. publicfinalclassPMF{
  5. privatestaticfinalPersistenceManagerFactorypmfInstance=
  6. JDOHelper.getPersistenceManagerFactory("transactions-optional");
  7. privatePMF(){}
  8. publicstaticPersistenceManagerFactoryget(){
  9. returnpmfInstance;
  10. }
  11. }

Demo2.使用Google 账户认证服务:

Java代码
  1. packagecom.ray.test;
  2. importjava.io.IOException;
  3. importjavax.servlet.ServletException;
  4. importjavax.servlet.http.HttpServlet;
  5. importjavax.servlet.http.HttpServletRequest;
  6. importjavax.servlet.http.HttpServletResponse;
  7. importcom.google.appengine.api.users.UserService;
  8. importcom.google.appengine.api.users.UserServiceFactory;
  9. publicclassGoogleAccountextendsHttpServlet{
  10. @Override
  11. protectedvoiddoGet(HttpServletRequestreq,HttpServletResponseresp)
  12. throwsServletException,IOException{
  13. //创建用户服务
  14. UserServiceuserService=UserServiceFactory.getUserService();
  15. StringthisURL=req.getRequestURI();
  16. //通过请求对象的getUserPrincipal()方法测试用户是否使用Google帐户登录
  17. if(req.getUserPrincipal()!=null){
  18. //如果有登录,则创建Login地址
  19. resp.getWriter().println("<p>Hello,"+
  20. req.getUserPrincipal().getName()+
  21. "!Youcan<ahref=\""+
  22. userService.createLogoutURL(thisURL)+
  23. "\">signout</a>.</p>");
  24. }else{
  25. //如果没有登录,则创建Login地址
  26. resp.getWriter().println("<p>Please<ahref=\""+
  27. userService.createLoginURL(thisURL)+
  28. "\">signin</a>.</p>");
  29. }
  30. }
  31. @Override
  32. protectedvoiddoPost(HttpServletRequestreq,HttpServletResponseresp)
  33. throwsServletException,IOException{
  34. doGet(req,resp);
  35. }
  36. }

手机访问登录效果:

需要特别指出的是,Google通过在web.xml里面配置权限来区分登录者的权限,可以用下面的代码来配置安全常量从而划定只能由admin访问的区域---admin路径下的所有页面:

Xml代码
  1. <security-constraint>
  2. <web-resource-collection>
  3. <url-pattern>/admin/*</url-pattern>
  4. </web-resource-collection>
  5. <auth-constraint>
  6. <role-name>admin</role-name>
  7. </auth-constraint>
  8. </security-constraint>

参考资料:

http://code.google.com/intl/zh-CN/appengine/docs/java/overview.html



更多相关文章

  1. 没有一行代码,「2020 新冠肺炎记忆」这个项目却登上了 GitHub 中
  2. libevent 多线程IO
  3. Android流媒体开发之路三:基于NDK开发Android平台RTSP播放器
  4. 应该是史上最全最新Java和Android面试题目(自己总结和收集的)
  5. 代码实例 -- 在程序里检查虚拟键盘状态, 并开启关闭
  6. “Android第一书”作者郭霖:用心做事,结果自然水到渠成
  7. 迷途d书童 Android(安卓)如何从系统图库中选择图片
  8. 接口的使用,以及在异步任务中的使用
  9. Android(安卓)吸入动画效果实现分解

随机推荐

  1. Mac安装Android(安卓)Studio并配置环境变
  2. Android(安卓)完全退出程序
  3. Android(安卓)Studio引入Lambda以及介绍
  4. 在Android中常见XML符号的实体定义
  5. AndroidManifest.xml反编译
  6. Android开发 去掉标题栏方法 摘记
  7. Android(安卓)HIDL学习(2) --- HelloWorl
  8. Eclipse Android(安卓)自动补全
  9. [置顶] Android(安卓)从硬件到应用:一步一
  10. 彩信