首先我不知道这篇文章发到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:
1. package
2.
3. import
4. import
5. import
6. import
7. import
8. import
9.
10. //标记对象可以持久化
11. @PersistenceCapable(identityType = IdentityType.APPLICATION)
12. public class
13.
14. //标记主键,作以后查询之用
15. @PrimaryKey
16. @Persistent(valueStrategy = IdGeneratorStrategy.IDENTITY)
17. private
18.
19. @Persistent
20. private
21.
22. @Persistent
23. private
24.
25. public
26. this.firstName = firstName;
27. this.lastName = lastName;
28. this.birthDate = birthDate;
29. }
30.
31. public
32. return
33. }
34. }
步骤2.存取Bean(可以写在Servlet的doGet()或者doPost()里面):
1. package
2.
3. import
4. import
5. import
6. import
7. import
8. import
9. import
10.
11. @SuppressWarnings("serial")
12. public class HelloServlet extends
13. public void
14. throws
15.
16. "text/plain");
17.
18. new Employee("Alfred", "Smith", new
19. //获取用以存取对象的PersistenceManager
20. PersistenceManager pm = PMF.get().getPersistenceManager();
21.
22. try
23. //存储对象
24. "saving object!");
25. pm.makePersistent(e);
26. catch(Exception ex){
27. "cannot persistent!");
28. ex.printStackTrace();
29. }
30. finally
31. pm.close();
32. }
33.
34. try{
35. //再次获取用以存取对象的PersistenceManager
36. pm = PMF.get().getPersistenceManager();
37. //由主键检索对象,Alfred之前被定义为主键的
38. class, "Alfred");
39. //读取新对象的信息检测对象检索是否成功
40. "Employee:"+newE.getFirstName());
41. catch(Exception ex){
42. ex.printStackTrace();
43. "cannot get data!");
44. pm.close();
45. }
46. }
47.
48. @Override
49. protected void
50. throws
51. this.doGet(req, resp);
52. }
53. }
其中PMF类的代码如下,没看错应该是个单例模式:
1. package
2.
3. import
4. import
5.
6. public final class
7. private static final
8. "transactions-optional");
9.
10. private
11.
12. public static
13. return
14. }
15. }
Demo2.使用Google 账户认证服务:
1. package
2.
3. import
4.
5. import
6. import
7. import
8. import
9.
10. import
11. import
12.
13. public class GoogleAccount extends
14.
15. @Override
16. protected void
17. throws
18. //创建用户服务
19. UserService userService = UserServiceFactory.getUserService();
20.
21. String thisURL = req.getRequestURI();
22. //通过请求对象的 getUserPrincipal() 方法测试用户是否使用 Google 帐户登录
23. if (req.getUserPrincipal() != null) {
24. //如果有登录,则创建Login地址
25. "<p>Hello, "
26. req.getUserPrincipal().getName() +
27. "! You can <a href=\""
28. userService.createLogoutURL(thisURL) +
29. "\">sign out</a>.</p>");
30. else
31. //如果没有登录,则创建Login地址
32. "<p>Please <a href=\""
33. userService.createLoginURL(thisURL) +
34. "\">sign in</a>.</p>");
35. }
36. }
37.
38. @Override
39. protected void
40. throws
41. doGet(req, resp);
42. }
43. }
手机访问登录效果:
需要特别指出的是,Google通过在web.xml里面配置权限来区分登录者的权限,可以用下面的代码来配置安全常量从而划定只能由admin访问的区域---admin路径下的所有页面:
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