SAStrutsの開発Tips



Similar documents
スライド 1

<4D F736F F D20819C486F70658F6F93588ED297708AC7979D89E696CA837D836A B E A2E646F63>

目 次 目 次 1 ログイン ログアウト ログインする...1 ログイン 画 面 が 表 示 されないときは?... 1 初 めてログインするときのパスワードは?... 2 初 期 パスワードを 忘 れてしまったときは?... 2 変 更 したパスワードを 忘 れてしまったときは?.

1

- INDEX - 1 ご 利 用 時 間 1 2 メニュー 1 3 ご 利 用 になる 前 に 行 っていただきたいこと 3 (1) 所 在 地 沿 線 設 定 3 (2) 会 員 情 報 の 管 理 ( 自 社 情 報 の 設 定 ) 5 4 物 件 情 報 の 登 録 8 (1) 操 作 概

4 応 募 者 向 けメニュー 画 面 が 表 示 されます 応 募 者 向 けメニュー 画 面 で [ 交 付 内 定 時 の 手 続 を 行 う] [ 交 付 決 定 後 の 手 続 を 行 う]をクリックします 10

WEB版「新・相続対策マスター」(ご利用の手引き)

「1 所得税及び復興特別所得税の確定申告書データをお持ちの方」からの更正の請求書・修正申告書作成編

計算式の取り扱い

MetaMoJi ClassRoom/ゼミナール 授業実施ガイド

(Microsoft PowerPoint - Ver12\203o\201[\203W\203\207\203\223\203A\203b\203v\216\221\227\277.ppt)

「給与・年金の方」からの確定申告書作成編

治 験 実 施 管 理 システム NMGCP 向 け Excel 形 式 プロトコール 作 成 手 順 書 V4.0.3 対 応 版 第 1 版 株 式 会 社 富 士 通 アドバンストエンジニアリング All Rights Reserved,Copyright 株 式 会 社 富 士 通 アドバン

R4財務対応障害一覧

<82C582F182B382A2322E3594C5837D836A B2E786C73>

スライド 1

01_07_01 データのインポート_エクスポート_1

WEBメールシステム 操作手順書

G-Web操作マニュアル

目 次 機 能 運 用 上 の 注 意 処 理 手 順 画 面 説 明 ログイン 直 送 先 選 択

スライド 0

目 次 1. Web メールのご 利 用 について Web メール 画 面 のフロー 図 Web メールへのアクセス ログイン 画 面 ログイン 後 (メール 一 覧 画 面 ) 画 面 共 通 項 目

V-CUBE One

Microsoft PowerPoint - KeySQL50_10g_vlo3.ppt

研究者情報データベース

PowerPoint プレゼンテーション

TIPS - 棚 割 りを 開 始 するまで Liteを 起 動 し 企 業 情 報 の 追 加 を 行 い 棚 割 を 行 う 企 業 の 追 加 をして 下 さい 企 業 情 報 の 追 加 時 に エラーメッセージが 表 示 された 場 合 別 途 TIPS トラブルが 発 生 した 場 合

DN6(R04).vin

KINGSOFT Office 2016 動 作 環 境 対 応 日 本 語 版 版 共 通 利 用 上 記 動 作 以 上 以 上 空 容 量 以 上 他 接 続 環 境 推 奨 必 要 2

1. 業 務 概 要 貨 物 情 報 登 録 済 の 貨 物 に 対 して システムを 介 さずに 行 われた 税 関 手 続 きについて 税 関 が 許 可 承 認 等 を 行 った 旨 を 登 録 する また システムで 行 われた 以 下 の 税 関 手 続 き( 以 下 輸 出 申 告 等

目 次 1.はじめに 1-1. はじめに 2. 操 作 2-1. 概 要 2-2. 操 作 方 法 ( 調 査 依 頼 の 確 認 ) 2-3. 操 作 方 法 ( 回 答 登 録 ) 2-4. 操 作 方 法 (ワークシート 出 力 ) 2-5. 操 作 方 法 (ワークシート 取 込 ) 3.

企業結合ステップ2に関連するJICPA実務指針等の改正について③・資本連結実務指針(その2)

Microsoft Word - サンプル _データベースアクセス_.doc

給料らくだ7.5・かるがるできる給料5.5 追加マニュアル

Microsoft PowerPoint _リビジョンアップ案内_最終.pptx

<4D F736F F D C97F195CF8AB DEC90E096BE8F912091E6312E313294C52E646F63>

Transcription:

2008 Autumn SAStrutsの の 開 発 Tips 出 羽 健 一 2007 Autumn The Seasar Foundation and the others 2008. all rights reserved. 1

はじめに このセッションの 内 容 SAStrutsを 使 った 開 発 において 悩 みそうなトピックに 絞 って 解 説 SAStrutsと 一 緒 に 使 用 されることが 多 い S2JDBCについても 扱 う SAStrutsの 基 本 的 な 内 容 については 扱 わない 公 式 ドキュメント( 1)や 以 前 のカンファレンス 資 料 ( 2) をどうぞ! 1 SAStrutsの 公 式 ページ http://sastruts.seasar.org/ 2 StrutsからSAStrutsへ http://event.seasarfoundation.org/sc2008spring/session#s4 2

SAStrutsの の 特 徴 Strutsベースのフレームワーク ク Strutsの 利 点 を 活 かせる ノウハウ 開 発 者 人 口 の 多 さ 実 行 速 度 安 定 性 Strutsのマイナス 要 素 が 排 除 されている 設 定 ファイル 地 獄 からの 開 放 ホットデプロイ 対 応 によるサクサク 開 発 ブラウザのリロードでソースコード 修 正 が 即 反 映 される 脱 CoC CoCはマッピングなど 必 要 最 小 限 に 限 定 明 示 的 なアノテーションベースの 開 発 エンタープライズはもちろん Strutsが t が 苦 手 なアジャイルもOK! 3

SAStrutsのおさらい 足 し 算 (JSP) <html:errors/> <s:form> <html:text property="arg1"/> + <html:text property="arg2"/> = ${f:h(result)}<br /> <input type="submit" name="submit" value="サブミット"/> </s:form> 4

SAStrutsのおさらい 足 し 算 (アクションフォーム) public class AddForm { @Required @IntegerType public String arg1; } @Required @IntegerType public String arg2; 5

SAStrutsのおさらい 足 し 算 (アクション) public class AddAction { @ActionForm @Resource protected AddForm addform; public Integer result; @Execute(validator = false) public String index() { return "index.jsp"; } } @Execute(input = "index.jsp") public String submit() { result = Integer.valueOf(addForm.arg1) + Integer.valueOf(addForm.arg2); return "index.jsp"; } 6

アーキテクチャ JSP JSP 上 の 変 数 SAStruts Action Form S2BeanUtils (Beans) Entity S2JDBC N 1 1 1 プロパティ 0 1 プロパティ 1 Table フィールド 画 面 の 入 出 力 項 目 (アノテーションによる 検 証 ) 検 証 メソッド ユースケース ス 単 位 読 み 取 り 専 用 プロパティ 実 行 メソッド データ 変 換 入 れポン 出 しポン Service 呼 び 出 し 画 面 遷 移 Action << DI >> 1 << DI >> Service 導 出 項 目 0 1 区 分 値 ( 定 数 ) 拡 張 プロパティ エンティティ 単 位 S2AbstractServiceを 継 承 入 れポン 出 しポン 以 外 のロジック 7

レイヤ モデル 図 JSP 要 検 討! フォーム アクション DTO エンティティ サービス モデルの 詰 め 替 え 処 理 はアクションで 行 う 重 要 JSPにエンティティを 持 ち 込 まないアーキテクチャも 検 討 に 値 する 8

レイヤ モデルのアンチパターン1 サービスメソッドの 引 数 にアクションフォームを 渡 す 下 位 レイヤは 上 位 レイヤのモジュールに 依 存 すべき でない 検 索 条 件 はアクションフォームからDtoに 詰 め 替 えた ものをサービスへ 渡 そう 9

レイヤ モデルのアンチパターン2 アクションフォームからDtoに 詰 め 替 えたものを サービスに 渡 し サービス 内 でDtoからエンティ ティに 詰 め 替 える 画 面 入 力 値 をDBに 入 れるだけであれば INとOUT をテストすれば 良 いので 途 中 の 無 駄 な 詰 め 替 え 処 理 は 減 らしたい アクション 内 でアクションフォームからエンティティに 詰 め 替 えて それをサービスへ 渡 すようにする 10

アクションフォーム 責 務 画 面 の 入 出 力 項 目 入 力 値 の 検 証 (アノテーション メソッド) 11

アクションフォーム ポイント 入 力 チェック 対 象 プロパティの 型 : String 型 String[] 型 boolean 型 型 変 換 を 保 証 するアノテーション: @IntegerType, @DateType など プロパティをString 型 で 持 つと HTTPプロトコルとの 相 性 が 良 くてハマりにくい 12

バリデータの 全 体 像 JSP アクションフォーム アクション エラーメッセージ 出 力 <html:errors/> or <html:errors property= xxx /> <html:errors property= yyy /> <html:errors property= zzz /> フォーム <s:form> </s:form> 検 証 用 の アノテーション ターゲット 指 定 独 自 作 成 可 能 実 行 メソッド エラー 時 の 遷 移 先 指 定 検 証 メソッドの 指 定 検 証 メソッド ( 複 数 指 定 可 ) エラー 時 の 継 続 制 御 (stoponvalidationerror) applicaton_ja.properties ラベル 指 定 (labels.xxx= ) メッセージテンプレートの 変 更 エラーメッセージ 出 力 (<html:errors/>)の 書 式 カスタマイズ 13

アクション 責 務 リクエスト 処 理 画 面 系 データとDB 系 データの 変 換 入 れポン 出 しポン 系 データアクセスロジック 入 れポン 出 しポン 以 外 の 業 務 ロジック 出 力 用 プロパティ 画 面 遷 移 14

アクション: 実 行 メソッド 実 行 メソッドは2 種 類 に 分 けると 良 い 入 力 系 処 理 の 実 行 メソッド 出 力 系 処 理 の 実 行 メソッド 上 記 のように 分 けておくと ボタン 追 加 や 画 面 遷 移 などの 仕 様 変 更 時 の 修 正 コストが 少 なくなる 15

アクション: 実 行 メソッド 入 力 系 処 理 の 実 行 メソッド 呼 ばれるタイミング: サブミットが 呼 ばれた 時 主 処 理 : 画 面 入 力 項 目 をDBへ 格 納 する バリデーション: あり 粒 度 : サブミットボタンの 数 だけ 作 る 命 名 : doから 始 まる 名 前 にしておくと 分 かりやすい 戻 り 値 : 出 力 系 処 理 の 実 行 メソッドを 呼 ぶ 16

アクション: 実 行 メソッド 出 力 系 処 理 の 実 行 メソッド 呼 ばれるタイミング: 画 面 を 表 示 する 時 主 処 理 : DBのデータを 画 面 に 出 力 する バリデーション: なし 粒 度 : 1つのJSPに 付 き1メソッド 命 名 : メソッド 名 はJSP 名 と 同 じ 戻 り 値 : JSPファイル 17

アクションフォームのDI 短 いアクションフォームの 名 前 で 扱 う @Resource @ActionForm protected HogeFugaForm g hogefugaform; g name 要 素 で 短 い 名 前 を 指 定 @Resource(name = hogefugaform") @ActionForm protected HogeFugaForm form; 18

サービス S2JDBCを 使 う 場 合 は S2AbstractServiceの 使 用 を 推 奨 します 1つのエンティティに 対 し 1つのサービスを 作 成 する S2AbstractServiceを 使 うと JdbcManagerの 薄 いラッパーとして 扱 える 19

Serviceのクラス 図 << abstract >> S2AbstractService FW 開 発 者 アーキテクト << abstract >> AbstractService プログラマ EmpService DeptService Service 20

S2AbstractServiceの の 中 身 ( 抜 粋 ) public abstract S2AbstractService<T> { @Resource protected JdbcManager jdbcmanager; protected Class<T> entityclass;... public AutoSelect<T> select() { return jdbcmanager.from(entityclass); } } public int insert(t entity) { return jdbcmanager.insert(entity).execute(); }... 21

アプリケーション 側 のサービス アーキテクト public abstract class AbstractService<ENTITY> extends S2AbstractService<ENTITY> ts { } public class EmpService extends AbstractService<Employee> ts { } プログラマ この 時 点 では サービスの 中 身 は 空 っぽ 22

S2AbstractServiceの の 利 用 イメージ 呼 び 出 しイメージ: Employee employee = employeeservice.findbyid(5); employee.name = Dewa ; employeeservice.update(employee); findbyidメソッドやupdateメソッドはs2abstractserviceクラスで 定 義 されている 23

S2AbstractServiceの の 利 用 イメージ 流 れるようなインターフェース もOK @Resource protected EmployeeService employeeservice; public List<Employee> employees; @Execute(validate = false) public String list() { employees = employeeservice.select().innerjoin( innerjoin( department ).where(new SimpleWhere().ge( age, form.age_ge).le( age, form.age_le)).orderby( sort ).resultlist(); st(); } return list.jsp ; 24

AbstractServiceにはどんなメソッドを 定 義 する? 現 時 点 では S2AbstractServiceを 継 承 した AbstractServiceや 各 サービスクラスは 空 っぽ では 何 のために 存 在 するのか? どんなメソッドを 定 義 するべきか? 25

AbstractService JdbcManagerの 薄 いラッパーとして 機 能 する 利 用 例 : insertメソッドのオーバーライド 以 下 のメソッドをAbstractServiceに 定 義 しておくと DB 側 で 規 定 値 をセットするケースに 有 効 /** * エンティティを 挿 入 します * ただし MODIFY_TIMESTAMP, VERSION のフィールドについては * エンティティの 値 は 使 用 しません */ @Override public int insert(entity entity) { return jdbcmanager.insert(entity).excludes("modifytimestamp", "version").execute(); } updateメソッドにも 有 効 26

個 別 サービスクラスの 実 装 個 別 のサービスクラスにはどんなメソッドを 実 装 すべきか? 入 れポン 出 しポン 以 外 の データアクセスロジック 27

データアクセスロジック データアクセスロジックの 分 類 入 れポン 出 しポン 画 面 入 力 値 をDBへ 入 れる DBの 値 を 画 面 項 目 として 表 示 する サービスにはメソッドを 定 義 しないが サービスを 使 って アクションから 呼 び 出 す 入 れポン 出 しポン 以 外 各 種 チェックロジック 例 : ログイン 認 証 チェック サービスにメソッド 定 義 してアクションから 呼 び 出 す 28

ログイン 認 証 処 理 は 入 れポン 出 しポン 処 理 ではない 入 れポン 出 しポン 以 外 の データアクセスロジックの 例 public class LoginAuthService extends AbstractService<LoginAuth> { public boolean checklogin(string loginid, String password) { LoginAuth loginauth = select().where(new SimpleWhere().eq("loginId", userid).eq( password", password)).getsingleresult(); l return loginauth == null? false : true; } } 29

入 れポン 出 しポン 以 外 の データアクセスロジックの 例 /* ログインボタンが 押 された 時 に 呼 ばれる */ @Execute(input = login") public String dologin() { boolean isloginok = loginauthservice.checklogin (form.loginid, form.password); if (!isloginok) { // ログイン 失 敗 した 時 の 処 理 } 入 れポン 出 しポン 以 外 の // ログイン 成 功 した 時 の 処 理 データアクセス 処 理 は サービスクラスに 自 分 で } 定 義 したメソッドを 呼 び 出 す 30

入 れポン 出 しポン のまとめ Webアプリの 多 くが 入 れポン 出 しポン 系 入 れポン 出 しポンのデータアクセスロジックは サービスを 活 用 して アクションに 記 述 する 入 れポン 出 しポン 以 外 のデータアクセスロジック は サービスにメソッド 定 義 したものをアクション から 呼 び 出 す 31

テスト アクションの 実 行 メソッドに 対 して INPUTとOUTPUTを 意 識 したテストを 実 施 モックを 使 わないでDB 経 由 するテスト INPUT アクションフォームのプロパティ OUTPUT アクションフォームのプロパティ アクションのプロパティ DB 32

テスト 入 れポン 出 しポン 以 外 のデータアクセスロジック サービスクラスのpublicメソッドに 対 するテスト モックを 使 用 しないDB 経 由 のテスト 33

データ 詰 め 替 え 主 に フォーム と エンティティ の 詰 め 替 え 詰 め 替 えはアクションにて 行 う 詰 め 替 え 処 理 はメソッド 化 しておくと 単 体 テストしやすい スコープは protected convert ではじまるメソッド 名 とかに 統 一 しておくと 分 かりやすい 例 : Employee employee = convertemployee(xxxform); convert(xxxform, employee); 34

エンティティ 共 通 の 親 クラス 区 分 値 ( 定 数 ) 拡 張 プロパティ ( 導 出 項 目 ) 35

エンティティ: 共 通 の 親 クラス 全 てのエンティティに 共 通 して 保 持 する プロパティは 親 エンティティに 持 たせる 36

エンティティ: 共 通 の 親 クラス 共 通 の 親 クラス(サンプル) @MappedSuperclass public abstract class AbstractEntity { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) public Integer id; @Temporal(TemporalType.TIMESTAMP) public Date createtimestamp; @Temporal(TemporalType.TIMESTAMP) public Date modifytimestamp; } @Version public Integer version; 37

エンティティ: 共 通 の 親 クラス 子 クラス(サンプル) @Entity public class User extends AbstractEntity { public String name; public Integer height; public Integer weight; } @Temporal(TemporalType.DATE) public Date birthday; 38

エンティティ: 区 分 値 ( 定 数 ) DB 上 のフィールドの 区 分 値 は エンティティに 定 数 として 定 義 しておくと 便 利 ハードコーディングを 避 けれる 汎 用 性 の 高 い 区 分 値 は enum の 使 用 も 検 討 すべ し! 39

エンティティ: 区 分 値 ( 定 数 ) サンプルコード public class User extends AbstractEntity { //=============================================== // 定 数 // ==== public static final Integer STATUS_WORKING = 1; public static final Integer STATUS_EATING = 2; public static final Integer STATUS_SLEEPING = 3; //=============================================== // プロパティ // ======= public String name; } public Integer status; 40

エンティティ: 区 分 値 ( 定 数 ) サンプルコード 寝 ているユーザーの 一 覧 を 取 得 する List<User> users = userservice.select().where(new SimpleWhere().eq("status", User.STATUS_SLEEPING)).getResultList(); userservice は 下 記 のUserServiceクラスの インスタンスであり DIされているものとする public class UserService extends AbstractService<User>{ } 41

エンティティ: 拡 張 プロパティ エンティティにDBとは 無 関 係 のプロパティ (publicフィールド)を 追 加 したい しかし 不 用 意 に 追 加 すると SQL 文 の 自 動 生 成 時 に 追 加 した 列 が 含 まれてエラーになる 解 決 案 : 永 続 化 対 象 外 であることを 指 定 する @Transient を 使 う 金 額 = 単 価 数 量 のような 導 出 項 目 は 読 み 取 り 専 用 プロパティとしてgetterで 定 義 する 42

エンティティ: 拡 張 プロパティ サンプル @Entity public class User extends AbstractEntity { } //============================================ // 拡 張 プロパティ // =========== /** * 回 答 済 かどうか * @return true 回 答 済, false 未 回 答 */ @Transient @Transient が 無 いと public boolean isresponding; S2JDBCのSQL 自 動 生 成 & 実 行 時 にエラーとなる 43

登 録 後 のF5による2 重 登 録 問 題 問 題 確 認 画 面 完 了 画 面 登 録 1 登 録 処 理 2 リロード or F5 操 作 リロード(F5) 時 に 直 前 のリクエストが 発 行 される 二 重 登 録 されてしまう! 44

登 録 後 のF5による2 重 登 録 問 題 対 策 登 録 処 理 の 後 にリダイレクトさせる 確 認 画 面 完 了 画 面 登 録 1 登 録 処 理 2リダイレクト 3 リロード or F5 F5 操 作 リロード(F5)しても 直 前 のリクエスト (=リダイレクトのURL)が) 発 行 されるため 登 録 処 理 は 行 われず 完 了 画 面 が 表 示 される 45

まとめ 46

ご 清 聴 ありがとう ございました 47