この項目ではGoogle アカウントと統合されたアプリを作成するので、ユーザーは自分のGoogle アカウントを使ってアプリにログインできます。 アプリはApp Engine Users サービスを使ってGoogle アカウントと統合することができます。 これを使って、アプリの挨拶文をパーソナライズできます。
以下は、この項目が完了した時にできるアプリです:
リクエストハンドラを実装するための二つの方法を見ていきましょう:
では、簡単な JSP テンプレートを使って始めてみましょう。guestbook/src/main/webapp
内で、中身が以下のようになっているguestbook.jsp
という名前のファイルを作成します。:
<%@ page contentType="text/html;charset=UTF-8" language="java" %> <%@ page import="com.google.appengine.api.users.User" %> <%@ page import="com.google.appengine.api.users.UserService" %> <%@ page import="com.google.appengine.api.users.UserServiceFactory" %> <%@ page import="java.util.List" %> <%@ taglib prefix="fn" uri="http://java.sun.com/jsp/jstl/functions" %> <html> <head> <link type="text/css" rel="stylesheet" href="/stylesheets/main.css"/> </head> <body> <% String guestbookName = request.getParameter("guestbookName"); if (guestbookName == null) { guestbookName = "default"; } pageContext.setAttribute("guestbookName", guestbookName); UserService userService = UserServiceFactory.getUserService(); User user = userService.getCurrentUser(); if (user != null) { pageContext.setAttribute("user", user); %> <p>Hello, ${fn:escapeXml(user.nickname)}! (You can <a href="<%= userService.createLogoutURL(request.getRequestURI()) %>">sign out</a>.)</p> <% } else { %> <p>Hello! <a href="<%= userService.createLoginURL(request.getRequestURI()) %>">Sign in</a> to include your name with greetings you post.</p> <% } %> <form action="/guestbook.jsp" method="get"> <div><input type="text" name="guestbookName" value="${fn:escapeXml(guestbookName)}"/></div> <div><input type="submit" value="Switch Guestbook"/></div> </form> </body> </html>
既定では、webapp/
内やWEB-INF/
以外のサブディレクトリ内にあるファイル拡張子.jsp
を持つファイルは、
ファイル名を含む .jsp
へのパスで構成されたURLパスに自動的に紐付けられます。
この JSP ファイルは自動的に/guestbook.jsp
のURLに紐付けられます。
このJSP ではApp Engine Users
サービス用のライブラリをインポートし、そのサービスを呼び出してユーザーがログインしているかを判別し、
ユーザーの"ニックネーム" を取得し、ユーザーがログインやログアウトする際に使うURLを計算します。
このテンプレートでは CSS ファイルを使用します。guestbook/src/main/webapp
内にstylesheets
という名前のディレクトリを作成してください。
この新ディレクトリ内で、中身が以下のようになっているmain.css
という名前のファイルを作成します:
body { font-family: Verdana, Helvetica, sans-serif; background-color: #FFFFCC; }
特に変更しなくても、App Engine デベロップサーバ上でこのJSP ファイルをテストできます。
guestbook
ディレクトリから以下の Maven コマンドを実行します:
mvn appengine:devserver
以下のような成功のメッセージが表示されるまで待ちます:
[INFO] INFO: Module instance default is running at http://localhost:8080/
[INFO] Apr 29, 2015 3:28:38 PM com.google.appengine.tools.development.AbstractModule startup
[INFO] INFO: The admin console is running at http://localhost:8080/_ah/admin
[INFO] Apr 29, 2015 3:28:38 PM com.google.appengine.tools.development.DevAppServerImpl doStart
[INFO] INFO: Dev App Server is now running
ブラウザで以下のURLを開きます:
http://localhost:8080/guestbook.jsp
このアプリでは、ログインを促すページを表示します。 "Sign in" リンクをクリックすると、任意のEメールアドレスでログインします。 デベロップメントサーバは、テストのためにGoogle アカウントのログイン処理をエミュレートします。 ログインすると、アプリはあなたが入力したEメールアドレスと挨拶文を表示します。
http://localhost:8080 (パスを付けず)URLを開くとエラーが返るのが分かるでしょう。
今のところは、guestbook/src/main/webapp/
内でこのファイルを作成することで、/guestbook.jsp
URLパスのハンドラのみを定義しています。
次の項目では、さらにURハンドラを設定します。
ControlキーとCキーを押すことでデベロップメントサーバを終了できます。
App Engine Java アプリケーションはJava Servlet APIを使ってウェブサーバとやり取りできます。 前述のように、JSP ファイルは自身のファイル名に似たURLパスに紐付けられたサーブレットとして動作します。 Java servletクラスを使ってサーブレットを実装することもできます。 servlet クラスはjavax.servlet.GenericServlet クラスや javax.servlet.http.HttpServlet クラスに継承されています。
guestbook/src/main/java
ディレクトリ内では、com/example/guestbook
と呼ばれるサーブレットクラス用のパッケージパスを作成します。
Linux や Mac OS Xでは、以下のコマンドが実行できます:
mkdir -p com/example/guestbook
この新ディレクトリ内で、以下のような中身の GuestbookServlet.java
という名前のファイルを作成します。:
package com.example.guestbook; import com.google.appengine.api.users.User; import com.google.appengine.api.users.UserService; import com.google.appengine.api.users.UserServiceFactory; import java.io.IOException; import java.util.Properties; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; public class GuestbookServlet extends HttpServlet { @Override public void doGet(HttpServletRequest req, HttpServletResponse resp) throws IOException { if (req.getParameter("testing") == null) { resp.setContentType("text/plain"); resp.getWriter().println("Hello, this is a testing servlet. "); Properties p = System.getProperties(); p.list(resp.getWriter()); } else { UserService userService = UserServiceFactory.getUserService(); User currentUser = userService.getCurrentUser(); if (currentUser != null) { resp.setContentType("text/plain"); resp.getWriter().println("Hello, " + currentUser.getNickname()); } else { resp.sendRedirect(userService.createLoginURL(req.getRequestURI())); } } } }
この時点で、あなたのプロジェクトのディレクトリ構造は以下のようになります:
サーブレットエンジンは、各サーブレットクラスへのURLパスを知っている必要があります。
デプロイメントディスクリプタ(web.xml
という名前のファイル)を使ってこれを設定します。
guestbook/src/main/webapp/WEB-INF
ディレクトリ内に web.xml
を置き、このファイルを以下のような中身になるよう編集します:
<?xml version="1.0" encoding="utf-8"?> <web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xmlns:web="http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" version="2.5"> <servlet> <servlet-name>guestbook</servlet-name> <servlet-class>com.example.guestbook.GuestbookServlet</servlet-class> </servlet> <servlet-mapping> <servlet-name>guestbook</servlet-name> <url-pattern>/guestbook</url-pattern> </servlet-mapping> <welcome-file-list> <welcome-file>guestbook.jsp</welcome-file> </welcome-file-list> </web-app>
デプロイメントディスクリプタは三つのことを行います:
<servlet>
ディレクティブで、GuestbookServlet
クラスは guestbook
という名前のサーブレットだと宣言します。<servlet-mapping>
ディレクティブで、guestbook
サーブレットと URL パス /guestbook
を関連付けます。<welcome-file-list>
ディレクティブで、あなたが作成したJSP ファイルを使ってホームページ宛のリクエストを処理するよう、サーバに指示します。デベロップメントサーバがまだ起動している場合はControl-Cキーで停止させ、
それから再起動します。(再び guestbook
ディレクトリから起動します):
mvn appengine:devserver
GuestbookServlet
クラスの結果を表示するために、/guestbook
URLを開きます:
http://localhost:8080/guestbook
以下のサーブレットでは、getParameter()
メソッドでクエリーパラメータを読み取る方法のデモンストレーションをしています。
URLに testing
パラメータを追加してこれを試してみてください。:
http://localhost:8080/guestbook?testing
ルートURL(/
) を開いてこのホームページに現在使用されているJSPファイルを表示することもできます:
次の項目に進み、永続的なデータストレージ機能をguestbook アプリに追加します。