スポンサードリンク


イントラマートでSAStrutsのTaglibを自作!TLDファイルの記述や外部JSPの読み込み方法は?

    Java フリー素材

    もともとSAStrutsなどのJava開発フレームワークの基盤では
    Taglibと言われるタグライブラリ(API)がいくつか用意されています。

    JSPファイル上でTaglibをインポートして、prefix指定することで、
    提供されているプラグイン・ライブラリが使い放題になります。

    一度記述さえしておけば、そのファイル上ならどこでも呼び出せる上に、
    ウェブコンテンツを生成する際には便利な機能が豊富で画面デザイン・処理を共通化できるのが特徴的です。

    イントラマートにも専用のTaglibがあり、私も頻繁に利用しています。
    開発しているプロジェクトの画面・機能を共通化するには非常にありがたいですね。

    このTaglibの目的は共通利用する処理をプラグイン化したり、
    JSP上で毎回似たような記述・処理をコーディングする手間を大幅にカットできるなど
    チーム開発する上ではかなりの効果を発揮します。

    とにかく一度作ってしまえばものすごく楽なものです。

     

    タグライブラリとは?

    タグライブラリについてあまり知らない方もいらっしゃるかもしれませんので、
    軽くどんなものかを書いていこうと思います。

    知っている方は飛ばしてかまいません。

    まずタグライブラリは簡単に説明すると
    ウェブコンテンツ上で実装できるHTMLタグのような記述文のこと指します。

    JSPプログラマ用のタグの作成に使用できる強力な機能が提供されています。

     

    例えば、JSPファイルのヘッダ部に以下のタグライブラリのインポート文を書き加えたとします。

     

    その後述の任意の場所に以下のカスタムタグを利用します。

     

    この例のタグライブラリはイントラマート専用のものになりますが、
    JSP上にインポートしたタグライブラリの機能を利用できます。

    ちなみに最初のインポート文のprefix属性に指定した「imui」という文字列を
    そのままカスタムタグに使用しています。

    この「imui」を識別して裏側でサーバサイドJavaプログラムの処理が実行され、
    処理結果がJSP上に出力される仕組みです。

    実際にこのカスタムタグを実装したウェブページを確認するとこのようになっています。

    イントラマート タグライブラリ

    前述のカスタムタグがJavaプログラムにより変換され
    タブが2個あるボックスがHTMLタグとして出力されていますね。

     

    ここからはそんなTaglibを簡単に作ることができますので、
    その方法を今回ご紹介したいと思います。

     

    Taglibを生成するにはTagインターフェースを実装

    JSPタグライブラリを実装するには制御用のJavaクラスを実装する必要があります。

    とりあえず定義するJavaクラスは複雑な処理をしないのであれば、ひとつで構いません。

    パッケージ名も任意のもので問題ないです。

    この例で列挙するクラス名は「SampleTag」にしたいと思います。
    必要なメソッドも含め以下に記述しています。

     

    かなり長いですが、ここまでのJavaの記述によって、
    タグライブラリの実装処理が行なわれます。

    正直なところこれを見ただけでもピンとこないと思いますので、
    ソースコード内のコメント「タグライブラリの実装メソッドの定義.」以下のメソッドを見て下さい。

    フローチャートで表すとこのような処理になっています。

    イントラマート タグライブラリ

    JSPで実装したカスタムタグを識別して、上記の処理フローが流れていきます。

    「カスタムタグの開始」までに、JSP上のタグ情報、
    カスタムタグに指定した属性などの情報をセッターメソッドを通してフィールド変数に格納します。

    今回の例ではインターフェースにTagとBodyTagを使用していますが、
    BodyContent(タグを囲った中間部分の文字列データ)を使わないのであればTagだけの実装で問題ないです。

    ちなみに中間部分とは以下の通りです。

     

    まず初めにdoStartTagメソッドで実装した処理が動作します。

    JspWriterクラスでPageContext(タグを実装したJSPのページ情報)を取得して、
    printもしくはwrite関数で開始タグが記述された位置に文字列データを出力できます。

    戻り値はint型ですが、その値によってフローの動きが変化します。

    指定する戻り値はフローを参考にしてもらえば良いと思います。

     

    スポンサードリンク

     

    インターフェースにBodyTagを実装していないと
    EVAL_BODY_BUFFERED」「EVAL_BODY_AGAIN」を使用できませんのでご注意を。

    まあ、各メソッドただ順番通りにメソッドが呼び出されているだけなので、
    カスタムタグを通してJSPに出力したい情報を位置関係を考えてコードを書いてあげるだけですね。

    慣れれば非常にシンプルで単純な処理です。

    ここまでが処理の説明でしたが、
    カスタムタグではJSPに記述したタグに属性値を指定できます。

    詳しい内容は次のtldファイルのところでお話ししますが、
    好きな属性名とその値を指定することで、その属性名及び値をJava側で利用できます。

     

    Taglibを作成するにはTLDファイルの生成・記述が必須

    作成したTaglibをウェブサーバ側に認識させるにはtldファイルというものが必要になります。

    このtdlファイルはTag Library Descriptorの略のことで、
    タグライブラリを作成する場合に使います。

    JSPで実装したタグリブのカスタムタグとJavaの処理を結合するための中間ファイルのようなものです。

    このファイルがある意味一番重要です。

     

    まずは以下のtldファイルの記述を確認して下さい。

     

    手始めに用意したSampleTagクラスの実装に合わせて、tldファイルに必要な情報を記載しています。

    最初のタグの記述は共通のものになるので、tldファイルを生成時は合わせて書きます。

    重要な部分は「プラグインの定義.」コメント行以下になります。

    <tag>タグに囲まれた部分がカスタムタグの設定部分の記述になります。
    詳しい説明はソースコード上に載せています。

    <tag>タグ内の<attaribute>はカスタムタグの属性値の設定部分です。
    使用したい属性を任意で追加できますので、使いたい分だけattributeタグを記述します。

    さらに<tag></tag>部分の記述を付け加えることで、別のタグリブの処理も一括で記述できます。
    その場合はJavaクラスも並行して用意する必要はありますね。

    記述したtldファイルはウェブサーバ上のとあるディレクトリに配置します。

     

    上記はイントラマートで使用しているresinサーバのフォルダパスを指定しています。
    「imart」はアプリケーション名でイントラマートで利用しているルートディレクトリです。

    基本的には「WEB-INF」直下の「tld」に配置すれば良いでしょう。
    tldファイルの名前は任意で構いません。(今回はyokki-tags.tldにします。)

    ここまで用意することでやっとJSP上でカスタムタグを使用できるようになります。

     

    タグライブラリで外部JSPを読み込みリクエストを送信する方法

    おまけですが、今回実装したJavaクラスのソース内に、
    sample.jspという外部JSPを読み込む処理を記載しています。

    doAfterBodyメソッドの冒頭に記述したソース文です。

     

    分かりづらいので5~12行目の処理を見ます。

    pageContextというカスタムタグ呼び出し元のページ情報に、
    getServletContext().getRequestDispatcher(OTHER_JSP)という記述で、
    外部JSPファイルの情報をリクエストパラメータとして渡しています。

    さらにincludeメソッドでpageContext内に存在するリクエスト情報を、
    外部JSPにセットします。

    ちなみに1~3行に実装したサーバリクエストのパラメータも含まれます。
    この1~3行目の処理はpageContext内にvalueというIDでカスタムタグのvalue属性値をそのままセットしています。

     

     

    最後の方で外部JSPの情報を含めた文字列データをボディコンテントに出力しています。

    ボディコンテントはカスタムタグの開始タグと終了タグの間に出力されます。

    仕組みとしては以上です。

     

    あとは今回使用する外部JSPファイルをサーバリソースに定義します。

    sample.jsp

     

    タグライブラリをJSP上で実装し呼出す

    試しに、今回作成したタグライブラリのカスタムタグを出力させたいJSPに記述してみます。

     

    記述してウェブブラウザで確認すると以下のような状態になると思います。

    イントラマート タグライブラリ

    サンプル用に作ったものなので味気ないデザインですが、
    画面上に表示されているものを確認しながらご紹介しましたソースを見ると、
    処理から表示するまでの流れがわかると思います。

    以上で自作タグライブラリをイントラマートで使用することができます。

      The following two tabs change content below.
      よっき プロフィール画像
      パソコンが大好きな青年。職業はプログラマ/SE。 フリーランスとしてウェブサイトの構築・保守の業務に従事。専門学校とパソコンスクールで講師も担当。幼少期からパソコンが大好きで、趣味がそのまま仕事に転じた。自作PCの魅力に惹かれたのは学生時代の頃。自作PC専門ブログで、お得な情報を紹介しています。

      スポンサードリンク


      コメントを残す




      CAPTCHA


      このページの先頭へ