とりあえずデータを登録してみる。
前回に言っていた
「わかりやすくデータを登録します」
といっていたのを今やります。
土日は親戚に会ったり、バッシュ買ったりなんやかんやで
eclipse触りませんでした。(ずっとやりたかった・・・・)
さて、翻訳ではロジックと画面が混在してて
damePGなりには満足できません。
という話の続き。
なので、ロジックはロジック!!
画面は画面で分けます。
まず画面みてください。
ここで使うのは以前に作成した、dame掲示板です。
これをDataStoreを使用します
え〜吟じます。
Servletです。
ここは何もありません。
package bbs; import java.io.IOException; import java.util.Date; import java.util.Iterator; import java.util.List; import javax.servlet.ServletException; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import com.google.appengine.api.users.User; import com.google.appengine.api.users.UserService; import com.google.appengine.api.users.UserServiceFactory; public class BbsServlet extends HttpServlet { @Override protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { resp.setContentType("text/html; charset=Shift_JIS"); List list = BbsDto.findAll(); req.setAttribute("bbsData", list); req.getRequestDispatcher("/bbs.jsp").forward(req, resp); } @Override protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { BbsDto dto = new BbsDto(); req.setCharacterEncoding("Shift_JIS"); dto.setName(req.getParameter("name")); dto.setTitle(req.getParameter("title")); dto.setText(req.getParameter("text")); dto.setDate(new Date(new java.util.Date().getTime())); BbsDto.save(dto); doGet(req,resp); } }
ここからが肝ッ!!
Databaseに値を突っ込むときはConnectionを取得します。
その代わりと思ってもらえればいいかも・・・
GAP(JDO)はPersistenceManagerFactoryというのを使って値を書き込みます。
package bbs; import javax.jdo.JDOHelper; import javax.jdo.PersistenceManagerFactory; public class PMUtils { private static final PersistenceManagerFactory pm = JDOHelper.getPersistenceManagerFactory("transactions-optional"); public static PersistenceManagerFactory getPM() { return pm; } }
以前やったクラスでゆうとConnectionUtilってのを作成したんだけど、
それと一緒。
以下のクラスと同じようなものと思ってます。
package shop.dao; import java.sql.Connection; import java.sql.DriverManager; public class ConnectionUtil { public static Connection getConnection() { try { Class.forName("org.gjt.mm.mysql.Driver"); Connection con = DriverManager.getConnection ("jdbc:mysql://localhost/test", "root", "mysql"); return con; } catch (Exception e) { throw new RuntimeException(e); } } }
で、getPersistenceManagerFactoryで指定している"transactions-optional"は
META-INF/jdoconfig.xmlで定義されています。
僕はここがわかっていないのでもう少し調べないとだめです。
<?xml version="1.0" encoding="utf-8"?> <jdoconfig xmlns="http://java.sun.com/xml/ns/jdo/jdoconfig" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="http://java.sun.com/xml/ns/jdo/jdoconfig"> <persistence-manager-factory name="transactions-optional"> <property name="javax.jdo.PersistenceManagerFactoryClass" value="org.datanucleus.store.appengine.jdo.DatastoreJDOPersistenceManagerFactory"/> <property name="javax.jdo.option.ConnectionURL" value="appengine"/> <property name="javax.jdo.option.NontransactionalRead" value="true"/> <property name="javax.jdo.option.NontransactionalWrite" value="true"/> <property name="javax.jdo.option.RetainValues" value="true"/> <property name="datanucleus.appengine.autoCreateDatastoreTxns" value="true"/> </persistence-manager-factory> </jdoconfig>
で、ここ最強に注目です。
package bbs; import java.util.ArrayList; import java.util.Date; import java.util.List; import javax.jdo.PersistenceManager; import javax.jdo.annotations.IdGeneratorStrategy; import javax.jdo.annotations.IdentityType; import javax.jdo.annotations.PersistenceCapable; import javax.jdo.annotations.Persistent; import javax.jdo.annotations.PrimaryKey; @PersistenceCapable(identityType = IdentityType.APPLICATION) public class BbsDto { @PrimaryKey @Persistent(valueStrategy = IdGeneratorStrategy.IDENTITY) private Long id; @Persistent private String name; @Persistent private String title; @Persistent private String text; @Persistent private Date date; public Long getId() { return id; } public void setId(Long id) { this.id = id; } public String getName() { return name; } public void setName(String name) { this.name = name; } public String getTitle() { return title; } public void setTitle(String title) { this.title = title; } public String getText() { return text; } public void setText(String text) { this.text = text; } public Date getDate() { return date; } public void setDate(Date date) { this.date = date; } public static List findAll () { System.out.println("Dto findAllにはいりました。"); List list = new ArrayList(); PersistenceManager pm = PMUtils.getPM().getPersistenceManager(); String query = "SELECT FROM " + BbsDto.class.getName(); list = (List) pm.newQuery(query).execute(); return list; } public static void save(BbsDto dto) { System.out.println("Dto saveにはいりました。"); PersistenceManager pm = PMUtils.getPM().getPersistenceManager(); try { pm.makePersistent(dto); } catch (Exception e) { throw new RuntimeException(e); } } }
ここでは3つのことをやっています。
1、永続化するエンティティーを決定する
2、全データ読み込み
3、書き込み
まず1は永続化させる属性に、@Persistentをつける。
主キーには@PrimaryKeyをつけます。
これはJDOの使用で決まっているみたいです。
僕はここも勉強しないとなぁ(汗)
そして読み込みはSQLの変わりに
JDOQLを使用します。
ググッたら英語のドキュメントいっぱいでてきます。
そこで、得意の(?)吉田直伝リフレクションを使用して
データを抽出します。
僕はBbsDto.class.getName();と書きましたが
絶対パスを直書きでもOK。
そして書き込みにはPersistenceManagerのmakePersistentを使用して、
値をセットしたDTOを引数に渡せば完成です。
結果こうなりました。
値をいれました。
うお!!文字化けしてる〜〜と思って、
Servletでリクエストとレスポンスのエンコーディングしました。
すると・・・・
はい日本語にも対応しました。
このGoogleの巨大なデータベースを扱える実感わかります?
今無料じゃないですか?
万が一ですよ!
億が一ですよ!
この方法がすごく浸透して
データがオンラインでみんな扱えるようになったら、
もしかするとDBなくなるかも・・・・。
携帯が普及するときにいっせいに無料になったように
この機能が世界を変えてしまうかもしれませんね。