Google App Engine + Spring MVC、データストア低レベルAPIを使用したCRUDの例

低レベルAPIを使用して、Google App Engineデータストア、Java用のCRUDを実行するには、次のコードスニペットを参照してください。

追加

「名前」をキーとして顧客をデータストアに保管します。

    Key customerKey = KeyFactory.createKey("Customer", "your name");
    Entity customer = new Entity("Customer", customerKey);
    customer.setProperty("name", "your name");
    customer.setProperty("email", "your email");

    DatastoreService datastore = DatastoreServiceFactory.getDatastoreService();
    datastore.put(customer);//save it

検索

10人の顧客をリストとして返します。

    DatastoreService datastore = DatastoreServiceFactory.getDatastoreService();
    Query query = new Query("Customer").addSort("date", Query.SortDirection.DESCENDING);
    List<Entity> customers = datastore.prepare(query).asList(FetchOptions.Builder.withLimit(10));

一致するフィルタを使用して顧客を検索して返します。

    Query query = new Query("Customer");
    query.addFilter("name", FilterOperator.EQUAL, "your name");
    PreparedQuery pq = datastore.prepare(query);
    Entity customer = pq.asSingleEntity();
  • FilterOperator.EQUAL ** +このフィルタを再生すると、より小さい、より大きいなどの条件オプションはほとんどありません。

アップデート

更新するには、既存のエンティティを変更してもう一度保存します。

    Query query = new Query("Customer");
    query.addFilter("name", FilterOperator.EQUAL, "your name");
    PreparedQuery pq = datastore.prepare(query);
    Entity customer = pq.asSingleEntity();

    customer.setProperty("name", name);
    customer.setProperty("email", email);

    DatastoreService datastore = DatastoreServiceFactory.getDatastoreService();
        datastore.put(customer);//GAE will know save or update

削除

削除するには、エンティティキーが必要です。

    Query query = new Query("Customer");
    query.addFilter("name", FilterOperator.EQUAL, name);
    PreparedQuery pq = datastore.prepare(query);
    Entity customer = pq.asSingleEntity();

    DatastoreService datastore = DatastoreServiceFactory.getDatastoreService();
    datastore.delete(customer.getKey());//delete it

GAE Spring MVC CRUDの例

ここで、Spring MVCをRESTスタイルで開発し、上記の低レベルのAPIを使用してGoogle App Engineデータストアのデータを操作する簡単なWebアプリケーションを紹介します。

  1. Google App Engine Java SDK 1.6.3.1

  2. Spring 3.1.1

  3. JDK 1.6

  4. Eclipse用Eclipse 3.7 Google Plugin

    • 注意** この例では、CRUDのみの実行方法、DAOやBOなどのレイヤーの表示、成功または失敗したアクションの検証やメッセージ通知は表示されません。

1.スプリングコントローラ

Webページを表示してCRUDを実行するためのSpringコントローラ、RESTスタイルコードは自明でなければなりません。

File:CustomerController.java

package com.mkyong.controller;

import java.util.Date;
import java.util.List;

import javax.servlet.http.HttpServletRequest;

import org.springframework.stereotype.Controller;
import org.springframework.ui.ModelMap;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.servlet.ModelAndView;

import com.google.appengine.api.datastore.DatastoreService;
import com.google.appengine.api.datastore.DatastoreServiceFactory;
import com.google.appengine.api.datastore.Entity;
import com.google.appengine.api.datastore.FetchOptions;
import com.google.appengine.api.datastore.Key;
import com.google.appengine.api.datastore.KeyFactory;
import com.google.appengine.api.datastore.PreparedQuery;
import com.google.appengine.api.datastore.Query;
import com.google.appengine.api.datastore.Query.FilterOperator;

@Controller
@RequestMapping("/customer")
public class CustomerController {

    @RequestMapping(value="/addCustomerPage", method = RequestMethod.GET)
    public String getAddCustomerPage(ModelMap model) {

        return "add";

    }

    @RequestMapping(value="/add", method = RequestMethod.POST)
    public ModelAndView add(HttpServletRequest request, ModelMap model) {

        String name = request.getParameter("name");
        String email = request.getParameter("email");

            Key customerKey = KeyFactory.createKey("Customer", name);

        Date date = new Date();
                Entity customer = new Entity("Customer", customerKey);
                customer.setProperty("name", name);
                customer.setProperty("email", email);
                customer.setProperty("date", date);

                DatastoreService datastore = DatastoreServiceFactory.getDatastoreService();
                datastore.put(customer);

                return new ModelAndView("redirect:list");

    }

    @RequestMapping(value="/update/{name}", method = RequestMethod.GET)
    public String getUpdateCustomerPage(@PathVariable String name,
            HttpServletRequest request, ModelMap model) {

        DatastoreService datastore = DatastoreServiceFactory.getDatastoreService();
        Query query = new Query("Customer");
        query.addFilter("name", FilterOperator.EQUAL, name);
        PreparedQuery pq = datastore.prepare(query);

        Entity e = pq.asSingleEntity();
        model.addAttribute("customer",  e);

        return "update";

    }

    @RequestMapping(value="/update", method = RequestMethod.POST)
    public ModelAndView update(HttpServletRequest request, ModelMap model) {

        DatastoreService datastore = DatastoreServiceFactory.getDatastoreService();

        String name = request.getParameter("name");
        String email = request.getParameter("email");
        String originalName =  request.getParameter("originalName");

        Query query = new Query("Customer");
        query.addFilter("name", FilterOperator.EQUAL, originalName);
        PreparedQuery pq = datastore.prepare(query);
        Entity customer = pq.asSingleEntity();

        customer.setProperty("name", name);
        customer.setProperty("email", email);
        customer.setProperty("date", new Date());

                datastore.put(customer);

              //return to list
               return new ModelAndView("redirect:list");

    }

    @RequestMapping(value="/delete/{name}", method = RequestMethod.GET)
    public ModelAndView delete(@PathVariable String name,
            HttpServletRequest request, ModelMap model) {

                DatastoreService datastore = DatastoreServiceFactory.getDatastoreService();

                Query query = new Query("Customer");
        query.addFilter("name", FilterOperator.EQUAL, name);
        PreparedQuery pq = datastore.prepare(query);
        Entity customer = pq.asSingleEntity();

                datastore.delete(customer.getKey());

               //return to list
                return new ModelAndView("redirect:../list");

    }

   //get all customers
    @RequestMapping(value="/list", method = RequestMethod.GET)
    public String listCustomer(ModelMap model) {

        DatastoreService datastore = DatastoreServiceFactory.getDatastoreService();
        Query query =
                      new Query("Customer").addSort("date", Query.SortDirection.DESCENDING);
            List<Entity> customers =
                      datastore.prepare(query).asList(FetchOptions.Builder.withLimit(10));

            model.addAttribute("customerList",  customers);

        return "list";

    }

}

2. JSPページ

3 JSPページで顧客を表示し、追加および更新を実行します。

File:list.jsp

<%@ page import="java.util.List" %>
<%@ page import="com.google.appengine.api.datastore.Entity" %>
<html>
<body>
    <h1>GAE + Spring 3 MVC REST + CRUD Example</h1>

    Function : <a href="addCustomerPage">Add Customer</a>
    <hr/>

    <h2>All Customers</h2>
    <table border="1">
        <thead>
            <tr>
                <td>Name</td>
                <td>Email</td>
                <td>Created Date</td>
                <td>Action</td>
            </tr>
        </thead>
        <%

            List<Entity> customers = (List<Entity>)request.getAttribute("customerList");
            for(Entity e : customers){

        %>
            <tr>
              <td><%=e.getProperty("name") %></td>
              <td><%=e.getProperty("email") %></td>
              <td><%=e.getProperty("date") %></td>
              <td><a href="update/<%=e.getProperty("name")%>">Update</a>
                             | <a href="delete/<%=e.getProperty("name")%>">Delete</a></td>
            </tr>
        <%
            }
        %>
    </table>

</body>
</html>

ファイル:and.jsp

<html>
<body>
    <h1>Add Customer</h1>

    <form method="post" action="add" >
        <table>
            <tr>
                <td>
                    UserName :
                </td>
                <td>
                    <input type="text" style="width: 185px;"
                                              maxlength="30" name="name" id="name"/>
                </td>
            </tr>
            <tr>
                <td>
                    Email :
                </td>
                <td>
                    <input type="text" style="width: 185px;"
                                            maxlength="30" name="email" id="email"/>
                </td>
            </tr>
        </table>
        <input type="submit" class="save" title="Save" value="Save"/>
    </form>

</body>
</html>

File:update.jsp

<%@ page import="com.google.appengine.api.datastore.Entity" %>
<html>
<body>
    <h1>Update Customer</h1>

    <%
        Entity customer = (Entity)request.getAttribute("customer");
    %>

    <form method="post" action="../update" >
        <input type="hidden" name="originalName" id="originalName"
            value="<%=customer.getProperty("name") %>"/>

        <table>
            <tr>
                <td>
                    UserName :
                </td>
                <td>
                    <input type="text" style="width: 185px;"
                                             maxlength="30" name="name" id="name"
                        value="<%=customer.getProperty("name") %>"/>
                </td>
            </tr>
            <tr>
                <td>
                    Email :
                </td>
                <td>
                    <input type="text" style="width: 185px;"
                                            maxlength="30" name="email" id="email"
                        value="<%=customer.getProperty("email") %>"/>
                </td>
            </tr>
        </table>
        <input type="submit" class="update" title="Update" value="Update"/>
    </form>

</body>
</html>

3.春の設定

Springコントローラをスキャンし、ビューリゾルバを設定して、ビューをjspページにリダイレクトできるようにします。

File:mvc-dispatcher-servlet.xml

<beans xmlns="http://www.springframework.org/schema/beans"
    xmlns:context="http://www.springframework.org/schema/context"
    xmlns:mvc="http://www.springframework.org/schema/mvc"
        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="
        http://www.springframework.org/schema/beans
        http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
        http://www.springframework.org/schema/context
        http://www.springframework.org/schema/context/spring-context-3.0.xsd
        http://www.springframework.org/schema/mvc
        http://www.springframework.org/schema/mvc/spring-mvc-3.0.xsd">

    <context:component-scan base-package="com.mkyong.controller"/>
    <mvc:annotation-driven/>

    <bean
        class="org.springframework.web.servlet.view.InternalResourceViewResolver">
        <property name="prefix">
            <value>/pages/</value>
        </property>
        <property name="suffix">
            <value>.jsp</value>
        </property>
    </bean>

</beans>

4.春を統合する

SpringをWebアプリケーションに統合する。

File: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>mvc-dispatcher</servlet-name>
        <servlet-class>
                      org.springframework.web.servlet.DispatcherServlet
                </servlet-class>
        <load-on-startup>1</load-on-startup>
    </servlet>

    <servlet-mapping>
        <servlet-name>mvc-dispatcher</servlet-name>
        <url-pattern>/</url-pattern>
    </servlet-mapping>

    <context-param>
        <param-name>contextConfigLocation</param-name>
        <param-value>/WEB-INF/mvc-dispatcher-servlet.xml</param-value>
    </context-param>

    <listener>
        <listener-class>
                   org.springframework.web.context.ContextLoaderListener
                </listener-class>
    </listener>

    <welcome-file-list>
        <welcome-file>index.html</welcome-file>
    </welcome-file-list>
</web-app>

5.デモ

完了し、デモを見て、Webアプリケーションのワークフローを表示します。

{空} 1。既存の顧客のリストを表示するリストページ。

URL:http://localhost:8888/customer/list

画像://wp-content/uploads/2012/05/gae-springmvc-crud-list-1.png[gae spring mvc crudの例 - リスト、タイトル= "gae-springmvc-crud-list-1"、width = 600、高さ= 449]

{空} 2。リスティングページで、[顧客の追加]リンクをクリックして顧客追加ページを表示し、新しい顧客を記入して[追加]ボタンをクリックします。

URL:http://localhost:8888/customer/addCustomerPage

gae spring mvc crudの例 -  add、title = "gae-springmvc-crud-add-2"、width = 600、高さ= 449

{空} 3。顧客を保存すると、リスティングページに戻ります。

URL:http://localhost:8888/customer/list

gae spring mvc crud example  -  list、title = "gae-springmvc-crud-list-3"、width = 600、高さ= 449

{空} 4。更新リンクを試すと、選択した顧客のデータが表示され、電子メールアドレスが更新され、更新ボタンがクリックされます。

URL:http://localhost:8888/customer/update/mkyong

gae spring mvc crud example  -  update、title = "gae-springmvc-crud-update-4"、width = 600、高さ= 449

{空} 5。電子メールが更新され、リスティングページにリダイレクトされます。

URL:http://localhost:8888/customer/list

gae spring mvc crud example  -  list、title = "gae-springmvc-crud-list-5"、width = 600、高さ= 449

{空} 6。顧客を削除するには、「削除」リンクをクリックしてください。

ソースコードをダウンロードする

ファイルサイズが大きいため、すべてのSpring MVCおよびGAE jarは除外されます。

ダウンロード: GoogleAppEngine-SpringMVC-datastore.zip (17 KB)