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
S2, Maven, S2JDBC-Gen, Cubby
以前「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)→Maven→Archetypeを選択する。
3. "Add Remote Catalog"をクリックし、"Catalog File"に http://cubby.seasar.org を入力。
4. Archetypeに"Remote : Remote http://cubby.seasar.org"が登録されていること確認、OKボタンをクリック。
ここまでで下準備完了。 次からプロジェクト作成です。
5. パッケージエクスプローラーから右クリック→新規(W)→プロジェクト(R)→Maven→Maven Projectを選択。
6. "Select project name and location"は「次へ」をクリック。
7. "Select an Archetype"では、Catalogをプルダウンでhttp://cubby.seasar.orgを選ぶ。
8. 下のGroup ID/Artifact ID/Versionに反映されたら、それをクリック。 「次へ」に進む。
9. プロジェクト固有のGroup ID/Artifact ID、Propertiesを入力。
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が走って、プロジェクト雛型が完成。








