Seasar2入門

Seasar2入門

Seasar2入門

Seasar Conference にも行ってきたし、前から気になっていたので読んでみた。

第1章 はじめに

1-4 パッケージ構成

パッケージ構成やクラスのネーミングルールが提案されているのは、導入時に検討が要らず助かる。ただ、機能単位ではなくコンポーネントの種別(Action、Form、エンティティ、サービス、ユーティリティなど)の単位でパッケージを作ると、パッケージスコープを有効活用できなくなる。この辺はRailsを踏襲したのだろうが、どうなんだろう。機能単位にしておくと共用されるクラスが出てきた際にやっかいになるか。むしろ、コンポーネントの種別で分けておけば、パッケージ間の参照方向を明確化し、疎結合を促すことが出来るのかな。あと、Railsを踏襲しているためかクラスの作成単位が画面上の操作単位ではなく、エンティティ単位なのでクラス数も少ないので、そんなものなのかな。

1-5 SAStrutsのアプリケーションアーキテクチャ

ビジネスロジックの実装箇所や導出プロパティ、開発手順についてまで提案していてくれて本当に助かる。これらの方法は複数のプロジェクトで適用した結果を踏まえたものだろうから信頼性が高い。とはいえ、プログラミングファースト開発を導入するには管理側への説得が必要だろうが。

第2章 Super Agile Struts SAStruts

2-1 セットアップ
2-2 サンプルを実行

途中で気付いたが、この本ってチュートリアルのソースをひたすら解説している内容だったのね。

            @Execute(validator = false, urlPattern = "result/{id}")
    • 画面初期表示時はindexメソッドを呼び出すフローとする。初期表示時のみJSPを直接表示したりしない。また、画面に入力項目が存在する場合はFormのinitializeメソッドで初期化する。
  • validator
    • Formにアノテーションとして定義する。
    • エラーメッセージの定義はどこで行う?
      →application_ja.properties。この辺はStrutsのままかな。
    • 業務的なエラーメッセージはどうやって出力する?application_ja.propertiesに登録か?
    • エラーメッセージにメッセージIDを付けたい場合はどうすればよいのだろうか?そもそもエラーメッセージをつける文化はBtoBとか企業内システムぐらい?
    • エラーメッセージの項目名を日本語化する場合はapplication_ja.propertiesに「labels.フィールド名=表示名」のように記述するので、フィールド名の標準化が図れてよいかも。
    • JSでボタンクリック時ではなく項目遷移時に入力チェックするような場合はどうすればよい?まぁ、そういう仕様自体が微妙だけど。一部分だったらAjaxを使う方がよい?

  • JSP
    • のaction属性は自動的に計算されるとのことだが、別のActionを呼ぶケースはどのような場合?RailsやDispatchActionのように 1Action = 1Class ではなく、 1Action = 1Method とした場合、別のActionに遷移するのはActionクラス内でforwardする形に標準化して、JSP側で他のActionクラスを呼ぶようなことはしない?
    • ファイル内にtaglib宣言がないため、JSPエディタでエラーとなるのはしょうがない?
    • IEではセッションのサンプルでテキストボタンでエンターを押下してもボタンのパラメーターが送信されなかった。足し算のサンプルでは動いていたし、HTMLとしてはどちらも同じような形式なのだが。。IEのバグっぽい。Firefoxは動いた。違いはテキストボックスの数が1つか2つかなので、IEは1つしかない時は上手く動かないのかも。そんなバグがあった気もする。
  • Form
    • セッションに格納する場合はSerializbleを実装する必要があるのはなぜ?
    • 画面の入力項目のみ保持する。表示項目はAcitonのフィールドで保持する。
  • Eclipse
    • ホバーで表示されるJavaDocが文字化けしてる。
      →WorkspaceのデフォルトエンコーディングUTF-8に変更したら解消された。以前ちょっと触った際も思ったが、SeasarプロジェクトとしてUTF-8をデフォルトとしているようだ。

第3章 S2JDBC

3-1 セットアップ

3-2 サンプルを実行
  • SQL
    • inner join と outer join について整理。http://www.techscore.com/tech/sql/06_05.html が参考になった。
      • inner join:内部結合。テーブル間でカラムが一致する行のみ出力する。
      • outer join:外部結合。left, right, full の3種類存在し、left であれば左側のテーブルに関しては一致しない行も出力する。
    • 要は、データの有無に関わらず全部表示したければ外部結合を利用し、一致するデータが存在する行のみ表示したければ内部結合。
  • Mapを使った検索条件を指定するサンプル
    • BeanMapはHashMapを継承しているため、Keyの順序は一定ではない?ということは、毎回検索条件の文字列が一致しない?SQLのキャッシュの効きが弱くなる?さすがにそんなことはしていないと思うのだが。。
  • エンティティの挿入サンプル
    • SQLのログには自動生成されたIDは表示されないので注意。
            insert into EMPLOYEE (ID, NAME, SALARY, DEPARTMENT_ID, ADDRESS_ID, VERSION) values (null, 'test', null, null, null, 1)
                                                                                                  ↑
  • SQLによる検索のサンプル
    • EmployeeではなくEmployeeDtoを使っているのはなぜ?ちなみにEmployeeでも問題なく動いた。SQLを直書きするようなケースでは画面デザインに合わせてjoinすることが多いのでDTOにしてるのかな?
  • その他
    • S2Daoとの違いを確認する。
    • JPAベースだがGAE/jのJDOと使い方が似ていた。JPAとJDOの違いも確認しておこう。

第4章 Webアプリケーションの自動作成 Doltengを使う

4-1 セットアップ
4-2 scaffold
  • Scaffold
    • URLがエンティティベースになっているのは、それはそれでよいのか?Railsもそうだけど。不勉強なだけで、もう少し調べれば出てくるのかな。

まとめ

良書。基本的にチュートリアルの内容に加筆しているものなので、買わなくてもいける。Seasarチュートリアルは丁寧だし。ただし、時間の短縮と安心感という観点で買ってよかったと思う。