back

複数モデルを連携処理する (6/6)

■MygaeServletの修正

では、データを取得しindex.htmlにお繰り返しているMygaeServletを修正しましょう。下にソースコードを掲載しておきます。

ここでは、全LinkDataか、あるいは指定されたIDのLinkDataを検索し、その内容をJSONデータにして出力するようにしています。ここでの、指定IDのLinkDataを取り出して内容をJSONデータにまとめる部分を見てみると、
LinkData data = (LinkData)manager.getObjectById(LinkData.class,Long.parseLong(param1));
List<MsgData> msgdatas = data.getMsgDatas();
res = "[";
res += "{id:" + data.getId() + ",url:'" + data.getUrl() + "',title:'" +
    data.getTitle() + "',date:'" + data.getDatetime() +
    "',comment:'" + data.getComment() + "',messages:[";
for(MsgData msg:msgdatas){
    res += "{id:" + msg.getId() + ",comment:'" + msg.getComment() + "'},";
}
res += "]}]";
こんな具合になっています。for(MsgData msg:msgdatas)というように繰り返しを使い、data.getMsgDatasされたList内からMsgDataを取り出し、その内容を配列にまとめて書き出しています。これで、LinkDataの中に、関連するMsgDataを配列としてまとめたJSONデータができあがります。

このへんになってくると、モデルクラスの内容をJSONデータに変換する処理がかなり長くなってしまいますが、まぁこれは、今回の一連のサンプルがすべてAjaxでデータを取得するようにしているためです。単純にサーブレットにアクセスして全部その場で出力するなら、もっとシンプルに作れるでしょう。

GAEでは、JSPも使えますから、「JavaScriptは面倒くさい」という人は、JSPを使い、セッションなどでLinkDataやMsgDataを直接JSPに渡して表示させるなどするとよいでしょう。


(by. SYODA-Tuyano.)

※リストが表示されない場合

AddBlockなどの広告ブロックツールがONになっているとリストなどが表示されない場合があります。これらのツールをOFFにしてみてください。

package jp.tuyano;

import java.io.*;
import java.util.*;

import javax.jdo.*;
import javax.servlet.http.*;

@SuppressWarnings("serial")
public class MygaeServlet extends HttpServlet {
	private static final long serialVersionUID = 1L;

	public void doGet(HttpServletRequest req,
			HttpServletResponse resp)
			throws IOException {
		PersistenceManagerFactory factory = PMF.get();
		PersistenceManager manager = factory.getPersistenceManager();
		resp.setCharacterEncoding("UTF-8");
		resp.setContentType("text/html");
		req.setCharacterEncoding("utf-8");
		String param1 = req.getParameter("id");
		PrintWriter out = resp.getWriter();
		List<LinkData> list = null;
		String res = null;
		if (param1 == null || param1 ==""){
			String query = "select from " + LinkData.class.getName();
			try {
				list = (List<LinkData>)manager.newQuery(query).execute();
			} catch(JDOObjectNotFoundException e){}
			res = "[";
			for(LinkData data:list){
				res += "{id:" + data.getId() + ",url:'" + data.getUrl() + "',title:'" +
					data.getTitle() + "',date:'" + data.getDatetime() +
					"',comment:'" + data.getComment() + "'},";
			}
			res += "]";
		} else {
			try {
				LinkData data = (LinkData)manager.getObjectById(LinkData.class,Long.parseLong(param1));
				List<MsgData> msgdatas = data.getMsgDatas();
				res = "[";
				res += "{id:" + data.getId() + ",url:'" + data.getUrl() + "',title:'" +
					data.getTitle() + "',date:'" + data.getDatetime() +
					"',comment:'" + data.getComment() + "',messages:[";
				for(MsgData msg:msgdatas){
					res += "{id:" + msg.getId() + ",comment:'" + msg.getComment() + "'},";
				}
				res += "]}]";
			} catch(JDOObjectNotFoundException e){}
		}
		out.println(res);
		manager.close();
	}
}



 

記事のリストに戻る



PC Site G+ mail