Hatena::Groupseasarproject

S2できるかな?

2009-08-19

バリデーションNGの時はステータス404を返したい。

やりたいことは表題のとおり。

public class HogeAction {

    @Resource
    private HttpServletResponse response;

    @Required
    @LongType
    public String id;

    @Execute(urlPattern = "edit/{id}", input = "notfound")
    public String edit() {
        // 処理省略
    	return "edit.jsp";
    }
    
    @Execute(validator = false)
    public String notfound() {
    	response.setStatus(404);
    	return null;
    }
}

こんな感じで、バリデーションの結果NGのときは、notfoundメソッド呼ばれるようにしてある。 自分はこう書いてるけれど、他の人はどーやってるんでしょ?

2009-08-07

s2jdbc-gen-build.xmlにちょっと書き足して、エンティティだけ作る

コマンドラインでs2jdbc-gen-build.xmlがあるディレクトリまで移動して、以下のコマンドを打つと、エンティティ、Namesクラス、サービスクラス、テストケースまで一括で自動生成してくれます。

> ant -f s2jdbc-gen-build.xml gen-entity

ただ、便利なんですけど、エンティティ自動作成されたそのままじゃなくて、ちょっと変更したいんですよね。 状態を表すフィールドはString型じゃなくenum切って使いたいし…。

なので、自分は、s2jdbc-gen-build.xmlに以下のような記述を書き足しています。

  <target name="dump">
     // ~省略
  </target>

  <target name="entity-only">
    <gen-entity
      rootpackagename="${rootpackagename}"
      entitypackagename="${entitypackagename}"
      javafiledestdir="${javafiledestdir}"
      javafileencoding="${javafileencoding}"
      env="${env}"
      jdbcmanagername="${jdbcmanagername}"
      classpathref="classpath"
    />
    <!-- セキュリティの設定によっては以下の refresh タスクに時間がかかる場合があります.
      その場合は refresh タスクを削除してください.-->
    <refresh projectName="${projectname}"/>
  </target>

  <target name="gen-names">
    <gen-names
      classpathdir="${classpathdir}"
      rootpackagename="${rootpackagename}"
      entitypackagename="${entitypackagename}"
      javafiledestdir="${javafiledestdir}"
      javafileencoding="${javafileencoding}"
      env="${env}"
      jdbcmanagername="${jdbcmanagername}"
      classpathref="classpath"
    />
    <!-- セキュリティの設定によっては以下の refresh タスクに時間がかかる場合があります.
      その場合は refresh タスクを削除してください.-->
    <refresh projectName="${projectname}"/>
  </target>

こう書くことで、

> ant -f s2jdbc-gen-build.xml entity-only

と打って、エンティティを自動作成、それを修正後に、

> ant -f s2jdbc-gen-build.xml gen-names

と打って、Namesクラスを自動作成しています。

2009-05-19

Cubby + S2JDBC-Gen

以前「EclipseのMaven2 Pluginを使って新規プロジェクト作成」*1って書いたんですけど、これで作ったプロジェクトに、S2JDBC-Genのマニュアル*2を使ってエンティティを作ろうと思っても失敗しちゃいます。

必要なライブラリが無いので、antが停止。

  <path id="classpath">
    <pathelement location="${classpathdir}"/>
    <fileset dir="src/main/webapp/WEB-INF/lib">
      <exclude name="src/main/webapp/WEB-INF/lib/sources/**"/>
    </fileset>
    <fileset dir="lib">
      <exclude name="lib/sources/**"/>
    </fileset>
  </path>

s2jdbc-gen-build.xmlの上記記述に従うなら、プロジェクト直下に"lib"と言うディレクトリ掘って、必要なjar*3を置く。

「[ESSR0055]リソース(s2jdbc.dicon)が見つかりません」とメッセージが出てantが停止。

サンプルのs2jdbc-gen-build.xmlとMavenで作ったCubbyのプロジェクトでは、クラスパスが違う。 下記のようにs2jdbc-gen-build.xmlを修正する。

<property name="classpathdir" value="src/main/webapp/WEB-INF/classes"/>

<property name="classpathdir" value="target/classes"/>

生成したエンティティクラスに付与される@Generatedのパスが通らない。

MavenでCubbyプロジェクト作ると、デフォルトでJava 5でコンパイルされるプロジェクトになるため。 pom.xmlを書き換えてJava 6のプロジェクトにしてリビルドするか、@Generated自体消すかする。

2009-05-18

一つのActionクラスに、ActionFormは幾つあればいいのだろうか?

アクションフォームを使用する場合は、アクションのプロパティでリクエストのパラメータを受け取ることができなくなるので注意して下さい。

Super Agile Struts - Feature Reference

次の開発でSAStrutsの導入を検討しているのです。 …で、問題なのが、上記ActionFormの仕様。

SAStrutsが、一つのユース・ケース=一つのフォーム=一つのアクション・クラス、って言う設計思想で作られていて、それは散々色んな所で議論されて今の仕様になってるんで、別に文句もないんですけど。 だけど、そうすると長い名前のアクション・クラスがいっぱい出来ちゃうんですよね…。

例えば、以下のような機能

  • ユーザー登録の際、ID/メアド/パスワードを入力し、確認、仮登録完了のメールが送信される
  • メールに載っている完了用のURLにアクセスして登録完了
  • メールに載っているキャンセル用のURLにアクセスして登録取り消し

を実装しようとしたら、アクション・クラス3つ必要ですよね。 自分としては、こういうのは「ユーザー登録機能」の一括りとして、一つのアクション・クラスに入れたいんですよねぇ。

実際にSAStrutsで開発している人、そこら辺をどうクリアしてるのかな…?

2009-04-03

Maven 2.x Plug-in for Eclipse で Cubbyの新規プロジェクト作成

1. Maven 2.x Plug-in for Eclipse(m2)をインストール。

Maven Eclipseとの連携 - @//メモを参照して下さい。

2. ウィンドウ(W)→設定(P)→MavenArchetypeを選択する。

http://img207.imagevenue.com/img.php?image=70171_20090403a_122_519lo.jpg

3. "Add Remote Catalog"をクリックし、"Catalog File"に http://cubby.seasar.org を入力。

http://img169.imagevenue.com/img.php?image=70172_20090403b_122_1176lo.jpg

4. Archetypeに"Remote : Remote http://cubby.seasar.org"が登録されていること確認、OKボタンをクリック。

http://img172.imagevenue.com/img.php?image=70172_20090403c_122_211lo.jpg

ここまでで下準備完了。 次からプロジェクト作成です。

5. パッケージエクスプローラーから右クリック→新規(W)→プロジェクト(R)→MavenMaven Projectを選択。

http://img42.imagevenue.com/img.php?image=70173_20090403d_122_1149lo.jpg

6. "Select project name and location"は「次へ」をクリック。

http://img246.imagevenue.com/img.php?image=70178_20090403e_122_587lo.jpg

7. "Select an Archetype"では、Catalogをプルダウンでhttp://cubby.seasar.orgを選ぶ。

http://img12.imagevenue.com/img.php?image=70186_20090403f_122_103lo.jpg

8. 下のGroup ID/Artifact ID/Versionに反映されたら、それをクリック。 「次へ」に進む。

http://img31.imagevenue.com/img.php?image=70196_20090403g_122_836lo.jpg

9. プロジェクト固有のGroup ID/Artifact ID、Propertiesを入力。

http://img255.imagevenue.com/img.php?image=70201_20090403h_122_573lo.jpg

PropertiesはAddをクリックすると、Name/Versionの所に"?"が入り、Nameはカラムの右端にマウスを持っていくとプルダウンになるので、選択。 Versionは手打ちで。 2009/04/02時点での最新ver.のPropertiesはこんな感じ。

  • cubby-version : 1.1.4
  • s2container-version : 2.4.34
  • s2dao-version : 1.0.49
  • use-s2dao : false
  • use-s2jdbc : true

S2Dao使うかS2JDBC使うかでuse-s2*のtrue/falseを決定。 「終了」をクリック。

10. Mavenが走って、プロジェクト雛型が完成。

http://img171.imagevenue.com/img.php?image=70170_20090403i_122_690lo.jpg