JSFによるWebアプリケーション開発 第11回

Slides:



Advertisements
Similar presentations
1 JSP の作成 JSF による Web アプリケーション 開発 第 4 回. 2 ここでの内容 JSF での JSP の作り方と動かし方につい て学ぶ。
Advertisements

プログラミング実習 1 ・ 2 ク ラス 第 2 週目 担当教員 : 渡邊 直樹. 課題 2 ● 2 × 2型行列の固有値, 固有ベクトルを求め る EigMatrix.java というプログラムを作成せ よ。 ● 行列の各要素はコマンド・プロンプトから入力 ● 計算した結果もコマンド・プロンプトに表示.
社会人学習講座 「Javaプログラミング概論」
バリデータ J2EE II 第11回 / 2006年1月19日.
IO - 入出力 小西 亨.
JSFによるWebアプリケーション開発 第9回
Applet 岡部 祐典 鈴木 敬幸.
エンタープライズアプリケーション II 第10回 / 2006年7月23日
Servlet J2EE I 第8回 /
Iアプリプログラミング その1  鳥居秀徳.
ネットワークプログラミング論 平成27年10月12日 森田 彦.
プログラミング基礎I(再) 山元進.
第5回 2007年5月25日 応用Java (Java/XML).
JavaServlet&JSP入門 01K0018 中村太一.
第2回:Javaの変数と型の宣言 プログラミングII 2007年10月2日.
独習Java ・ 10.6  Hashtableクラス ・ 10.7  String Tokenizerクラス  12月12日    小笠原 一恵.
稚内北星学園大学 情報メディア学部 助教授 安藤 友晴
タグライブラリ ソフトウェア特論 第6回.
タグライブラリとJSP J2EE I 第10回 /
プログラミング実習 1・2 クラス 第 1 週目 担当教員:  渡邊 直樹.
タグライブラリとJSP J2EE II 第2回 2004年10月7日 (木).
JavaBeans とJSP データベース論 第5回.
JSFによるWebアプリケーション開発 第6回
エンタープライズアプリケーション II 第7回 / 2006年7月9日
第20章 Flyweight ~同じものを共有して無駄をなくす~
JSPの作成 J2EE II 第3回 2005年4月10日.
アプレット プログラミング 第10回 アプレット プログラミング第10回.
ネットワークプログラミング論 平成28年10月17日 森田 彦.
RMI ソフトウェア特論 第6回 /
Javaによる Webアプリケーション入門 第5回
プログラミング演習3 第2回 GUIの復習.
ネットワークプログラミング論 平成28年11月21日 森田 彦.
第12回 2007年7月13日 応用Java (Java/XML).
独習JAVA 6.8 コンストラクタの修飾子 6.9 メソッドの修飾子 6.10 ObjectクラスとClassクラス 11月28日(金)
第11回 2007年7月6日 応用Java (Java/XML).
第3回 2007年4月27日 応用Java (Java/XML).
Webアプリケーションの方向性 データベース論 第13回.
第6回 2007年6月1日 応用Java (Java/XML).
ネットワークプログラミング論 平成28年11月7日 森田 彦.
Javaによる Webアプリケーション入門 第6回
暗号技術 ~JAVAプログラム①~ (5週目)
ネットワークプログラミング論 平成28年10月31日 森田 彦.
プログラミング演習3 第2回 GUIの復習.
Jakarta Struts (2) ソフトウェア特論 第11回.
Javaによる Webアプリケーション入門 第2回
7.4 intanceof 演算子 7.5~7.9パッケージ 2003/11/28 紺野憲一
エンタープライズアプリケーション II 第9回 / 2006年7月23日
第1章 実世界のモデル化と形式化 3.地物インスタンスの表現
Javaによる Webアプリケーション入門 第11回
ソフトウェア制作論 平成30年11月21日.
パッケージ,アクセス修飾子 2008年4月27日 海谷 治彦.
Servlet ソフトウェア特論 第7回.
Servlet J2EE I (データベース論) 第12回 /
Servlet データベース論 第6回.
JSFによるWebアプリケーション開発 第3回
Webアプリケーションと JSPの基本 ソフトウェア特論 第4回.
C#プログラミング実習 第3回.
Javaによる Webアプリケーション入門 第8回
Javaによる Webアプリケーション入門 第4回
WebアプリケーションとTomcat ― これまでの復習とこれからの予習 ―
JSPの基本 データベース論 第2回.
Action Method の実装 J2EE II 第9回 2004年12月2日.
Jakarta Struts (1) ソフトウェア特論 第10回.
稚内北星学園大学 情報メディア学部 専任講師 安藤 友晴
JSPの基本 J2EE I (データベース論) 第8回 /
JSFによるWebアプリケーション開発 第5回
Javaとは Javaとはオブジェクト指向言語でJava VM(Java仮想マシン)と呼ばれるプログラム上で動作します。
JSFによるWebアプリケーション開発 第10回
JSFによるWebアプリケーション開発 第7回
MVCモデル2による Webアプリケーション
Presentation transcript:

JSFによるWebアプリケーション開発 第11回 カスタム・コンポーネント JSFによるWebアプリケーション開発 第11回

ここでの内容 カスタム・コンポーネントの作成方法について学ぶ。

カスタム・コンポーネントの 作成技法

カスタム・コンポーネントとは? JSF では、UIコンポーネントを自分で作ることができる。 こうした、自作したコンポーネントのことを「カスタム・コンポーネント」と言う。

カスタム・コンポーネントの例 (1) <%@ taglib uri="/WEB-INF/blink.tld" prefix="my" %> ......... <f:view> <my:blink>Hello !</my:blink> </f:view>

カスタム・コンポーネントの例 (2) 内容で指定した文字列が点滅する。 HTML の blink タグが使われる

カスタム・コンポーネントの 作成に必要なファイル Javaのプログラム UIコンポーネントクラス タグハンドラクラス レンダラ 設定ファイル タグライブラリディスクリプタ (TLD) faces-config.xml

注意点 Javaプログラムは、必ずパッケージ宣言をすること。パッケージを付けないとうまく動かない。

UIコンポーネントクラス (1) UIコンポーネントの表すクラス すべてのUIコンポーネントは、UIComponentBase クラスを継承する。

UIコンポーネントクラス (2) package blink; import javax.faces.component.UIComponentBase; public class UIBlink extends UIComponentBase { public String getFamily() { return "MyFamily"; }

UIコンポーネントクラス (3) public String getFamily() { return "MyFamily"; } 「コンポーネント・ファミリ」を設定 UIコンポーネントとレンダラを関連づけるために使われる。

タグハンドラクラス (1) JSPからUIコンポーネントを利用するためのクラス 次のいずれかのクラスを継承する UIComponentTag (タグのボディ(=内容)を操作しない場合) UIComponentBodyTag (タグのボディを操作する場合) UIComponentTag で十分な場合が多い

タグハンドラクラス (2) package blink; import javax.faces.webapp.UIComponentTag; public class BlinkTag extends UIComponentTag { public String getComponentType() { return "Blink"; } public String getRendererType() { return "BlinkRenderer";

タグハンドラクラス (3) public String getComponentType() { return "Blink"; } コンポーネントの名前を返す。 faces-config.xml で指定する。

タグハンドラクラス (4) public String getRendererType() { return "BlinkRenderer"; } レンダラの名前を返す。 faces-config.xml で指定する。

レンダラの2つの機能 エンコード デコード HTMLのフォームから入力されたデータを、UIコンポーネントに設定する。 UIコンポーネントから、HTMLを出力する。

レンダラクラス (1) Renderer クラスを継承する。 エンコードには、encodeBegin メソッドと encodeEnd メソッドを使う。

レンダラクラス (2) public class BlinkRenderer extends Renderer { public void encodeBegin(……) { ……… } public void encodeEnd(……) {

レンダラクラス (3) // HTML の開始タグを出力する public void encodeBegin(FacesContext context, UIComponent component) throws IOException { ......... ResponseWriter writer = context.getResponseWriter(); writer.write("<blink>"); }

レンダラクラス (4) // HTML の終了タグを出力する public void encodeEnd(FacesContext context, UIComponent component) throws IOException { ......... ResponseWriter writer = context.getResponseWriter(); writer.write("</blink>"); }

TLDの設定 (1) タグライブラリディスクリプタ = TLD JSPでどんなタグを利用できるか定義するための設定ファイル

TLDの設定 (2) <taglib> <tlib-version>1.0</tlib-version> <jsp-version>1.2</jsp-version> <short-name>Blink !</short-name> <tag> <name>blink</name> <tag-class>blink.BlinkTag</tag-class> <body-content>scriptless</body-content> </tag> </taglib>

TLDの設定 (3) <tag> <name>blink</name> <tag-class>blink.BlinkTag</tag-class> <body-content>scriptless</body-content> </tag> name 要素はタグの名前 tag-class 要素はタグハンドラクラスの名前 body-content 要素の “scriptless” は、要素の内容にテキストや Value Binding 式などが入ることを示す。

faces-config.xml の設定 (1) UIコンポーネントとレンダラを設定する。

faces-config.xml の設定 (2) <component> <component-type>Blink</component-type> <component-class>blink.UIBlink</component-class> </component> component-type 要素は、タグハンドラクラスのcomponentTypeプロパティ component-class 要素は、UIコンポーネントクラスのクラス名

faces-config.xml の設定 (3) <render-kit> <renderer> <component-family>MyFamily</component-family> <renderer-type>BlinkRenderer</renderer-type> <renderer-class> blink.BlinkRenderer</renderer-class> </renderer> </render-kit>

faces-config.xml の設定 (4) <component-family>MyFamily</component-family> <renderer-type>BlinkRenderer</renderer-type> <renderer-class>blink.BlinkRenderer</renderer-class> component-family 要素は、UIコンポーネントクラスのfamily プロパティ renderer-type 要素は、タグハンドラクラスの rendererType プロパティ renderer-class 要素は、レンダラクラス名

JSPの記述 <%@ taglib uri="/WEB-INF/blink.tld" prefix="my" %> ……… <f:view> <my:blink>Hello !</my:blink> </f:view>

ディレクティブの記述 <%@ taglib uri="/WEB-INF/blink.tld" prefix="my" %> TLD を WEB-INF フォルダに置いておく。

空要素タグ

サンプルプログラム (1) <%@ taglib uri="/WEB-INF/now.tld" prefix="my" %> <my:now />

サンプルプログラム (2) 現在の日時を表示する

UIコンポーネントクラス package now; import javax.faces.component.UIComponentBase; public class UINow extends UIComponentBase { public String getFamily() { return "MyFamily"; }

タグハンドラクラス package now; import javax.faces.webapp.UIComponentTag; public class NowTag extends UIComponentTag { public String getComponentType() { return “Now"; } public String getRendererType() { return “NowRenderer";

レンダラクラス (1) public class NowRenderer extends Renderer { public void encodeBegin(……) { ……… } タグがないので、encodeBegin メソッドだけでよい

レンダラクラス (2) // 現在の日時を表示 public void encodeBegin(FacesContext context, UIComponent component) throws IOException { ......... Date d = new Date(); DateFormat df = DateFormat.getDateTimeInstance(); ResponseWriter writer = context.getResponseWriter(); writer.write(df.format(d)); }

TLDの設定 <tag> <name>now</name> <tag-class>now.NowTag</tag-class> <body-content>empty</body-content> </tag> body-content 要素の “empty” は、このUIコンポーネントが空要素タグで表現されることを示す。

faces-config.xml の設定 (1) <component> <component-type>Now</component-type> <component-class>now.UINow</component-class> </component> component-type 要素は、タグハンドラクラスのcomponentTypeプロパティ component-class 要素は、UIコンポーネントクラスのクラス名

faces-config.xml の設定 (2) <render-kit> <renderer> <component-family>MyFamily</component-family> <renderer-type>NowRenderer</renderer-type> <renderer-class> now.NowRenderer</renderer-class> </renderer> </render-kit>

JSPの記述 <%@ taglib uri="/WEB-INF/now.tld" prefix="my" %> <my:now />

属性の記述

サンプルプログラム (1) <%@ taglib uri="/WEB-INF/now.tld" prefix="my" %> ...... <my:now format="FULL" /><br /> <my:now format="LONG" /><br /> <my:now format="MEDIUM" /><br /> <my:now format="SHORT" /><br />

サンプルプログラム (2) 属性で指定したスタイルに従って、現在の日時を表示する。

UIコンポーネントクラス package now; import javax.faces.component.UIComponentBase; public class UINow extends UIComponentBase { public String getFamily() { return "MyFamily"; }

タグハンドラクラス (1) package now; import javax.faces.webapp.UIComponentTag; public class NowTag extends UIComponentTag { public String getComponentType() { return “Now"; } public String getRendererType() { return “NowRenderer";

タグハンドラクラス (2) protected void setProperties( UIComponent component) { super.setProperties(component); UINow now = (UINow)component; now.getAttributes().put("format", format); } コンポーネントに属性を設定する。

タグハンドラクラス (3) public String getFormat() { return format; } public void setFormat(String format) { this.format = format; 属性値をプロパティとして扱う

レンダラクラス (1) 属性値を取り出し、その値によって必要な処理を行う。

レンダラクラス (2) UINow now = (UINow)component; String format = (String)now.getAttributes().get("format"); if (format.equals("FULL")) { df = DateFormat.getDateTimeInstance( DateFormat.FULL, DateFormat.FULL); } else if (format.equals("LONG")) { DateFormat.LONG, DateFormat.LONG);

TLDの設定 (1) <tag> <name>now</name> <tag-class>now.NowTag</tag-class> <body-content>empty</body-content> <attribute> <name>format</name> <required>true</required> </attribute> </tag>

TLDの設定 (2) <attribute> <name>format</name> <required>true</required> </attribute> name 要素で属性名を指定する required 要素でこの属性が必須かどうかを示す。

faces-config.xml の設定 (1) <component> <component-type>Now</component-type> <component-class>now.UINow</component-class> </component> component-type 要素は、タグハンドラクラスのcomponentTypeプロパティ component-class 要素は、UIコンポーネントクラスのクラス名

faces-config.xml の設定 (2) <render-kit> <renderer> <component-family>MyFamily</component-family> <renderer-type>NowRenderer</renderer-type> <renderer-class> now.NowRenderer</renderer-class> </renderer> </render-kit>

JSPの記述 <%@ taglib uri="/WEB-INF/now.tld" prefix="my" %> ...... <my:now format="FULL" /><br /> <my:now format="LONG" /><br /> <my:now format="MEDIUM" /><br /> <my:now format="SHORT" /><br />