Google App Engine JDO Spring MVC、CRUDの例
Java Data Objects(JDO)
を使用して、GAEデータストアでCRUDを実行するには、次のコードスニペットを参照してください。
JDOアノテーション
で顧客に注釈を付け、
PersistenceManager
を介してCRUDを実行してください。
追加
Customer c = new Customer(); c.setName(name); PersistenceManager pm = PMF.get().getPersistenceManager(); try { pm.makePersistent(c); } finally { pm.close(); }
検索
name == “mkyong”のところで “Customer”を検索してください。
PersistenceManager pm = PMF.get().getPersistenceManager(); Query q = pm.newQuery(Customer.class); q.setFilter("name == nameParameter"); q.setOrdering("date desc"); q.declareParameters("String nameParameter"); try { List<Customer> results = (List<Customer>) q.execute("mkyong"); //... } finally { q.closeAll(); pm.close(); }
名前== “mkyong”とメール== ”
[email protected]
“の “Customer”を検索してください。
Query q = pm.newQuery(Customer.class); q.setOrdering("date desc"); q.setFilter("name == nameParameter && email == emailParameter"); q.declareParameters("String nameParameter, String emailParameter"); try { List<Customer> results = (List<Customer>) q.execute("mkyong", "[email protected]"); //... } finally { q.closeAll(); pm.close(); }
顧客レコードのリストを返します。
PersistenceManager pm = PMF.get().getPersistenceManager(); Query q = pm.newQuery(Customer.class); q.setOrdering("date desc"); List<Customer> results = null; try { results = (List<Customer>) q.execute(); if (!results.isEmpty()) { //good for listing } } finally { q.closeAll(); pm.close(); }
アップデート
更新するには、既存のオブジェクトを取得して変更します。
PersistenceManager pm = PMF.get().getPersistenceManager(); try { Customer c = pm.getObjectById(Customer.class, key); c.setName(name); c.setEmail(email); c.setDate(new Date()); } finally { pm.close(); }
削除
PersistenceManager pm = PMF.get().getPersistenceManager(); try { Customer c = pm.getObjectById(Customer.class, key); pm.deletePersistent(c); } finally { pm.close(); }
GAE + Spring MVC + CRUDの例
ここでは、JDOを使用してデータストアにデータを格納する、RESTスタイルのSpring MVCを使用して開発された単純なWebアプリケーションを示します。
-
Google App Engine Java SDK 1.6.3.1、JDO 2.3
-
Spring 3.1.1
-
JDK 1.6
-
Eclipse用Eclipse 3.7 Google Plugin
__P.S Google Plugin for Eclipseを使用してWebアプリケーションプロジェクトテンプレートを作成すると、自動的に `jdoconfig.xml`が作成され設定されます。
-
Note ** +この例では、JDOを使ってCRUDのみを実行する方法、DAOやBOなどのレイヤーを使用しない方法、成功または失敗したアクションの検証やメッセージ通知をできるだけシンプルにしています。
1.顧客
JDOアノテーションでCustomerオブジェクトに注釈を付ける。
package com.mkyong.model; import java.util.Date; import javax.jdo.annotations.IdGeneratorStrategy; import javax.jdo.annotations.PersistenceCapable; import javax.jdo.annotations.Persistent; import javax.jdo.annotations.PrimaryKey; import com.google.appengine.api.datastore.Key; @PersistenceCapable public class Customer { @PrimaryKey @Persistent(valueStrategy = IdGeneratorStrategy.IDENTITY) private Key key; @Persistent private String name; @Persistent private String email; @Persistent private Date date; //getter and setter methods }
2. PersistenceManager
シングルトンのPersistenceManagerクラスを作成します。
package com.mkyong; import javax.jdo.JDOHelper; import javax.jdo.PersistenceManagerFactory; public final class PMF { private static final PersistenceManagerFactory pmfInstance = JDOHelper .getPersistenceManagerFactory("transactions-optional"); private PMF() { } public static PersistenceManagerFactory get() { return pmfInstance; } }
3.スプリングコントローラ
Springコントローラ、RESTスタイルは、CRUD操作を実行します。コードは自明でなければなりません。
File:CustomerController.java
package com.mkyong.controller; import java.util.Date; import java.util.List; import javax.jdo.PersistenceManager; import javax.jdo.Query; 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.mkyong.PMF; import com.mkyong.model.Customer; @Controller @RequestMapping("/customer") public class CustomerController { @RequestMapping(value = "/add", 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"); Customer c = new Customer(); c.setName(name); c.setEmail(email); c.setDate(new Date()); PersistenceManager pm = PMF.get().getPersistenceManager(); try { pm.makePersistent(c); } finally { pm.close(); } return new ModelAndView("redirect:list"); } @RequestMapping(value = "/update/{name}", method = RequestMethod.GET) public String getUpdateCustomerPage(@PathVariable String name, HttpServletRequest request, ModelMap model) { PersistenceManager pm = PMF.get().getPersistenceManager(); Query q = pm.newQuery(Customer.class); q.setFilter("name == nameParameter"); q.setOrdering("date desc"); q.declareParameters("String nameParameter"); try { List<Customer> results = (List<Customer>) q.execute(name); if (results.isEmpty()) { model.addAttribute("customer", null); } else { model.addAttribute("customer", results.get(0)); } } finally { q.closeAll(); pm.close(); } return "update"; } @RequestMapping(value = "/update", method = RequestMethod.POST) public ModelAndView update(HttpServletRequest request, ModelMap model) { String name = request.getParameter("name"); String email = request.getParameter("email"); String key = request.getParameter("key"); PersistenceManager pm = PMF.get().getPersistenceManager(); try { Customer c = pm.getObjectById(Customer.class, key); c.setName(name); c.setEmail(email); c.setDate(new Date()); } finally { pm.close(); } //return to list return new ModelAndView("redirect:list"); } @RequestMapping(value = "/delete/{key}", method = RequestMethod.GET) public ModelAndView delete(@PathVariable String key, HttpServletRequest request, ModelMap model) { PersistenceManager pm = PMF.get().getPersistenceManager(); try { Customer c = pm.getObjectById(Customer.class, key); pm.deletePersistent(c); } finally { pm.close(); } //return to list return new ModelAndView("redirect:../list"); } //get all customers @RequestMapping(value = "/list", method = RequestMethod.GET) public String listCustomer(ModelMap model) { PersistenceManager pm = PMF.get().getPersistenceManager(); Query q = pm.newQuery(Customer.class); q.setOrdering("date desc"); List<Customer> results = null; try { results = (List<Customer>) q.execute(); if (results.isEmpty()) { model.addAttribute("customerList", null); } else { model.addAttribute("customerList", results); } } finally { q.closeAll(); pm.close(); } return "list"; } }
4. JSPページ
JSPページで顧客を表示し、追加、更新、削除を実行します。
File:list.jsp
<%@ page import="java.util.List" %> <%@ page import="com.mkyong.model.Customer" %> <%@ page import="com.google.appengine.api.datastore.KeyFactory" %> <html> <body> <h1>GAE + Spring 3 MVC REST + CRUD Example with JDO</h1> Function : <a href="add">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> <% if(request.getAttribute("customerList")!=null){ List<Customer> customers = (List<Customer>)request.getAttribute("customerList"); if(!customers.isEmpty()){ for(Customer c : customers){ %> <tr> <td><%=c.getName() %></td> <td><%=c.getEmail() %></td> <td><%=c.getDate() %></td> <td><a href="update/<%=c.getName()%>">Update</a> | <a href="delete/<%=KeyFactory.keyToString(c.getKey()) %>"> Delete</a> </td> </tr> <% } } } %> </tr> </table> </body> </html>
File:add.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"/></span></td> </tr> <tr> <td>Email :</td> <td><input type="text" style="width: 185px;" maxlength="30" name="email" id="email"/></span></td> </tr> </table> <input type="submit" class="save" title="Save" value="Save"/> </form> </body> </html>
File:update.jsp
<%@ page import="com.mkyong.model.Customer" %> <%@ page import="com.google.appengine.api.datastore.KeyFactory" %> <html> <body> <h1>Update Customer</h1> <% Customer customer = new Customer(); if(request.getAttribute("customer")!=null){ customer = (Customer)request.getAttribute("customer"); } %> <form method="post" action="../update" > <input type="hidden" name="key" id="key" value="<%=KeyFactory.keyToString(customer.getKey()) %>"/> <table> <tr> <td> UserName : </td> <td> <input type="text" style="width: 185px;" maxlength="30" name="name" id="name" value="<%=customer.getName() %>"/> </td> </tr> <tr> <td> Email : </td> <td> <input type="text" style="width: 185px;" maxlength="30" name="email" id="email" value="<%=customer.getEmail() %>"/> </td> </tr> </table> <input type="submit" class="update" title="Update" value="Update"/> </form> </body> </html>
5.デモ
完了、Webアプリケーションのワークフローを示すデモをご覧ください。
{空} 1。既存の顧客のリストを表示するリストページ。
URL:http://localhost:8888/customer/list
{空} 2。リスティングページで、[顧客の追加]リンクをクリックして表示します
顧客の追加ページ、新規顧客の入力、name = ”
mkyong
“、email
= ”
[email protected]
“をクリックし、 “追加”ボタンをクリックします。
URL:http://localhost:8888/customer/add
{空} 3。顧客を保存すると、リスティングページに戻ります。
URL:http://localhost:8888/customer/list
{空} 4。更新リンクを試すと、選択した顧客のデータが表示され、電子メールが「
[email protected]
」に更新され、更新ボタンをクリックします。
URL:http://localhost:8888/customer/update/mkyong
{空} 5。電子メールが更新され、リスティングページにリダイレクトされます。
URL:http://localhost:8888/customer/list
{空} 6。顧客を削除するには、「削除」リンクをクリックしてください。
ソースコードをダウンロードする
ファイルサイズが大きいため、すべてのSpring MVCおよびGAE jarは除外されます。
ダウンロード:
GAE-SpringMVC-JDO-example.zip
(22 KB)
参考文献
オブジェクト(JDO)]。
https://developers.google.com/appengine/docs/java/datastore/jdo/
[GAE:
JDOを使う]。
https://developers.google.com/appengine/docs/java/javadoc/com/google/appengine/api/datastore/package-summary
[GAE
: datastore low-level api].
http://digitalsanctum.com/2009/07/02/google-app-engine-for-java-crud-with-jdo-spring-mvc/
[GAE
: CRUD Operations with JDO and Spring MVC]