今回は、
【修正版】 Struts2 + Spring + Slim3で構築したフレームワークを使ってサンプルのソースを書いてみます。
サンプルは簡単なデータ登録と表示の実装です。
- 作成するファイル一覧
- 今回、作成するファイルは以下の通りです。それ以外のファイルは一切触りません。
ファイル一覧
/src/com/brightgenerous/s3/sample/action/Sample_Action.java |
/src/com/brightgenerous/s3/sample/action/Sample_Service.java |
/src/com/brightgenerous/s3/sample/action/Sample_ServiceImpl.java |
/src/com/brightgenerous/s3/sample/data/model/Account.java |
/src/com/brightgenerous/s3/sample/data/meta/AccountMeta.java |
/war/WEB-INF/content/sample/index.jsp |
/war/WEB-INF/content/sample/show.jsp |
- 「Account.java」と「AccountMeta.java」はSlim3のプラグインを使って自動生成します。
- javaのソースコード
- 1.com.brightgenerous.s3.sample.action.Sample_Action.java
package com.brightgenerous.s3.sample.action;
import java.util.List;
import org.apache.struts2.convention.annotation.Action;
import org.apache.struts2.convention.annotation.Namespace;
import org.apache.struts2.convention.annotation.ParentPackage;
import org.springframework.beans.factory.annotation.Autowired;
import com.brightgenerous.s3.sample.data.model.Account;
import com.opensymphony.xwork2.ModelDriven;
@ParentPackage("struts-default")
@Namespace("/sample")
public class Sample_Action implements ModelDriven {
private Account p_model = new Account();
@Autowired
private Sample_Service p_service;
@Override
public Account getModel() {
return p_model;
}
public List getAccounts() {
return p_service.get();
}
/**
* [Action:初期表示]
*/
@Action("index")
public String index() {
return "index";
}
/**
* [Action:表示]
*/
@Action("show")
public String show() {
return "show";
}
/**
* [Action:登録]
*/
@Action("regist")
public String regist() {
p_service.regist(p_model);
return show();
}
}
- 2.com.brightgenerous.s3.sample.action.Sample_Service.java
package com.brightgenerous.s3.sample.action;
import java.util.List;
import com.brightgenerous.s3.sample.data.model.Account;
interface Sample_Service {
Account regist(Account x_account);
List<Account> get();
}
- 3.com.brightgenerous.s3.sample.action.Sample_ServiceImpl.java
package com.brightgenerous.s3.sample.action;
import java.util.List;
import org.slim3.datastore.Datastore;
import org.springframework.stereotype.Component;
import com.brightgenerous.s3.sample.data.meta.AccountMeta;
import com.brightgenerous.s3.sample.data.model.Account;
@Component
class Sample_ServiceImpl implements Sample_Service {
@Slim3GlobalTransaction
private GlobalTransaction p_tx;
@Override
public Account regist(Account x_account) {
p_tx.put(x_account);
return x_account;
}
@Override
public List get() {
AccountMeta meta = AccountMeta.get();
return Datastore.query(meta).asList();
}
}
- 4.com.brightgenerous.s3.sample.data.model.Account.java
package com.brightgenerous.s3.sample.data.model;
import java.io.Serializable;
import com.google.appengine.api.datastore.Key;
import org.slim3.datastore.Attribute;
import org.slim3.datastore.Model;
@Model(schemaVersion = 1)
public class Account implements Serializable {
private static final long serialVersionUID = 1L;
@Attribute(primaryKey = true)
private Key key;
@Attribute(version = true)
private Long version;
private String nickname;
private String email;
/**
* Returns the key.
*
* @return the key
*/
public Key getKey() {
return key;
}
/**
* Sets the key.
*
* @param key the key
*/
public void setKey(Key key) {
this.key = key;
}
/**
* Returns the version.
*
* @return the version
*/
public Long getVersion() {
return version;
}
/**
* Sets the version.
*
* @param version the version
*/
public void setVersion(Long version) {
this.version = version;
}
public String getNickname() {
return nickname;
}
public void setNickname(String x_nickname) {
nickname = x_nickname;
}
public String getEmail() {
return email;
}
public void setEmail(String x_email) {
email = x_email;
}
@Override
public int hashCode() {
final int prime = 31;
int result = 1;
result = prime * result + ((key == null) ? 0 : key.hashCode());
return result;
}
@Override
public boolean equals(Object obj) {
if (this == obj) {
return true;
}
if (obj == null) {
return false;
}
if (getClass() != obj.getClass()) {
return false;
}
Account other = (Account) obj;
if (key == null) {
if (other.key != null) {
return false;
}
} else if (!key.equals(other.key)) {
return false;
}
return true;
}
}
- Slim3プラグインのantから「gen-model」を選択して、自動生成されたソースをもとにしています。
追加部分は「nickname」と「email」の変数と、そのgetter・setterだけです。
- jspのソースコード
- 1./WEB-INF/content/sample/index.jsp
<%@page pageEncoding="UTF-8" isELIgnored="false" session="false"%>
<%@ taglib uri="/struts-tags" prefix="s" %>
表示
- 2./WEB-INF/content/sample/show.jsp
-
<%@page pageEncoding="UTF-8" isELIgnored="false" session="false"%>
<%@ taglib uri="/struts-tags" prefix="s" %>
戻る
以上で実装は完了です。
ここまで書いておいて、言ってしまうのですが、GlobalTransactionのインスタンスが直に注入されるのは気持ち悪いです。無理にSpringを使うことは無いと思い直しました。さらに、Springだけが原因かは調べていませんが、spin-upの時間もかなり掛かっています。
- 実行してみる
- 折角なので、動かしてみます。
-
-
Transactionは上手く機能しました。画像ではお見せできていませんが、例外が発生した場合は、ちゃんとrollbackしてくれています。
なんとかNo-configurationで書けたのですが、この方法を続けるにはDIを軽量化する必要があるのかなぁ...と思ってみたりみなかったり。
近いうちに、GWTとStruts2の連携についても書ければいいかな、なんて考えています。