ColdFusionカフェテリア
SAMURAIZ

 

ColdFusionコンポーネントの紹介

作成日: 2009年8月1日
作成者:ハイミン・エンタープライズ(株) 千葉 博胤
佐藤 弘一
最終更新日: 2009年8月1日

ColdFusionコンポーネントの紹介

 連載第1回、第2回で、ColdFusionのタグと関数の紹介をしました。これでCFMLではどういったことができるのか、といったところの概要がわかったかと思います。
今回の連載第3回では、ColdFusionコンポーネント(cfc)を紹介いたします。コンポーネントを使用しなくても構築することはできますが、ある特定の関連する機能を1つのコンポーネントとしてパッケージ化して再利用する事で、開発生産性、品質を高めることができます。

 

■ColdFusionコンポーネントの基本

cfcは、主に<cfcomponent>タグ、<cffunction>タグ、<cfargument>タグから構成されています。それぞれのタグは以下の役割を持っています。

<cfcomponent>
   コンポーネントを定義します。コンポーネントの名称や、継承コンポーネントの指定などを行います。

<cffunction>
   コンポーネント内のメソッドを定義します。メッソドへのアクセス権、戻り値のデータ型の指定などを行います。

<cfargument>
   メソッド内への引数を定義します。メソッドの名称や、デフォルト値、必須属性、データ型などの指定を行います。

これらのタグを使用して、cfcファイル(拡張子cfc)内にメソッドを記述していきます。

cfcファイルの構成は以下のようになっています。

<cfcomponent>
    <cffunction>
        <cfargument>
            ・
            ・
            ・
    </cffunction>
 
    <cffunction>
        <cfargument>
        <cfargument>
            ・
            ・
            ・
    </cffunction>
</cfcomponent>

<cfcomponent>タグで全体を括り、その中に<cffunction>タグにて作成するメソッドを記述していきます。メソッドはcfc内にいくつ作成してもかまいません。<cfargument>タグにてメソッドに引き渡す引数を定義します。

■cfcの実例

では、具体的にどのようにcfcを作成するか見ていきましょう。

顧客管理システムの顧客マスタメンテナンス画面で使用するcfcを想定してみましょう。cfcを構成する単位は色々ありますが、今回は顧客管理システムの機能単位に作成することとしますので、顧客マスタメンテナンス用のcfcを作成します。
※他には、データベースのテーブル単位であったり、DBへのアクセスの種類(select,update,insert,delete)単位など、そのシステムに最適な単位を検討します。

顧客マスタメンテナンス画面では、どのような処理があるでしょうか。
(1)顧客情報を登録する処理
(2)顧客情報を修正する処理
(3)顧客情報を削除する処理
(4)顧客情報を参照する処理
一般的には上記のような処理があるかと思います。当画面用のcfcには、上記4つのメソッドを作成することにします。

コンポーネントおよび、データベースの構成を以下のように定義します。
 

コンポーネントの構成
顧客マスタメンテコンポーネント(customerMainte)

論理名 物理名
顧客情報登録処理 insCustomer
顧客情報修正処理 updCustomer
顧客情報削除処理 delCustomer
顧客情報参照処理 getCustomer

 
テーブルの構成

顧客マスタ(custmer)

論理名 物理名 型(サイズ) キー
顧客コード customercode varchar(8)
顧客名 customername varchar(20)  
部署 department varchar(20)  
削除フラグ deleteflg varchar(1)  

まず、<cfcomponent>タグを記述します。name属性は上記表の通り、customerMainteにします。

<cfcomponent name="customerMainte">
 
</cfcomponent>

次に(1)顧客情報登録処理のメソッドを作成します。

<cfcomponent name="stomerMainte"
    displayname="顧客マスタメンテナンス用コンポーネント"
    hint="顧客マスタのCURDを行う">
 
    <cffunction name="insCustomer" returntype="boolean"
        displayname="顧客マスタ更新"
        hint="顧客マスタのデータを更新する">
        <cfargument name="code" required="yes" type="string" hint="顧客コード">
        <cfargument name="name" required="yes" type="string" hint="顧客名">
        <cfargument name="dept" required="yes" type="string" hint="部署名">
        <cfargument name="del" required="no" type="string" default="0" hint="削除フラグ">
 
        <cftry>
            <cfquery name="qInsCustomer" datasource="cafeDS">
                insert into customer values (
                    '#Arguments.code#',
                    '#Arguments.name#',
                    '#Arguments.dept#',
                    '#Arguments.del#'
                )

            </cfquery>
 
            <cfcatch>
                <cfrethrow>
                <cfreturn false>
            </cfcatch>
        </cftry>
        <cfreturn true>
    </cffunction>
</cfcomponent>

上記ソースを少し解説します。
<cfcomponent>タグで、メソッドの名前と、戻り値の型を指定します。登録処理なので、戻り値は処理結果のboolean型になります。また、displayname属性、hint属性は、イントロスペクションによるコンポーネント情報を表示する際の情報です。  ※イントロスペクションについては、後述します。
次に<cfargument>タグでメソッドに渡す引数を定義します。顧客情報登録処理では、顧客コード、顧客名、部署を引数として渡します。
続いて、<cfquery>タグにてInsert文を記述します。
そして最後に戻り値として、例外をキャッチしたら「false」、正常終了したら「true」を返します。
これで1つメソッドが完成しました。

続いて(2)顧客情報修正処理、(3)顧客情報削除処理のメソッドを作成しますが、(1)顧客情報登録処理処理と同じ形式で作成できますので割愛します。
最後に完成形のcfcを載せますのでそちらを参照してください。

最後に(4)顧客情報参照処理のメソッドを作成します。

<cfcomponent name="customerMainte"
        displayname="顧客マスタメンテナンス用コンポーネント"
        hint="顧客マスタのCURDを行う">
    <cffunction name="getCustomer" returntype="query"
            displayname="顧客マスタ参照"
            hint="顧客マスタのデータを参照する">
        <cfargument name="code" required="yes" type="string" hint="顧客コード">
 
        <cftry>
            <cfquery name="qGetCustomer" datasource="cafeDS">
                select
                    customercode,customername,department,deleteflg
                from customer
                where
                    customercode = '#Arguments.code#' and
                    deleteflg = '0'

            </cfquery>
 
            <cfcatch>
                <cfrethrow>
                <cfset qGetCustomer = queryNew("")>
            </cfcatch>
        </cftry>
        <cfreturn qGetCustomer>
 
    </cffunction>
</cfcomponent>

(1)顧客情報登録処理処理、(2)顧客情報修正処理、(3)顧客情報削除処理と違う点だけ解説します。
<cffunction>タグのreturntype属性ですが、(1)〜(3)では、returntype属性は「boolean」としていました。しかし、(4)顧客情報参照処理ではselect文を実行し、取得されたデータを戻り値として返しますので、returntype属性は「query」となります。
また、<cfreturn>タグで返す値も、「true」「false」ではなく、クエリ結果である「qGetCustomer」になります。

以下が(1)〜(4)までのメソッドをすべて記述したcfcです。
※適宜コメントは付加しました。


<!---
================================================================
機能名:顧客マスタメンテナンス画面用コンポーネント
概要  :顧客マスタのCURDを行う
作成者:千葉 博胤
作成日:2009/07/10
================================================================
--->

<cfcomponent name="customerMainte"
    displayname="顧客マスタメンテナンス用コンポーネント"
    hint="顧客マスタのCURDを行う">
 

    <cffunction name="insCustomer" returntype="boolean"
        displayname="顧客マスタ登録"
        hint="顧客マスタのデータを登録する">
        <cfargument name="code" required="yes" type="string" hint="顧客コード">
        <cfargument name="name" required="yes" type="string" hint="顧客名">
        <cfargument name="dept" required="yes" type="string" hint="部署名">
        <cfargument name="del" required="no" type="string" default="0" hint="削除フラグ">
 
        <cftry>
            <cfquery name="qInsCustomer" datasource="cafeDS">
                insert into customer values (
                    '#Arguments.code#',
                    '#Arguments.name#',
                    '#Arguments.dept#',
                    '#Arguments.del#'
                )

            </cfquery>
 
            <cfcatch>
                <cfrethrow>
                <cfreturn false>
            </cfcatch>
        </cftry>
        <cfreturn true>
    </cffunction>
 
 

<!---
================================================================
機能  :顧客マスタ更新
関数名 :updCustomer
引数  :code   顧客コード
     :name  顧客名
     :dept   部署名
戻り値 :true/false
================================================================
--->

<cffunction name="updCustomer" returntype="boolean"
            displayname="顧客マスタ更新"
            hint="顧客マスタのデータを更新する">
    <cfargument name="code" required="yes" type="string" hint="顧客コード">
    <cfargument name="name" required="yes" type="string" hint="顧客名">
    <cfargument name="dept" required="yes" type="string" hint="部署名">
    
    <cftry>
        <cfquery name="qUpdCustomer" datasource="cafeDS">
            update customer
            set
                customername = '#name#',
                department = '#dept#'
            where
                customercode = '#Arguments.code#'

        </cfquery>
    
        <cfcatch>
            <cfrethrow>
            <cfreturn false>
        </cfcatch>
    </cftry>
    <cfreturn true>
    
</cffunction>
 
 

<!---
================================================================
機能  :顧客マスタ削除
関数名 :delCustomer
引数  :code   顧客コード
戻り値 :true/false
================================================================
--->

<cffunction name="delCustomer" returntype="boolean"
            displayname="顧客マスタ削除"
            hint="顧客マスタのデータを削除(論理削除)する">
    <cfargument name="code" required="yes" type="string" hint="顧客コード">
    
    <cftry>
        <cfquery name="qDelCustomer" datasource="cafeDS">
            update customer
            set
                deleteflg = '1'
            where
                customercode = '#Arguments.code#'

        </cfquery>
    
        <cfcatch>
            <cfrethrow>
            <cfreturn false>
        </cfcatch>
    </cftry>
    <cfreturn true>
    
</cffunction>
 
 

<!---
================================================================
機能:顧客マスタ参照
関数名 :getCustomer
引数 :code   顧客コード
戻り値 :クエリ結果
================================================================
--->

<cffunction name="getCustomer" returntype="query"
            displayname="顧客マスタ参照"
            hint="顧客マスタのデータを参照する">
    <cfargument name="code" required="yes" type="string" hint="顧客コード">
        
    <cftry>
        <cfquery name="qGetCustomer" datasource="cafeDS">
            select
                customercode,customername,department,deleteflg
            from customer
            where
                customercode = '#Arguments.code#' and
                deleteflg = '0'

        </cfquery>
        
 
        <cfcatch>
            <cfrethrow>
            <cfset qGetCustomer = queryNew("")>
        </cfcatch>
    </cftry>
    <cfreturn qGetCustomer>
 
</cffunction>
</cfcomponent>

 
 

■cfcの使用方法

続いて、作成したcfcをどのようにして使用するかを解説します。
作成したcfcは、cfmページもしくはcfcページから呼び出して使用することが可能です。先ほど作成したcustomerMainteコンポーネントを使用する方法を見ていきましょう。

まずは、cfcオブジェクトのインスタンスを作成します。インスタンスを作成するには、<cfobject>タグを使用します。次に<cfinvoke>タグ、<cfinvokeargument>タグを使用して各メソッドを呼び出します。

<cfobject component="cfcafe.custm.customerMainte" name="objCustomer">
 
<cfinvoke component="#objCustomer#" method="insCustomer" returnvariable="InsRet">
    <cfinvokeargument name="code" value="00001">
    <cfinvokeargument name="name" value="CFソリューション株式会社">
    <cfinvokeargument name="dept" value="RIA事業部">
</cfinvoke>
<cfdump var="#InsRet#">

<cfopbject>タグでcfcのインスタンスを作成します。component属性でインスタンスを作成するコンポーネントを指定します。ここで注意ですが、component属性で、「cfcafe.custm.customerMainte」といった具合にcfcファイル名(拡張子なし)とともに、ディレクトリ名も記述しています。cfcファイル名だけでもよいのですが、cfc名だけの場合、以下の順番でColdFusionがcfcファイルを検索します。
    (1)cfcを呼び出すcfmファイルと同じディレクトリ
    (2)webルート
    (3)ColdFusion Administratorでの指定ディレクトリ

(1)にcfcファイルがある場合はいいのですが、そうでない場合は余計な検索が走ってしまいます。たいした差ではないのですが、少しでも不要な要因は取り除いておいた方がいいでしょう。

そして、<cfinvoke>タグのcomponent属性には作成したインスタンス名を指定し、method属性にてメソッドを指定します。また、<cfinvokeargument>タグにて、メソッドで必要とされる引数を指定します。コンポーネント「customerMainte」のメソッド「insCustomer」では、「code」「name」「dept」の3つの引数が必要なので、<cfinvokeargument>タグでそれら3つの引数を渡します。引数「del」(削除フラグ)は必須ではないので、ここでは省略します。

上記サンプルプログラムを実行すると、insCustomerの実行結果が「true」と表示されます。

続いて、updCustomerとgetCustomerを実行してみましょう。

<cfobject component="cfcafe.custm.customerMainte" name="objCustomer">
 
<cfinvoke component="#objCustomer#" method="updCustomer" returnvariable="UpdRet">
    <cfinvokeargument name="code" value="00001">
    <cfinvokeargument name="name" value="株式会社CFソリューション">
    <cfinvokeargument name="dept" value="RIA事業部">
</cfinvoke>
 
<cfinvoke component="#objCustomer#" method="getCustomer" returnvariable="GetRet">
    <cfinvokeargument name="code" value="00001">
</cfinvoke>
 
<cfdump var="#GetRet#">

<cfinvoke>タグでupdCustomerとgetCustomerを実行します。updCustomerで顧客マスタを更新した後、getCustomerにてデータを取得して、<cfdump>タグにてクエリ結果を表示しています。

 
 

■イントロスペクションについて

cfcでは、コンポーネントのドキュメント情報をcfc内に記述し、ブラウザで参照する事ができるようになっています。
cfcのサンプルプログラムで、hint属性とdisplayname属性を指定したと思いますが、そこで指定した値がイントロスペクションで表示されます。
※hint属性とdisplayname属性を指定しなくてもイントロスペクションを参照することはできます。

説明するよりも、まず見てみましょう。
私の環境では以下のようなフォルダ構成になっています。
「C:\Inetpub\wwwroot\cfcafe\custm\customerMainte.cfc」
webルートをcfcafeフォルダとし、その下にcustmフォルダを置きここにcfcを格納しています。
ブラウザで、「http://localhost/cfcafe/custm/customerMainte.cfc」にアクセスします。
※皆さんのフォルダ構成に応じて読み替えてください。

すると、コンポーネントブラウザログイン画面の後、以下のようにコンポーネント「customerMainte」の定義内容が表示されます。
(図1)

※クリックすると別ウインドウで拡大画像が表示されます。
 

まずコンポーネント全体の定義ブロックがあり、その下にメソッドの定義ブロックがあります。hint属性やdisplayname属性で指定した値も表示されています。
コンポーネント仕様の大枠ですが、最低限必要な情報は載っていますので、開発中に設計書を引っ張り出さなくても、ある程度のことはここで確認することができます。

 
 

■さいごに

連載第3回はColdFusionコンポーネントを紹介しました。cfcを使用しなくても構築することは可能ですが、cfcを使用することによって開発効率の向上や、高品質化の手助けになると思います。是非cfcを使いこなし、webシステムを構築してみてください。

さて次回は、ColdFusionのデバッグについて学んで行きたいと思います。

ColdFusionの各種情報の配信


最新情報
■2017/6/26
『ColdFusion 実験室』
実験6

■2017/3/27
ColdFusion 2016 対応
インストール セットアップ情報
CFサーバーのインストール
CFビルダーのインストール

■2016/9/20
『ColdFusion 2016 リリース
Enterprise Edition 活用資料』
記事一覧

■2016/3/30
『ColdFusion 実験室』
実験4、実験5

■2015/8/10 〜
『ColdFusion クリニック』
記事一覧(随時更新中)

■2015/4/8
『JasperReportsによる帳票出力』
2. JasperReportsによる帳票出力【後編】

■2015/3/12
アップクロス株式会社
西元 貞昭様
『JasperReportsによる帳票出力』
1. JasperReportsによる帳票出力【前編】


■2015/2/25
『ColdFusionでエクセルを使いこなそう!』
4. 【上級】ColdFusionのエクセル機能を利用したPDF帳票の紹介

ColdFusionトレーニング


ColdFusionユーザーグループ
ColdFusionユーザーグループ
Copyright 2012 Samuraiz Corporation. All Rights Reserved.