ラベル struts2 の投稿を表示しています。 すべての投稿を表示
ラベル struts2 の投稿を表示しています。 すべての投稿を表示

2011年4月8日金曜日

Struts2 + Spring + Slim3 サンプル

今回は、 【修正版】 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" %>


  
ニックネームEmail
戻る

以上で実装は完了です。

ここまで書いておいて、言ってしまうのですが、GlobalTransactionのインスタンスが直に注入されるのは気持ち悪いです。無理にSpringを使うことは無いと思い直しました。さらに、Springだけが原因かは調べていませんが、spin-upの時間もかなり掛かっています。

実行してみる
折角なので、動かしてみます。

Transactionは上手く機能しました。画像ではお見せできていませんが、例外が発生した場合は、ちゃんとrollbackしてくれています。

なんとかNo-configurationで書けたのですが、この方法を続けるにはDIを軽量化する必要があるのかなぁ...と思ってみたりみなかったり。

近いうちに、GWTとStruts2の連携についても書ければいいかな、なんて考えています。

2011年3月26日土曜日

【修正版】 Struts2 + Spring + Slim3

「Struts2 + Spring + Slim3の連携に挑戦」の修正版です。

前回の内容を修正しました。
改めてSlim3のLocalTransactionとGlobalTransactionについて調べた結果、前回の内容では不完全だったことがわかりました。

今回は完全に書き直しです。

Slim3の新規プロジェクト作成
まず最初に、EclipseのSlim3プラグインを使用してSlim3の新規プロジェクトを作成します。
プロジェクト名とルートパッケージ
Project names3sample
Root Packagecom.brightgenerous.s3.sample.data
不要なファイルを削除しておきます。
削除するファイルとディレクトリ
/src/application_en.properties
/src/application_ja.properties
/war/css
/war/ktrwjr
/war/common.jsp
Jarファイル追加
以下のjarファイルを「war/WEB-INF/lib」に追加します。
追加するjarファイル
aopalliance-1.0
commons-beanutils-1.7.0
commons-digester-2.0
commons-fileupload-1.2.1
commons-io-1.3.2
commons-lang-2.3
commons-logging-1.0.4
commons-validator-1.3.1
freemarker-gae-pre3
javassist
ognl-3.0
spring-aop
spring-beans
spring-context
spring-core
spring-tx
spring-web
struts2-convention-plugin-2.2.1.1
struts2-core-2.2.1.1
struts2-spring-plugin-2.2.1.1
xwork-core-2.2.1.1
freemarker-gae-pre3は、gae用のfreemarkerです。
Springは2.5を使用します。
web.xml
「war/WEB-INF」に配置するweb.xmlファイルです。


 
  slim3.rootPackage
  com.brightgenerous.s3.sample.data
 

 
  contextConfigLocation
  classpath:applicationContext*.xml
 

 
  DatastoreFilter
  org.slim3.datastore.DatastoreFilter
 

 
  struts2
  org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter
  
   actionPackages
   com.brightgenerous.s3.sample.action
  
 

 
  DatastoreFilter
  /*
  REQUEST
 
 
  struts2
  /*
 

 
  GlobalTransactionServlet
  org.slim3.datastore.GlobalTransactionServlet
  1
 

 
  GlobalTransactionServlet
  /slim3/gtx
 

 
  org.springframework.web.context.ContextLoaderListener
 
 
  com.brightgenerous.s3.sample.gae.GaeInitListener
 

 
  
   /slim3/gtx
  
  
   admin
  
 


Slim3の新規プロジェクトを作成して生成されるweb.xmlの内容のほとんど少しを消すことになります。
「com.brightgenerous.s3.sample.gae.GaeInitListener」は、独自に実装するクラスです。ソースは「実装するクラス」にて後述します。
applicationContext.xml
「classpath:applicationContext*.xml」(src直下)に配置します。


 

 

 

 
 
  
   
    PROPAGATION_REQUIRED
   
  
 
 
  
  
 
 
  
   
    transactionInterceptor
   
  
  
   
    *ServiceImpl
   
  
 


「transactionManager」のみ用意してやれば他はそのまま使えます。なかなかナイスな設計です。
「transactionManager」と「transactionInterceptor」を用意します。
「com.brightgenerous.s3.sample.gae.GaeFixInternalPersistenceAnnotationProcessor」、 「com.brightgenerous.s3.sample.gae.Slim3TransactionManager」、 「com.brightgenerous.s3.sample.gae.Slim3TransactionInterceptor」については、後述です。
実装するクラス
1.com.brightgenerous.s3.sample.gae.GaeInitListener
package com.brightgenerous.s3.sample.gae;

import javax.servlet.ServletContextEvent;
import javax.servlet.ServletContextListener;
import javax.servlet.http.HttpSessionAttributeListener;
import javax.servlet.http.HttpSessionBindingEvent;
import javax.servlet.http.HttpSessionEvent;
import javax.servlet.http.HttpSessionListener;

import ognl.OgnlRuntime;

public class GaeInitListener implements ServletContextListener, HttpSessionListener, HttpSessionAttributeListener {

 @Override
 public void contextInitialized(ServletContextEvent sce) {
  OgnlRuntime.setSecurityManager(null);
 }

 @Override
 public void contextDestroyed(ServletContextEvent arg0) {
 }

 @Override
 public void sessionCreated(HttpSessionEvent arg0) {
 }

 @Override
 public void sessionDestroyed(HttpSessionEvent arg0) {
 }

 @Override
 public void attributeAdded(HttpSessionBindingEvent arg0) {
 }

 @Override
 public void attributeRemoved(HttpSessionBindingEvent arg0) {
 }

 @Override
 public void attributeReplaced(HttpSessionBindingEvent arg0) {
 }
}
OGNLのセキュリティマネージャがなんとかかんとか...理由については、詳しく調べていません。
2.com.brightgenerous.s3.sample.gae.GaeFixInternalPersistenceAnnotationProcessor
package com.brightgenerous.s3.sample.gae;

public class GaeFixInternalPersistenceAnnotationProcessor {
}
「java.lang.NoClassDefFoundError」を回避することだけが目的です。
3.com.brightgenerous.s3.sample.gae.Slim3TransactionManager
package com.brightgenerous.s3.sample.gae;

import org.slim3.datastore.Datastore;
import org.springframework.transaction.TransactionDefinition;
import org.springframework.transaction.TransactionException;
import org.springframework.transaction.support.AbstractPlatformTransactionManager;
import org.springframework.transaction.support.DefaultTransactionStatus;

public class Slim3TransactionManager extends AbstractPlatformTransactionManager {

 private static final long serialVersionUID = 3423679590583692519L;

 @Override
 protected void doBegin(Object x_arg0, TransactionDefinition x_arg1) throws TransactionException {
  TransactionObject transactionObject = (TransactionObject) x_arg0;
  transactionObject.setTransaction(Datastore.beginGlobalTransaction());
 }

 @Override
 protected void doCommit(DefaultTransactionStatus x_arg0) throws TransactionException {
  TransactionObject transactionObject = (TransactionObject) x_arg0.getTransaction();
  transactionObject.getTransaction().commit();
 }

 @Override
 protected Object doGetTransaction() throws TransactionException {
  return new TransactionObject();
 }

 @Override
 protected void doRollback(DefaultTransactionStatus x_arg0) throws TransactionException {
  TransactionObject transactionObject = (TransactionObject) x_arg0.getTransaction();
  transactionObject.getTransaction().rollback();
 }
}
package com.brightgenerous.s3.sample.gae;

import java.io.Serializable;

import org.slim3.datastore.GlobalTransaction;

public class TransactionObject implements Serializable {

 private static final long serialVersionUID = -8353097480608667182L;

 private GlobalTransaction p_transaction;

 public GlobalTransaction getTransaction() {
  return p_transaction;
 }

 public void setTransaction(GlobalTransaction x_transaction) {
  p_transaction = x_transaction;
 }
}
package com.brightgenerous.s3.sample.gae;

import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;

@Target(ElementType.FIELD)
@Retention(RetentionPolicy.RUNTIME)
public @interface Slim3GlobalTransaction {
}
「org.springframework.jdbc.datasource.DataSourceTransactionManager」の実装を参考にして、Slim3用に簡単に対応させています。
「TransactionObject」、「Slim3GlobalTransaction」も作成します。 このクラスのみ自作です。間違い等あれば指摘していただけるとありがたいです。
4.com.brightgenerous.s3.sample.gae.Slim3TransactionInterceptor
 private void injectTransaction(Object x_obj, TransactionInfo x_txInfo) {
  TransactionStatus txStatus = x_txInfo.getTransactionStatus();
  DefaultTransactionStatus dtxStatus;
  if (!(txStatus instanceof DefaultTransactionStatus)) {
   return;
  }
  dtxStatus = (DefaultTransactionStatus) txStatus;
  Object tx = dtxStatus.getTransaction();
  if (tx instanceof TransactionObject) {
   tx = ((TransactionObject) tx).getTransaction();
  }
  if (!(tx instanceof GlobalTransaction)) {
   return;
  }
  @SuppressWarnings("rawtypes")
  Class clazz = x_obj.getClass();
  do {
   Field[] fields = clazz.getDeclaredFields();
   for (Field field : fields) {
    if (!field.isAccessible()) {
     field.setAccessible(true);
    }
    Slim3GlobalTransaction s3gtx = field.getAnnotation(Slim3GlobalTransaction.class);
    if (s3gtx != null) {
     if (field.getType().isInstance(tx)) {
      try {
       field.set(x_obj, tx);
      } catch (IllegalAccessException e) {
       throw new RuntimeException(e);
      } catch (IllegalArgumentException e) {
       throw new RuntimeException(e);
      }
     }
    }
   }
   clazz = clazz.getSuperclass();
  } while ((clazz != null) && !clazz.equals(Object.class));
 }
「org.springframework.transaction.interceptor.TransactionInterceptor」のソースをコピーしてきて、 上記のメソッドが適当な箇所で呼ばれるように書き換えます。
ライセンスを考慮して全体は公開しませんが、元のソースを読めば変更箇所はわかるはずです。

以上でStruts2 + Spring + Slim3の設定は完了です。
次回こそ、このフレームワークを使用して簡単なサンプルを書いてみます。

2011年3月24日木曜日

Struts2 + Spring + Slim3

この内容は修正されました。
修正後はこちら

Struts2 + Spring + Slim3の連携に挑戦。

ソースの省略はしません。
今回と次回で、簡単なサンプルを動作させるまでの手順を載せます。

Slim3の新規プロジェクト作成
まず最初に、EclipseのSlim3プラグインを使用してSlim3の新規プロジェクトを作成します。
プロジェクト名とルートパッケージ
Project names3sample
Root Packagecom.brightgenerous.s3.sample.data
不要なファイルを削除しておきます。
削除するファイルとディレクトリ
/src/application_en.properties
/src/application_ja.properties
/war/css
/war/ktrwjr
/war/common.jsp
Jarファイル追加
以下のjarファイルを「war/WEB-INF/lib」に追加します。
追加するjarファイル
aopalliance-1.0
commons-beanutils-1.7.0
commons-digester-2.0
commons-fileupload-1.2.1
commons-io-1.3.2
commons-lang-2.3
commons-logging-1.0.4
commons-validator-1.3.1
freemarker-gae-pre3
javassist
ognl-3.0
spring-aop
spring-beans
spring-context
spring-core
spring-tx
spring-web
struts2-convention-plugin-2.2.1.1
struts2-core-2.2.1.1
struts2-spring-plugin-2.2.1.1
xwork-core-2.2.1.1
freemarker-gae-pre3は、gae用のfreemarkerです。
Springは2.5を使用します。
web.xml
「war/WEB-INF」に配置するweb.xmlファイルです。



 
  slim3.rootPackage
  com.brightgenerous.s3.sample.data
 

 
  contextConfigLocation
  classpath:applicationContext*.xml
 

 
  struts2
  org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter
  
   actionPackages
   com.brightgenerous.s3.sample.action
  
 

 
  struts2
  /*
 

 
  org.springframework.web.context.ContextLoaderListener
 
 
  com.brightgenerous.s3.sample.gae.GaeInitListener
 


Slim3の新規プロジェクトを作成して生成されるweb.xmlの内容のほとんどを消すことになります。
「com.brightgenerous.s3.sample.gae.GaeInitListener」は、独自に実装するクラスです。ソースは「実装するクラス」にて後述します。
applicationContext.xml
「classpath:applicationContext*.xml」(src直下)に配置します。




 

 

 
 

 
 
 
  
   
    PROPAGATION_REQUIRED
    PROPAGATION_REQUIRED
    PROPAGATION_REQUIRED
    PROPAGATION_REQUIRED,readOnly
   
  
 
 
  
  
 
 
  
   
    transactionInterceptor
   
  
  
   
    *ServiceImpl
   
  
 


「transactionManager」のみ用意してやれば他はそのまま使えます。なかなかナイスな設計です。
「com.brightgenerous.s3.sample.gae.GaeFixInternalPersistenceAnnotationProcessor」、「com.brightgenerous.s3.sample.gae.Slim3TransactionManager」については、後述です。
実装するクラス
1.com.brightgenerous.s3.sample.gae.GaeInitListener
package com.brightgenerous.s3.sample.gae;

import javax.servlet.ServletContextEvent;
import javax.servlet.ServletContextListener;
import javax.servlet.http.HttpSessionAttributeListener;
import javax.servlet.http.HttpSessionBindingEvent;
import javax.servlet.http.HttpSessionEvent;
import javax.servlet.http.HttpSessionListener;

import ognl.OgnlRuntime;

public class GaeInitListener implements ServletContextListener, HttpSessionListener, HttpSessionAttributeListener {

 @Override
 public void contextInitialized(ServletContextEvent sce) {
  OgnlRuntime.setSecurityManager(null);
 }

 @Override
 public void contextDestroyed(ServletContextEvent arg0) {
 }

 @Override
 public void sessionCreated(HttpSessionEvent arg0) {
 }

 @Override
 public void sessionDestroyed(HttpSessionEvent arg0) {
 }

 @Override
 public void attributeAdded(HttpSessionBindingEvent arg0) {
 }

 @Override
 public void attributeRemoved(HttpSessionBindingEvent arg0) {
 }

 @Override
 public void attributeReplaced(HttpSessionBindingEvent arg0) {
 }
}
OGNLのセキュリティマネージャがなんとかかんとか...理由については、詳しく調べていません。
2.com.brightgenerous.s3.sample.gae.GaeFixInternalPersistenceAnnotationProcessor
package com.brightgenerous.s3.sample.gae;

public class GaeFixInternalPersistenceAnnotationProcessor {

 public GaeFixInternalPersistenceAnnotationProcessor() {
 }
}
「java.lang.NoClassDefFoundError」を回避することだけが目的です。
3.com.brightgenerous.s3.sample.gae.Slim3TransactionManager
package com.brightgenerous.s3.sample.gae;

import java.io.Serializable;

import org.slim3.datastore.Datastore;
import org.springframework.transaction.TransactionDefinition;
import org.springframework.transaction.TransactionException;
import org.springframework.transaction.support.AbstractPlatformTransactionManager;
import org.springframework.transaction.support.DefaultTransactionStatus;

import com.google.appengine.api.datastore.Transaction;

public class Slim3TransactionManager extends AbstractPlatformTransactionManager {

 private static final long serialVersionUID = 3423679590583692519L;

 @Override
 protected void doBegin(Object x_arg0, TransactionDefinition x_arg1) throws TransactionException {
  TransactionObject transactionObject = (TransactionObject) x_arg0;
  transactionObject.p_transaction = Datastore.beginTransaction();
 }

 @Override
 protected void doCommit(DefaultTransactionStatus x_arg0) throws TransactionException {
  TransactionObject transactionObject = (TransactionObject) x_arg0.getTransaction();
  transactionObject.p_transaction.commit();
 }

 @Override
 protected Object doGetTransaction() throws TransactionException {
  return new TransactionObject();
 }

 @Override
 protected void doRollback(DefaultTransactionStatus x_arg0) throws TransactionException {
  TransactionObject transactionObject = (TransactionObject) x_arg0.getTransaction();
  transactionObject.p_transaction.rollback();
 }

 private class TransactionObject implements Serializable {

  private static final long serialVersionUID = -8353097480608667182L;

  Transaction p_transaction;
 }
}
「org.springframework.jdbc.datasource.DataSourceTransactionManager」の実装を参考にして、Slim3用に簡単に対応させています。
このクラスのみ自作です。間違い等あれば指摘していただけるとありがたいです。

以上でStruts2 + Spring + Slim3の設定は完了です。
次回は、このフレームワークを使用して簡単なサンプルを書いてみます。

2011年3月21日月曜日

Struts2 + Spring + MyBatis (その2)

Struts2 + Spring + MyBatis (その1)の続きです。

WEBアプリケーション開発で使用するフレームワークをStruts2.2 + Spring2.5 + MyBatis2.3 で構成してみます。
(その2)では、各xmlファイルとpropertiesファイルを揃えます。

必要な設定ファイルを記載しておきます。
(省略)と書かれているファイルの内容については、一例を記述する程度に留まるので説明しません。詳細について知りたい場合は、解説している他サイトを参照することをお勧めします。
設定ファイル
web.xmlServletの配備記述子
struts.xmlStruts2の設定ファイル(省略)
struts.propertiesStruts2のパラメータファイル(省略)
applicationContext.xmlSpringの設定ファイル
detabase.propertiesデータベースのパラメータファイル(省略)
sqlMapConfig.xmlMyBatisの設定ファイル(省略)
tiles.xmlTilesの設定ファイル(省略)
web.xml
「WEB-INF」フォルダ内にある配備記述子です。これが無いと始まりません。
どのプロジェクトでも共通した記述なので、ほぼそのままコピーすれば使えます。
Servlet2.5の構文で書いてみます。



 
  contextConfigLocation
  classpath:applicationContext*.xml
 

 
  struts2
  org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter
  
   actionPackages
   sample.action
  
 

 
  struts2
  /*
 

 
  JspSupportServlet
  org.apache.struts2.views.JspSupportServlet
  1
 

 
  JspSupportServlet
  /*
 

 
  org.springframework.web.context.ContextLoaderListener
 
 
  org.apache.struts2.tiles.StrutsTilesListener
 

 
  30
 

 
  index.html
  index.jsp
 

 
  
   http://tiles.apache.org/tags-tiles
   /WEB-INF/tld/tiles-jsp.tld
  
 


Struts2とSpringを使用するには、上記のように記述します。
画面(View)の実装では、JspではなくFreeMarkerを使用します。 FreeMarker内でJspのtaglib(tiles等)を使用するためには、「JspSupportServlet」を動作させておく必要があります。
applicationContext.xml
applicationContex.xmlはweb.xmlに記述した「classpath:applicationContext*.xml」で参照される場所に配置します。
以下の内容は記述例です。



 

 
 

 
  
   
    classpath:database.properties
   
  
 

 
 
  
  
  
  
  
  
 

 
 
  
 
 
  
   
    PROPAGATION_REQUIRED
    PROPAGATION_REQUIRED
    PROPAGATION_REQUIRED
    PROPAGATION_REQUIRED,readOnly
   
  
 
 
  
  
 
 
  
   
    transactionInterceptor
   
  
  
   
    *ServiceImpl
   
  
 

 
 
  
  
 


MyBatis(iBatis)をSpringの管理下に置きます。
Springがトランザクションの管理(Begin、Rollback、Commit等)を、MyBatisがSQLの実行のみを担当するといった役割分担を可能にするためです。
そうすることで、MyBatisをSlim3に置き換えた場合にも同じ設計で実装できます。

大半を省略しましたが、設定ファイルについては以上です。
次回は、Google App Engine上でSlim3と連携させてみます。

2011年3月20日日曜日

Struts2 + Spring + MyBatis (その1)

WEBアプリケーション開発で使用するフレームワークをStruts2.2 + Spring2.5 + MyBatis2.3 で構成してみます。
最終的には、MyBatisをSlim3に置き換えてGoogle App Engine上で動作させるまでを予定しているので、そのための手順も含まれています。
(その1)では、必要なjarファイルの選定をします。

使用するフレームワークとそのバージョンを記載しておきます。
フレームワークとバージョン
Struts2Struts2.2.1.1
SpringSpring2.5.6
MyBatisMyBatis2.3.6

空のWebアプリケーションのプロジェクトを作成しておきます。
「Eclipse IDE for Java EE Developers」の「Dynamic Web Project」から新規作成を行うと簡単です。

Struts2
公式サイトからStruts2.2.1.1をダウンロードします。
ダウンローが完了したらファイルを解凍し、使用するjarファイルを選定してプロジェクトの「WEB-INF/lib」フォルダ内にコピーします。
使用するjarファイル
aopalliance-1.0
commons-beanutils-1.7.0
commons-digester-2.0
commons-fileupload-1.2.1
commons-io-1.3.2
commons-lang-2.3
commons-logging-1.0.4
commons-validator-1.3.1
freemarker-2.3.16
ognl-3.0
struts2-convention-plugin-2.2.1.1
struts2-core-2.2.1.1
struts2-json-plugin-2.2.1.1
struts2-spring-plugin-2.2.1.1
struts2-tiles-plugin-2.2.1.1
tiles-api-2.0.6
tiles-core-2.0.6
tiles-jsp-2.0.6
xwork-core-2.2.1.1
開発を進めていくうちに上記以外のjarファイルが必要になる事がありますが、その時点で追加します。
struts2にはspringのjarファイルも含まれていますが、springのjarファイルは別途用意します。
javassist
source forgeサイトからJavassist3.14をダウンロードします。
ダウンローが完了したらファイルを解凍し、javassist.jarファイルをプロジェクトの「WEB-INF/lib」フォルダ内にコピーします。
Spring
公式サイトからSpring2.5.6をダウンロードします。
ダウンローが完了したらファイルを解凍し、使用するJarファイルを選定してプロジェクトの「WEB-INF/lib」フォルダ内にコピーします。
使用するJarファイル
spring-aop
spring-beans
spring-context
spring-core
spring-tx
spring-web
MyBatis
公式サイトからMyBatis2.3.5をダウンロードします。
ダウンローが完了したらファイルを解凍し、mybatis-2.3.5.jarファイルをプロジェクトの「WEB-INF/lib」フォルダ内にコピーします。

以上でjarファイルの選定は終わりです。
(その2)では、各フレームワークの設定ファイルであるxmlについて書きます。