- 追加された行はこの色です。
- 削除された行はこの色です。
[[FrontPage]]
* Cart問題 [#c949db9e]
Agile Web Development with Railsの例題と同じ問題をSpringを使って実装を試みたときの
メモです。
もう一つの目的は、Spring-MVCプラグインがどの程度実際の問題解決に役立つかを検証することです。
** プロジェクトの作成 [#y8873d2a]
mavenを使ってプロジェクトを生成します。
- groupIdは、example.cart
- artifactIdは、cart
とします。ecliseでプロジェクトを管理できるようにeclipseプラグインも起動します。
#pre{{
mvn archetype:create \
-DgroupId=example.cart \
-DartifactId=cart \
-DarchetypeArtifactId=spring-mvc-archetype \
-DarchetypeGroupId=jp.co.pwv.spring-mvc-archetype \
-DarchetypeVersion=1.1.1
cd cart
mvn eclipse:eclipse -DdownloadSources=true
}}
データベースは、HsqlDBのサーバを使用するため、db.propertiesの内容を修正します。
#pre{{
db.url=jdbc:hsqldb:hsql://localhost
}}
最後にeclipseでcartプロジェクトをimportし、CVSに登録します。
* [[session scopeについて]] [#fddab324]
長くなったので別タイトルにしました。
** session scopeの確認 [#w1b0d28a]
cartはセッションの中で管理しなければなりません。そのため、Spring2.0から導入されたsession scopeを使用します。
* Product(製品の)の管理 [#r6b52203]
最初にProductを管理するページを作成します。
まずは、session scopeの使い方を確認します。
さしあたり、管理機能として
- 製品の一覧表示
- 製品の追加、編集、削除
ができるようにします。
最初に以下のような簡単なクラスを定義します。
** Productドメインモデルの作成 [#g8855bc8]
最初にProductのドメインモデルを作成します。
ドメインモデルは、example.cart.domainパッケージ内に定義します。
eclipseで以下のように入力した後、getter/setterを自動生成してください。
#pre{{
package example.cart.service;
package example.cart.domain;
public class CartService {
public class Product {
private Integer id;
public CartService() {
id = new Integer(1);
}
private String title;
private String description;
private String image_url;
}
}}
session scopeオブジェクトは、サーブレットではなく、applicationContext.xmlと同レベルで定義しないとbeanが見つからないとのエラーになります。
** GenMVCプラグインの起動 [#x97dd396]
GenMVCプラグインのscaffoldゴールを指定して、ProductのDao、 Controller、 View、データベーステーブル
を自動生成します。
そこで、session-def.xmlにsession scopeをまとめて定義しました。
その前に、GenMVCプラグインは、Productのクラスファイルを見に行くので、mavenのpackageを実行します。
#pre{{
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:aop="http://www.springframework.org/schema/aop"
xsi:schemaLocation="
http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.5.xsd
http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-2.5.xsd">
mvn package
<!-- a HTTP Session-scoped bean exposed as a proxy -->
<bean id="cartService" class="example.cart.service.CartService" scope="session" />
</beans>
mvn GenMVC:scaffold
}}
本当は、<aop:scoped-proxy />を使って自動的にsession scopeオブジェクトの再配置をしたかったのですが、何度もテストしましたがこの宣言を入れるとうまくオブジェクトがセットされません。
次にこのsession scopeオブジェクトを使用するメソッド(ここではlistメソッド)に
このコマンドで、
#pre{{
ApplicationContext co = WebApplicationContextUtils.getRequiredWebApplicationContext( request.getSession().getServletContext());
Object obj = co.getBean("cartService");
[INFO] ------------------------------------------------------------------------
[INFO] Building Unnamed - example.cart:cart:war:1.0-SNAPSHOT
[INFO] task-segment: [GenMVC:scaffold]
[INFO] ------------------------------------------------------------------------
[INFO] [GenMVC:scaffold]
[INFO] pkgName:example.cart
[INFO] runtime.classpath:/Users/take/Documents/workspace/cart/target/classes
[INFO] cls: example.cart.domain.Member
[INFO] template fullpath:velocity/IDao.vm
[INFO] template fullpath:velocity/Dao.vm
[INFO] template fullpath:velocity/edit_stub.vm
[INFO] template fullpath:velocity/list_stub.vm
[INFO] template fullpath:velocity/hbm.vm
[INFO] cls: example.cart.domain.Product
[INFO] template fullpath:velocity/IDao.vm
[INFO] template fullpath:velocity/Dao.vm
[INFO] template fullpath:velocity/Manager.vm
[INFO] template fullpath:velocity/EditController.vm
[INFO] template fullpath:velocity/OpsController.vm
[INFO] template fullpath:velocity/edit.vm
[INFO] template fullpath:velocity/edit_stub.vm
[INFO] template fullpath:velocity/list.vm
[INFO] template fullpath:velocity/list_stub.vm
[INFO] template fullpath:velocity/hbm.vm
[INFO] template fullpath:velocity/servlet-stub.vm
[INFO] template fullpath:velocity/sql.vm
[INFO] template fullpath:velocity/applicationContext.vm
[INFO] template fullpath:velocity/form-messages.vm
[INFO] template fullpath:velocity/validation.vm
}}
としてアプリケーション・コンテキストからcartServiceを取得します。
と出力され、必要なファイルがすべて生成されます。
再度、mvn packageを実行してtarget/cart.warをtomcatのwebappsにコピーします。
次に、デバッガでCartServiceのコンストラクタにブレークポイントをセットし、tomcatを起動します。
これだけで、Productのリスト表示、編集の画面が生成されます。
ブラウザーからlistのページにアクセスするとcartServiceオブジェクトのコンストラクタがコールされます。
#ref(product_list.jpg);
ブラウザーを起動し直すと再度cartServiceオブジェクトのコンストラクタがコールされ、session毎に
オブジェクトが生成されることが確認できます。
** 属性の追加 [#b2ed20d1]
scaffoldの後にProductに属性を追加したくなることはよくあります。
Product の属性を変更したときの手順は以下の通りです。
- テーブルの削除
- velocity/*_stub.vmファイルのバックアップ
- validation.xmlファイルのバックアップ
通常は、これで十分ですが、以下のファイルを修正した場合にはバックアップを取ってください。
- webapp/WEB-INF/hbm-dir/Product.hbm.xml
- main/resources/form-messages.properties
今回は、自動生成されたファイルを全く変更していないので、テーブルの削除だけを行います。
*** テーブルの削除 [#x9330700]
開発の途中ではデータベースのテーブルを変更したり、値を参照します。このような用途に便利なのが
Ecl,ipseのプラグインDbEditです。
DbEditのインストール方法はhttp://www.pwv.co.jp/take_public_html/DevTool/DevTool_c9.html#doc1_589
を参照してください。
DbEditのTableタグを開くと以下のようにT_MEMBERとT_PRODUCTの2つのテーブルが作られています。
#ref(DbEdit.jpg);