気軽に楽しくプログラムと遊ぶ

自分が興味があってためになるかもって思う情報を提供しています。

Teeda(概要〜入力/サブミット〜画面遷移)

Seasarプロジェクト発のJSFをベースとしたフレームワーク Teeda

概要

機能

JSFの標準機能に加え, DIとAOPの機能を保持
POJO中心の開発スタイルを提供

モジュール構成

関連ライブラリ

Dolteng:webアプリケーションを生成するeclipseプラグイン

 チュートリアル

http://teeda.seasar.org/ja/extension/tutorial/index.html

入力/サブミット・画面遷移

  1. htmlに対応するのがPageクラス
  2. htmlに定義したid属性の項目はPageクラスの属性となる →Doltengを用いれば、自動生成可能、nameにはsetter,getterが不要。
  3. 入力/サブミット・画面遷移 submit(実行ボタン)のidはPageクラスでメソッドとして定義される。
  <input type="submit" id="doCalcurate" value="計算実行" />

画面遷移

1.各コンポーネントによる遷移

<ボタン遷移>
input type="subimit"に指定したid値のメソッド内において返却する戻り値の型に合わせて、画面遷移する

  • Class型:指定したPageクラスに紐付くhtmlに遷移する
  • String型:JSFのナビゲーション(outcome)を指定する
  • Void型:遷移せずに同一画面に戻る

   public Class doCalculate() {
        return AddResultPage.class;
    }

<リンク遷移>

<a id="goAddResult" href="addResult.html?arg1=123&arg2=223">計算結果画面へ遷移する</a>

aタグの場合はhref属性をみて遷移先を決める。

2.遷移コンポーネントのidに指定できるメソッドの種類

  • do~ クラス内メソッドを呼び出し、戻り値の型に応じた遷移を行う
  • go~ リンクのようなクラス内メソッドを介さない遷移を行う。入力値検査は実施
  • jump~ go~と同様の動作。入力値検査は未実施

参考URL

Teedaチュートリアル4-3 - おおたに6号機blog
Teeda/gettingStarted - SeasarWiki

DBFluteとは?

  • DBアクセスを行うO/Rマッパー (DBFlute Runtime)
  • DB周りの便利な各種ツール (DBFlute Client)

DBFlueteの特徴

ORマッパー

  • DBのメタ情報を元にコードを自動生成してくれ、SQL発行をタイプセーフに行うことができる。
  • JDBC APIのみに依存
  • DBのテーブル構造のまま、Javaから操作できるようにしてくれる。
    • クラスフィールドとDBカラムのマッピング設定は不要
    • テーブルがクラス(entity)になり、カラムがフィールドになる。
    • 外部キーから関連の多重度を推測し、適切なフィールドを追加。(1:Nならば1側にListをN側にTを追加)
  • DBテーブル構造に対応するSQL生成コードが生成される。
    • テーブルAとテーブルBに外部キーがあれば、テーブルAとテーブルBをJoinするメソッドなど

DB周りの便利な各種ツール

  • O/Rマッピング用コード生成ツール(jdbc,generate,sql2entity,doc,manage,regenerate)
  • DBスキーマを作成する(ReplaceSchema)
    • DDLを実行し、Excel/CSV/TSVからデータをINSERTする。
    • DDL実行前に、既存のスキーマに存在するテーブルを自動で全DROPしてくれる。

DBFluteの主要クラス

  • Entity
    • レコード値を保持するクラス。(テーブルと1:1で対応)
    • SQL発行結果を詰めたり、INSERT/UPDATEのパラメータを詰めるために使用する。
  • conditionBean(CB)
    • クエリの組み立てに使用するクラス。(テーブルと1:1で対応)
  • Behavior(Bhv)
    • 組み立てたCBを引数として受け取り、実際にSQL発行を行うクラス。(テーブルと1:1で対応)
    • BehaviorはDIコンテナ管理下となる。ビジネスロジック側ではDIコンテナからインジェクションしてもらう。

DBFluteの利用例(CRUD)

public class ProductRepositoryTest {
  @Inject
  private ProductBhv productBhv;
  
  @Test
  public void selectRow() {
    // 条件設定Bean(CB)を生成
    ProductCB cb = productBhv.newMyConditionBean();
    
    // 「XXXXXとproduct_codeが等しい」の条件をCBへ追加
    cb.query().setProductCode_Equal("XXXXX");
    
    // 検索条件を元にselect発行、結果をproductのentityへ詰める
    Product product = productBhv.selectEntity(cb);
    
    // productのproduct_codeにXXXXXが設定されていることを確認
    assertThat(product.getProductCode(), is("XXXXX"));
  }
  
  @Test
  public void selectRows() {
    // 条件設定Bean(CB)を生成
    ProductCB cb = productBhv.newMyconditionBean();
    
    // iPadと前方一致するproduct_nameを持つ、productを検索
    cb.query().setProductName_LikePrefix("iPad"); // likeContain() 部分一致、likeSuffix() 後方一致
    
    // productを複数取得
    List<Product> products = productBhv.selectList(cb);
    
    // products内のproduct_nameのリストに「"iPad", "iPad mini", "iPad Air"」が含まれていることを確認
    assertThat(products.stream().map(Prodcut::getProductName).collect(toList()), hasItems("iPad", "iPad mini", "iPad Air"));
  }

  @Test
  public void selectJoin() {
    // 条件設定Bean(CB)を生成
    ProductCB cb = val.newMyConditionBean();
    
    // 「XXXXXとproduct_codeが等しい」の条件をCBへ追加
    cb.query().setProductCode_Equal("XXXXX");
    
    // productテーブルと関連しているmanufactureテーブルを結合
    cb.setupSelect_Manufacture();
    
    // 検索条件を元にselect発行、結果をproductのentityへ詰める
    Product product = productBhv.selectEntity(cb);
    
    // productの関連テーブルのmanufactureの名前がFoxconnであることを確認
    assertThat(product.getManufacture().getName(), is("Foxconn"));
  }
  
  @Test
  public void insert() {
    // 登録するproductの内容を作成する
    Product product = new Product();
    product.setProductCode("ZZZZZ");
    product.setProductName("iPad Nano");
    
    // 登録処理
    productBhv.insert(product);
    
    // 登録された内容を確認
    ProductCB cb = new ProductCB();
    cb.query().setProductName_LikePrefix("iPad");
    assertThat(productBhv.selectEntity(cb);
  }
  
  @Test
  public void update() {
    // 更新するproductの内容を作成する
    Product product = new Product();
    product.setProductCode("ZZZZZ");
    product.setProductName("iPad Micro");
    
    // 更新処理
    prdouctBhv.update(product);
    
    // 更新内容を確認する
    assertThat(productBhv.selectByPKValue("ZZZZZ").getProductName(), is("iPad Micro"));
  }
  
  @Test
  public void delete() {
    // 削除する内容を作成
    Product product = new Product();
    product.setProductCode("ZZZZZ");
    prodcut.setProductName("iPad Micro");
    
    // 削除処理
    productBhv.delete(product);
    
    // 削除されたかどうか確認する
    assertThat(productBhv.selectByPKValue("ZZZZZ").getProductName(), is(nullValue());
  }
}

参考URL

DBFluteをできるだけ簡単に説明してみる - taktosの日記

DBFluteって、凄いんだぜ!: Web屋のまじめな話 | 株式会社アスペア

Seasar2の開発の進め方

ページ駆動開発

HTMLで作成されたUIモックベースに開発を進める手法。Seasar2で使う開発手法。
テーブル設計、Dotengを使ってDaoの自動生成、Pageクラスの作成を行い、処理を作っていく。

ページ駆動開発の手順

  1. UIモックを作成し、ユーザーレビュー
  2. 入出力項目の洗い出し、テーブル設計
  3. Doltengを用い、EntityとDaoを作成
  4. HTMLの入出力項目のタグのidにテーブル名のカラムを記述
  5. HTMLのボタンのタグのidに処理メソッド名を記述
  6. Doltengを用い、JavaのPageクラスを自動生成
  7. ユーザー要件に合わせて、ロジックを記述

1,2の詳細は省きます。3〜6について詳細を以下に記載します。

3. Doltengを用い、EntityとDaoを作成

EntityとDaoの名称
Entity:テーブル名 例) emp
Dao:テーブル名 + Dao 例) empDao

4. HTMLの入出力項目のタグのidにテーブル名のカラムを記述

テーブルカラム名とPageクラスのフィールドを紐付ける

<input text="text" id="empName"/>
<span id="empName">SCOTT</span>

emp_nameというテーブルカラム名の場合、empNameのようにキャメルケースでidに記述する。

5. HTMLのボタンのタグのidに処理メソッド名を記述

idへ処理用メソッド名を設定し、画面遷移を実現する。

<input type="submit" id="go〜"/>

idへ設定する処理名

内容を引き継ぐのみ:go + 画面名
入力チェックなしに遷移:jump + 画面名
何らかの処理を行う:do + 処理名

6. Doltengを用い、JavaのPageクラスを自動生成

DoktebgはHTMLとDBのメタ情報を用いてPageクラスを自動生成する。

Pageクラス
プロパティー:HTMLの入出力項目はid値をプロパティー名とする。
型はデフォルト、String。変更可能で。DBカラム型から自動設定も可能。
メソッド:id値がdoから始まっているものをメソッドとして作成する。
画面初期表示時に一度だけ呼ばれるメソッド initialize()、画面再表示時に呼ばれるメソッド prerender()はHTMLへの記述なしで自動生成される

※ jumpXxxやgoXxxはTeedaが自動的に処理するため、メソッドは作成されない。

ユーザー要件に合わせて、ロジックを記述

initialze()、prerender()、do〜のメソッドに要件に合わせたロジックを記述して、完成。

Seasar2の特徴とプロダクト構成

Seasar2によるスーパーアジャイルなWeb開発のChapter1の内容をピックアップ、自分の知見を少し追記してまとめました。詳細は書籍で確認してみてください。

プラットフォームの問題

Javaフレームワークは画面遷移の設定、DI(依存性の注入)の設定など、とにかくXMLに設定を書く傾向があり、 XML地獄に陥りがち。

XMLコンパイルされるものではないため、eclipseにおけるエラー表示がされないため、 間違いに気づきづらく、デバッグ時間が増える傾向にある。この結果、生産性が低下してしまう。

Struts,Springはその代表格。

Welcome to the Apache Struts project
Spring

再デプロイの問題

XMLファイル、ソースコードの修正時にアプリケーションを再デプロイして、アプリケーションサーバーを 再起動しなければならない。

Ruby言語ではソース修正後に再デプロイ、再起動なしですぐに結果を確認できる。
サクサク感のある開発が、やる気や効率を上げてくれる。

そういったJavaの問題を解決してきたのがSeasar2

Searsar2の特徴

  • サクサク感のある開発
  • 設定ファイルいらずの開発

サクサク感のある開発

HOT deploy(ホットデプロイ)機能
アプリサーバーを起動させたまま、ソースコードの修正を認識させる。
再デプロイや再起動で待たされることがなくなる。

COOL deploy(クールデプロイ)機能
運用時にパフォーマンスを下げないためのCOOL deployモードを提供
HOT deployの時のように修正を即時で認識はしないモード

設定ファイルいらずの開発

定型的な設定はフレームワークが自動的に処理し、例外的な設定のみを 明示的に設定する思想でフレームワークが作られている。

何が起こっているかわからなくて不安、理解が浅くなると考える人に対して、 自動設定される内容を表示する機能も備えている。

プロダクト構成

Javaの生産性を上げるためのSeasar2の周辺のフレームワークツール群をSuper Agile Family と呼んでいます。その構成は以下の通りになっています。

  • Seasar2 (しーさーつー)
    • S2Container (えすつーこんてなー)
    • S2Dxo (えすつーだっくすおー)
  • Teeda (てぃーだ)
  • S2Dao (えすつーだお)
  • Dolteng (どぅるてん)

Seasarの生みの親のひが やすをさんが沖縄出身ということで沖縄にちなんだ名前が多い。

Seasar2

S2Container

DIコンテナーのこと。オブジェクトを疎結合に結びつけ、保守性を高めるSuper Agileを支える縁の下の 力持ち的な存在。ほとんど自動的に処理を行うため、使う側は存在を意識しない。

S2Dxo
MapとJavaBeans、JavaBeansとJavaBeansなどのオブジェクト間の変換を行う。
Entityを画面用オブジェクトに変換したり、その逆をやったりする。

いまいち、想像しづらい。実装時に意識することがあるんだろうか。

Teeda

沖縄の方言で「太陽」を意味するWeb機能を提供するフレームワーク
JSF(Java Server Faces)の実装の「Core」とその機能を拡張した「Extension」に分かれる。

もともとはViewテンプレートにJSPを用いていたり、設定ファイルを書く必要があったが、 Teeda Extensionにおいて、ViewテンプレートにHTMLを使う、規約重視によって 設定ファイルなしの開発を可能にしている。

S2Dao

DBアクセス機能を提供するフレームワーク。 実装を書かずにインタフェースにメソッドを記述するだけでDBアクセスを可能とする。

Dolteng

開発効率を上げるソース自動生成ツール
例外的なケースのみを明示的に実装する。

Seasar2のTeeda、S2Daoの基礎を一気に身につけるまとめ

下記、書籍における勉強したまとめをドンドン追記していきます!
ちょっと古めな技術ですが、必要に迫られたので。Seasar2におけるAgile FamilyのTeedaS2Daoの基礎知識を身につけていきます。

上記の本は8年前の内容になっているので、現在は使われなくなった技術なども紹介している可能性があります。Teedaに関して学習したかったのですが、公式ページ以外に学習できるのがこの本ぐらいだったので、こちらの本で一旦、学習を進めます。

概要理解

Seasar2の特徴とプロダクト構成

アフェリエイトリンク作成サービス ヨメレバの使い方

f:id:tamata78:20160527094633p:plain

書籍紹介ブログパーツ ヨメレバ

せっかくブログ書いているからアフェリエイト用リンクを貼り付けてみようか。。と思い、やってみました。
手順を忘れないようにメモしておきます。

「ヨメレバ」はブログ上で書籍を紹介するブログパーツです。
Amazon,楽天ブックス、7netなど多数へのリンクを表示することでアフェリエイト報酬の取りこぼしを減らせる。

アフェリエイト登録がされていれば ユーザーデータ登録、リンク生成を手軽に行うことができる。

ユーザーデーター入力

「ユーザーデーター入力」の項目で必須項目の「サイト名」、「Amazonアソシエイト」入力、任意のショップ(楽天ブックス、7net)などの アフェリエイトIDを入力して、保存ボタンをクリック!

f:id:tamata78:20160527095833p:plainf:id:tamata78:20160527095836p:plain

※データはCookieで保存されるため、次回からは入力する必要はありません

ブログパーツ生成

ユーザーデーター入力で情報を保存すると、ブログパーツ生成のメニューが出るので 10桁のISBN番号を入力、表示ボタンをクリックすると、リンクを生成できる。

f:id:tamata78:20160527094825p:plain

リンクをブログに貼り付ける

あとはそのリンクをブログに貼り付けて完成!!

f:id:tamata78:20160527100048p:plain

貼った内容は以下の通りに表示される。うーーーん、簡単!

PostgresSQLでテーブル名一覧とカラム名一覧を取得する方法

テーブル一覧を取得

SELECT relname AS table_name FROM pg_stat_user_tables

カラム名一覧を取得

SELECT * FROM pg_attribute WHERE attrelid = 'your_table_name'::regclass;

参考URL

http://chopl.in/post/2013/11/07/how_to_retrieve_tables_and_columns_with_postgres/