今日の役に立たない一言 - Today’s Trifle! -

古い記事ではさまざまなテーマを書いていますが、2007年以降はプログラミング関連の話がほとんどです。

Android+SAStruts+JSONICで実装とか

動くようになったので、メモ。

準備

まず、SAStrutsJSONICを動かすための設定などはこちらを見てね。
WebサービスAPI (JSONIC 1.3)

web.xmlの該当箇所は、こんな感じで設定。
こうすれば、/app/json/entity.json みたいなURLで動いてくれる。

    
        JSON-WebService
        json-ws
        net.arnx.jsonic.web.WebServiceServlet
        
            config
            
            {
                container: 'net.arnx.jsonic.web.S2Container'
                debug: true
                mappings: {
                    '/json/{class}/{id}.{ext}': 'com.hoge.service.${class}Service'
                    '/json/{class}/{method}.{ext}': 'com.hoge.service.${class}Service'
                    '/json/{class}.{ext}': 'com.hoge.service.${class}Service'
                }
            }
            
        
        3
    


扱うエンティティクラスがEntityとする。
Entity.java

public class Entity {
    public long id;
    public String name;
    public String mail;
}

Create

Android側の実装。

    String url = "http://hoge.com/app/json/entity.json";
    HttpPost post = new HttpPost(url);
    List params = new ArrayList();
    params.add(new BasicNameValuePair("name", "1");
    params.add(new BasicNameValuePair("mail", "hoge@example.com");
    post.setEntity(new UrlEncodedFormEntity(params));
    HttpResponse res = httpClient.execute(post);
    HttpEntity entity = res.getEntity();
    int status = res.getStatusLine().getStatusCode();
    // 結果を確認

SAStruts側の実装。
EntityService.javaに実装。

    public void create(Map params) {
        Entity e = new Eneity();
        e.name = params.get("name");
        e.mail = params.get("mail");
        insert(e);
        ResponseUtil.write("{success:true}", "application/json");
    }

Read

Android側の実装。

    String url = "http://hoge.com/app/json/entity.json";
    HttpGet get = new HttpGet(url);
    HttpResponse res = httpClient.execute(get);
    HttpEntity entity = res.getEntity();
    String json = EntityUtils.toString(entity);
    JSONObject root = new JSONObject(json);
    JSONArray a = root.getJSONArray("entities");
    List list = new ArrayList();
    for (int i = 0; i < a.length(); i++) {
        JSONObject o = a.getJSONObject(i);
        String name = o.getString("name");
        String mail = o.getString("mail");
        Entity e = new Entity();
        e.name = name;
        e.mail = mail;
        list.add(e);
    }

SAStruts側の実装。
EntityService.javaに実装。

    public Map find(Map params) {
        List list = select().getResultList();
        Object o = list.toArray();
        Map m = new HashMap();
        m.put("entities", o);
        return m;
    }

Update

Android側の実装。

    // 既存のEntity eを更新
    String url = "http://hoge.com/app/json/entity.json";
    JSONObject j = new JSONObject();
    j.put("id", e.id);
    j.put("name", e.name);
    j.put("mail", e.mail);
    HttpPut put = new HttpPut(url);
    put.setEntity(new StringEntity(j.toString()));
    HttpResponse res = httpClient.execute(put);
    int status = res.getStatusLine().getStatusCode();
    // 結果を確認

SAStruts側の実装。
EntityService.javaに実装。

    @Override
    public int update(Entity e) {
        int r = super.update(e);
        ResponseUtil.write("{success:true}", "application/json");
        return r;
    }

Delete

Android側の実装。

    // Entity e を削除
    String url = "http://hoge.com/app/json/entity.json?id=" + e.id;
    HttpDelete delete = new HttpDelete(url);
    delete.setHeader("Content-Type", "application/json");
    HttpResponse res = httpClient.execute(delete);
    int status = res.getStatusLine().getStatusCode();
    // 結果を確認 SC_NO_CONTENT が返ってくる

SAStruts側の実装。
EntityService.javaに実装。

    @Override
    public int delete(Entity e) {
        int r = super.delete(e);
        ResponseUtil.write("{success:true}", "application/json");
        return r;
    }