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]