Google App Engine     for Java初めてなんだから・・・やさしくしてね?編       2012.3.24        つっちぃ      @takuya0301
Outline• Google App Engine for Java (GAE/J) といろ  いろ組み合わせるとすごそうなので、  そのすごそうさ具合を説明します。• 最後に、簡単なデモとその作り方を紹  介します。
Agenda• GAE/J のいいところを紹介• Eclipse で開発環境を構築• GAE/J プロジェクトの実行• デモ:ゲストブック
What isGoogle App Engine?
Google App Engine
Google App Engine• 無料*の PaaS 環境(Python, Java, Go)• NoSQL データストア (BigTable)• いろいろなサービスへの API• そこそこ充実している管理画面  * いろいろな制限はありま...
GAE for Java   Duke の存在感www
GAE for Java可哀想なのでフレームをつけてあげましたw
Why GAE for Java?• Java は不滅!(あと10年くらいは……)• Google Web Toolkit (GWT) との親和性• VMware と Google のクラウド連携強化* -   Spring, Google A...
GAE/J      Specification• Servlet 2.5• JSP 2.2 (except Unified EL)• JSTL 1.1• JDO 2.3• JPA 1.0
Google Web Toolkit
Google Web Toolkit• Java で AJAX フロントエンドを記述• JavaScript にコンパイルして実行• クロスブラウザ(Internet Explorer 6 対応)• 豊富なウィジェット (3rd party: ...
http://www.sencha.com/examples/
BuildingDevelopmentEnvironment
Pre-required     Software• Java SE Development Kit 6• Google Chrome (optional)• 英語のドキュメントに負けない気持ち
Eclipse
Eclipse• いわずと知れた重厚長大な IDE• Google 推奨の GAE/J 開発環境• なんだかんだ言って便利• Eclipse IDE for Java EE Developers 推奨
or...orz じゃないですよ。
Pleiades All in Oneすみません、NetBeans じゃないです。個人的には NetBeans が好きです。
Pleiades All in One• 日本語化版 Eclipse +便利プラグイン• Pleiades = Eclipse プラグイン日本語化プラグイン• Pleiades All in One for Java Developers 推奨
Google Plugin for Eclipse
Google Plugin    for Eclipse• GAE/J & GWT 開発用プラグイン• ローカル実行用サーバー環境• GAE デプロイツール• GWT コンパイラ
Ex. Development   Environment• Windows XP Professional SP3• Java SE Development Kit 6 Update 31• Google Chrome 17.0• Pleia...
Installation Note  • Pleiades のインストールフォルダ*    推奨:C:¥pleiades    自分:C:¥Document and Settings¥takuya¥My Documents¥pleiades  ...
Google Plugin for Eclipse
RunningGAE/J Project
Create GAE Project1. Eclipse を起動2. ファイル>新規>プロジェクトをクリック3. Google>Web アプリケーション・プロジェクトをクリック4. Windows ファイアウォールの警告:ブロック解除5. 新規...
よくある Web アプリケーションのディレクトリ構成
Run Application1. 実行>実行をクリック2. http://localhost:8888/guestbook にアクセス•   エラーの場合、下記を設定*    1. プロジェクト>プロパティをクリック    2. 実行/デバッ...
Hello, world ですw
Demo Application   “Guestbook”** Google App Engine のサイトにあるチュートリアルをベースにしてつくってます。
http://ipu-tokyo.appspot.com
1. Specification• コメントの閲覧・投稿• Google アカウント対応• 通りすがりの投稿可能• エラー処理:空コメント
2. Page Design• 完成イメージを HTML で作成
CSS?なにそれ?おいしいの?
1	 <!DOCTYPE	 html>	 2	 <html>	 3	 <head>	 4	 <meta	 charset="UTF-8">	 5	 <title>Guestbook</title>	 6	 </head>	 7	 <body>	...
3. Google Account• Google アカウントでのログイン機能• ログイン状態による表示切り替え
ローカルではテスト用ログイン画面になります。
16	 public	 class	 GuestbookServlet	 extends	 HttpServlet	 {17	 	 	 	 	 public	 void	 doGet(HttpServletRequest	 request,	 ...
1	 <%@	 page	 contentType="text/html;charset=UTF-8"	 %>	 2	 <%@	 page	 trimDirectiveWhitespaces="true"	 %>	 3	 <%@	 taglib...
4. Comment Posting • HTML フォームからコメントを投稿 • JDO* でコメントを永続化 • エラー処理:空コメント* JDO (Java Data Objects) は、Java オブジェクトの永続性に関する仕様です。
ローカルでも管理画面があり、データストアが見れます。
4	 <!DOCTYPE	 html>	 5	 <html>	 6	 <head>	 7	 <meta	 charset="UTF-8">	 8	 <title>Guestbook</title>	 9	 </head>10	 <body>11...
39	 	 	 	 	 public	 void	 doPost(HttpServletRequest	 request,	 HttpServletResponse	 response)40	 	 	 	 	 	 	 	 	 	 	 	 	 t...
12	 @PersistenceCapable13	 public	 class	 Comment	 {14	 	 	 	 	 @PrimaryKey15	 	 	 	 	 @Persistent(valueStrategy	 =	 IdGen...
1	 package	 com.example.guestbook;	 2	 	 3	 import	 javax.jdo.JDOHelper;	 4	 import	 javax.jdo.PersistenceManagerFactory;	...
5. Comment List• コメントをリスト表示
10	 <body>11	 	 <h1>Guestbook</h1>12	 	 <%--	 ログインユーザーの有無で分岐	 --%>13	 	 <c:choose>14	 	 	 <c:when	 test="${empty	 user}">1...
20	 	 	 	 	 public	 void	 doGet(HttpServletRequest	 request,	 HttpServletResponse	 response)	 21	 	 	 	 	 	 	 	 	 	 	 	 	 ...
66	 	 	 	 	 public	 void	 doPost(HttpServletRequest	 request,	 HttpServletResponse	 response)	 67	 	 	 	 	 	 	 	 	 	 	 	 	...
Conclusion
Google App Engine for Java を使いましょう!単に制限のある Servlet & JSP コンテナじゃねーかという突っ込みはなしでw
次回機会があれば Google Web Toolkitすごいぜプレゼンやります   ちゃんと説明できるくらいに勉強しておきます。
もしくは Spring Rooすごいぜプレゼンやります こっちもちゃんと説明できるくらいに勉強しておきます。
というか、PaaS 勉強会を         開催しませんか?AWS Elastic Beanstalk も熱いですね。Windows Azure や Heroku も興味あります。  てか、PaaS 勉強会って絶対あると思うんで調べて参加しろ...
興味のある方は、Twitter @takuya0301 まで!
Thank you for listening!
Google App Engine for Java
Google App Engine for Java
Google App Engine for Java
Google App Engine for Java
Google App Engine for Java
Google App Engine for Java
Google App Engine for Java
Google App Engine for Java
Google App Engine for Java
Google App Engine for Java
Upcoming SlideShare
Loading in...5
×

Google App Engine for Java

5,849

Published on

Published in: Technology
0 Comments
2 Likes
Statistics
Notes
  • Be the first to comment

No Downloads
Views
Total Views
5,849
On Slideshare
0
From Embeds
0
Number of Embeds
0
Actions
Shares
0
Downloads
22
Comments
0
Likes
2
Embeds 0
No embeds

No notes for slide
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • Google App Engine for Java

    1. 1. Google App Engine for Java初めてなんだから・・・やさしくしてね?編 2012.3.24 つっちぃ @takuya0301
    2. 2. Outline• Google App Engine for Java (GAE/J) といろ いろ組み合わせるとすごそうなので、 そのすごそうさ具合を説明します。• 最後に、簡単なデモとその作り方を紹 介します。
    3. 3. Agenda• GAE/J のいいところを紹介• Eclipse で開発環境を構築• GAE/J プロジェクトの実行• デモ:ゲストブック
    4. 4. What isGoogle App Engine?
    5. 5. Google App Engine
    6. 6. Google App Engine• 無料*の PaaS 環境(Python, Java, Go)• NoSQL データストア (BigTable)• いろいろなサービスへの API• そこそこ充実している管理画面 * いろいろな制限はありますが、課金で制限を緩和できます。
    7. 7. GAE for Java Duke の存在感www
    8. 8. GAE for Java可哀想なのでフレームをつけてあげましたw
    9. 9. Why GAE for Java?• Java は不滅!(あと10年くらいは……)• Google Web Toolkit (GWT) との親和性• VMware と Google のクラウド連携強化* - Spring, Google App Engine, SpringSource Tool Suite - Spring Roo, Google Web Toolkit - Spring Insight, Google Speed Tracer* http://www.vmware.com/jp/company/news/releases/vmware-google.html
    10. 10. GAE/J Specification• Servlet 2.5• JSP 2.2 (except Unified EL)• JSTL 1.1• JDO 2.3• JPA 1.0
    11. 11. Google Web Toolkit
    12. 12. Google Web Toolkit• Java で AJAX フロントエンドを記述• JavaScript にコンパイルして実行• クロスブラウザ(Internet Explorer 6 対応)• 豊富なウィジェット (3rd party: Ext GWT*) * http://www.sencha.com/products/extgwt
    13. 13. http://www.sencha.com/examples/
    14. 14. BuildingDevelopmentEnvironment
    15. 15. Pre-required Software• Java SE Development Kit 6• Google Chrome (optional)• 英語のドキュメントに負けない気持ち
    16. 16. Eclipse
    17. 17. Eclipse• いわずと知れた重厚長大な IDE• Google 推奨の GAE/J 開発環境• なんだかんだ言って便利• Eclipse IDE for Java EE Developers 推奨
    18. 18. or...orz じゃないですよ。
    19. 19. Pleiades All in Oneすみません、NetBeans じゃないです。個人的には NetBeans が好きです。
    20. 20. Pleiades All in One• 日本語化版 Eclipse +便利プラグイン• Pleiades = Eclipse プラグイン日本語化プラグイン• Pleiades All in One for Java Developers 推奨
    21. 21. Google Plugin for Eclipse
    22. 22. Google Plugin for Eclipse• GAE/J & GWT 開発用プラグイン• ローカル実行用サーバー環境• GAE デプロイツール• GWT コンパイラ
    23. 23. Ex. Development Environment• Windows XP Professional SP3• Java SE Development Kit 6 Update 31• Google Chrome 17.0• Pleiades All in One for Java Developers (based on Eclipse Indigo 3.7.2)• Google Plugin for Eclipse* * Eclipse マーケットプレースからインストールする。
    24. 24. Installation Note • Pleiades のインストールフォルダ* 推奨:C:¥pleiades 自分:C:¥Document and Settings¥takuya¥My Documents¥pleiades • Google Plugin のインストール 1. Eclipse を起動 2. ヘルプ>Eclipse マーケットプレースをクリック 3. Google Plugin で検索してインストール* Windows では、パスが長いとインストール(ZIP の解凍)に失敗するそうです。
    25. 25. Google Plugin for Eclipse
    26. 26. RunningGAE/J Project
    27. 27. Create GAE Project1. Eclipse を起動2. ファイル>新規>プロジェクトをクリック3. Google>Web アプリケーション・プロジェクトをクリック4. Windows ファイアウォールの警告:ブロック解除5. 新規 Web アプリケーション・プロジェクトウィザード プロジェクト名:Guestbook パッケージ名:com.example.guestbook Google Web ツールキットを使用:使用しない
    28. 28. よくある Web アプリケーションのディレクトリ構成
    29. 29. Run Application1. 実行>実行をクリック2. http://localhost:8888/guestbook にアクセス• エラーの場合、下記を設定* 1. プロジェクト>プロパティをクリック 2. 実行/デバッグ設定>Guestbook>編集をクリック 3. 引数>VM 引数>につぎの引数を追加 -Dappengine.user.timezone=UTC * バグみたいです。(2012年3月17日現在)
    30. 30. Hello, world ですw
    31. 31. Demo Application “Guestbook”** Google App Engine のサイトにあるチュートリアルをベースにしてつくってます。
    32. 32. http://ipu-tokyo.appspot.com
    33. 33. 1. Specification• コメントの閲覧・投稿• Google アカウント対応• 通りすがりの投稿可能• エラー処理:空コメント
    34. 34. 2. Page Design• 完成イメージを HTML で作成
    35. 35. CSS?なにそれ?おいしいの?
    36. 36. 1 <!DOCTYPE html> 2 <html> 3 <head> 4 <meta charset="UTF-8"> 5 <title>Guestbook</title> 6 </head> 7 <body> 8 <h1>Guestbook</h1> 9 <p><a href="#">サインイン</a>するとコメントに名前が表示されます。</p>10 <p>こんにちは、takuya0301 さん。(<a href="#">サインアウト</a>)</p>11 <ul>12 <li>つっちぃ (@takuya0301) です。自己紹介して Twitter ID を晒しましょうw13 -- takuya0301 (2012-03-24 04:24:43)</li>14 </ul>15 <form method="POST" action="/guestbook">16 <input type="text" size="80">17 <input type="submit">18 </form>19 <p>エラー:コメントを入力してから送信ボタンをクリックしてください。</p>20 </body>21 </html> index.html
    37. 37. 3. Google Account• Google アカウントでのログイン機能• ログイン状態による表示切り替え
    38. 38. ローカルではテスト用ログイン画面になります。
    39. 39. 16 public class GuestbookServlet extends HttpServlet {17 public void doGet(HttpServletRequest request, HttpServletResponse response)18 throws IOException, ServletException {19 // User サービスの取得20 UserService userService = UserServiceFactory.getUserService();21 22 // ログイン中ユーザーの取得(ユーザーがいないときは null)23 User user = userService.getCurrentUser();24 25 // ログイン/ログアウト用 URL の生成(引数は戻り URL)26 String loginURL = userService.createLoginURL(request.getRequestURI());27 String logoutURL = userService.createLogoutURL(request.getRequestURI());28 29 request.setAttribute("user", user);30 request.setAttribute("loginURL", loginURL);31 request.setAttribute("logoutURL", logoutURL);32 33 request.getRequestDispatcher("/guestbook.jsp").forward(request, response);34 }35 } GuestbookServlet.java
    40. 40. 1 <%@ page contentType="text/html;charset=UTF-8" %> 2 <%@ page trimDirectiveWhitespaces="true" %> 3 <%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %> 4 <!DOCTYPE html> 5 <html> 6 <head> 7 <meta charset="UTF-8"> 8 <title>Guestbook</title> 9 </head>10 <body>11 <h1>Guestbook</h1>12 <%-- ログインユーザーの有無で分岐 --%>13 <c:choose>14 <c:when test="${empty user}">15 <p>16 <a href="${loginURL}">サインイン</a>するとコメントに名前が表示されます。17 </p>18 </c:when>19 <c:otherwise>20 <p>21 こんにちは、${user.nickname} さん。(<a href="${logoutURL}">サインアウト</a>)22 </p>23 </c:otherwise>24 </c:choose>25 </body>26 </html> guestbook.jsp
    41. 41. 4. Comment Posting • HTML フォームからコメントを投稿 • JDO* でコメントを永続化 • エラー処理:空コメント* JDO (Java Data Objects) は、Java オブジェクトの永続性に関する仕様です。
    42. 42. ローカルでも管理画面があり、データストアが見れます。
    43. 43. 4 <!DOCTYPE html> 5 <html> 6 <head> 7 <meta charset="UTF-8"> 8 <title>Guestbook</title> 9 </head>10 <body>11 <h1>Guestbook</h1>12 <%-- ログインユーザーの有無で分岐 --%>13 <c:choose>14 <c:when test="${empty user}">15 <p>16 <a href="${loginURL}">サインイン</a>するとコメントに名前が表示されます。17 </p>18 </c:when>19 <c:otherwise>20 <p>21 こんにちは、${user.nickname} さん。(<a href="${logoutURL}">サインアウト</a>)22 </p>23 </c:otherwise>24 </c:choose>25 <%-- コメント投稿フォーム --%>26 <form method="POST" action="/guestbook">27 <input type="text" name="comment" size="80"> <input type="submit">28 </form>29 <%-- 空コメントの場合、エラーメッセージを表示 --%>30 <c:if test="${isEmptyCommentError}">31 <p>エラー:コメントを入力してから送信ボタンをクリックしてください。</p>32 </c:if>33 </body>34 </html> guestbook.jsp
    44. 44. 39 public void doPost(HttpServletRequest request, HttpServletResponse response)40 throws IOException, ServletException {41 String comment = request.getParameter("comment");42 43 // エラー:空コメント44 if (comment.isEmpty()) {45 request.setAttribute("isEmptyCommentError", true);46 doGet(request, response);47 return;48 }49 50 UserService userService = UserServiceFactory.getUserService();51 User user = userService.getCurrentUser();52 53 String id = user != null ? user.getUserId() : "";54 String name = user != null ? user.getNickname() : "";55 Date postingDate = new Date();56 57 // コメントオブジェクトの生成58 Comment c = new Comment(id, name, comment, postingDate);59 60 // コメントオブジェクトの永続化61 PersistenceManager pm = PMF.get().getPersistenceManager();62 try {63 pm.makePersistent(c);64 } finally {65 pm.close();66 }67 68 doGet(request, response);69 } GuestbookServlet.java
    45. 45. 12 @PersistenceCapable13 public class Comment {14 @PrimaryKey15 @Persistent(valueStrategy = IdGeneratorStrategy.IDENTITY)16 private Key key;17 18 @Persistent19 private String id;20 21 @Persistent22 private String name;23 24 @Persistent25 private String comment;26 27 @Persistent28 private Date postingDate;29 30 public Comment(String id, String name, String comment, Date postingDate) {31 this.id = id;32 this.name = name;33 this.comment = comment;34 this.postingDate = postingDate;35 }36 // ゲッターメソッドが続く56 } Comment.java
    46. 46. 1 package com.example.guestbook; 2 3 import javax.jdo.JDOHelper; 4 import javax.jdo.PersistenceManagerFactory; 5 6 public final class PMF { 7 private static final PersistenceManagerFactory pmfInstance = 8 JDOHelper.getPersistenceManagerFactory("transactions-optional"); 9 10 private PMF() {}11 12 public static PersistenceManagerFactory get() {13 return pmfInstance;14 }15 } インスタンス生成処理負荷軽減のためのシングルトンラッパークラスです。 PMF.java
    47. 47. 5. Comment List• コメントをリスト表示
    48. 48. 10 <body>11 <h1>Guestbook</h1>12 <%-- ログインユーザーの有無で分岐 --%>13 <c:choose>14 <c:when test="${empty user}">15 <p><a href="${loginURL}">サインイン</a>するとコメントに名前が表示されます。</p>16 </c:when>17 <c:otherwise>18 <p>19 こんにちは、${user.nickname} さん。(<a href="${logoutURL}">サインアウト</a>)20 </p>21 </c:otherwise>22 </c:choose>23 <%-- コメント投稿フォーム --%>24 <form method="POST" action="/guestbook">25 <input type="text" name="comment" size="80"> <input type="submit">26 </form>27 <%-- 空コメントの場合、エラーメッセージを表示 --%>28 <c:if test="${isEmptyCommentError}">29 <p>エラー:コメントを入力してから送信ボタンをクリックしてください。</p>30 </c:if>31 <%-- コメントリスト --%>32 <ul>33 <c:if test="${not empty newComment}">34 <li>${newComment.comment} -- ${newComment.name} (${newComment.postingDate})</li>35 </c:if>36 <c:forEach var="comment" items="${comments}">37 <li>${comment.comment} -- ${comment.name} (${comment.postingDate})</li>38 </c:forEach>39 </ul>40 </body> guestbook.jsp
    49. 49. 20 public void doGet(HttpServletRequest request, HttpServletResponse response) 21 throws IOException, ServletException { /* user, loginURL, logoutURL などを request 属性に設定 */ 35 PersistenceManager pm = PMF.get().getPersistenceManager(); 36 try { 37 // コメントの取得 38 Query query = pm.newQuery(Comment.class); 39 query.setOrdering("postingDate desc"); 40 query.setFilter("postingDate < dateParam"); 41 query.declareParameters("java.util.Date dateParam"); 42 43 try { 44 // コメント投稿直後の特別処理 45 // コメントがデータストアに反映されていないこともあるので、 46 // 新しいコメントは独立して表示し、それ以前の投稿を取得する。 47 List<Comment> comments; 48 Comment newComment = (Comment) request.getAttribute("newComment"); 49 if (newComment != null) { 50 comments = ((List<Comment>) query.execute(newComment.getPostingDate())); 51 } else { 52 comments = (List<Comment>) query.execute(new Date()); 53 } 54 55 request.setAttribute("comments", comments); 56 57 request.getRequestDispatcher("/guestbook.jsp").forward(request, response); 58 } finally { 59 query.closeAll(); 60 } 61 } finally { 62 pm.close(); 63 } 64 } GuestbookServlet.java
    50. 50. 66 public void doPost(HttpServletRequest request, HttpServletResponse response) 67 throws IOException, ServletException { 68 // エラー:空コメント 69 String comment = request.getParameter("comment"); 70 if (comment.isEmpty()) { 71 request.setAttribute("isEmptyCommentError", true); 72 doGet(request, response); 73 return; 74 } 75 76 // User データの取得 77 UserService userService = UserServiceFactory.getUserService(); 78 User user = userService.getCurrentUser(); 79 80 String id = user != null ? user.getUserId() : ""; 81 String name = user != null ? user.getNickname() : ""; 82 Date postingDate = new Date(); 83 84 // コメントオブジェクトの生成 85 Comment newComment = new Comment(id, name, comment, postingDate); 86 87 // コメントオブジェクトの永続化 88 PersistenceManager pm = PMF.get().getPersistenceManager(); 89 try { 90 pm.makePersistent(newComment); 91 } finally { 92 pm.close(); 93 } 94 95 // 新しいコメントを属性として設定 96 request.setAttribute("newComment", newComment); 97 98 doGet(request, response); 99 } GuestbookServlet.java
    51. 51. Conclusion
    52. 52. Google App Engine for Java を使いましょう!単に制限のある Servlet & JSP コンテナじゃねーかという突っ込みはなしでw
    53. 53. 次回機会があれば Google Web Toolkitすごいぜプレゼンやります ちゃんと説明できるくらいに勉強しておきます。
    54. 54. もしくは Spring Rooすごいぜプレゼンやります こっちもちゃんと説明できるくらいに勉強しておきます。
    55. 55. というか、PaaS 勉強会を 開催しませんか?AWS Elastic Beanstalk も熱いですね。Windows Azure や Heroku も興味あります。 てか、PaaS 勉強会って絶対あると思うんで調べて参加しろって話ですね。
    56. 56. 興味のある方は、Twitter @takuya0301 まで!
    57. 57. Thank you for listening!
    1. A particular slide catching your eye?

      Clipping is a handy way to collect important slides you want to go back to later.

    ×