2005年3月31日 1:35
仕事でJSF1.1.01でのサンプル実装が必要になったためその時のメモ。JSF1.1の書籍を購入しようと思ったが、数年後にJSF2.0が出るのでバージョンに依存した書籍は購入したくないためWebから情報収集を行った。
JSFは、Java Server Facesの略でJSP2.1から標準仕様になる。詳しくはJCPを参照。作った人は、Craig McClanahan氏でTomcat,Strutsを作った人。触ってみた感じは、strutsをもっと簡単にした感じ。
2005/03/22現在、日本語の情報もある程度出てきているが以下をベースに学習してよかったと思う。
Java &
Webサービス - JavaServer Faces 1.0チュートリアル 日本語版
これは、J2EE 1.4 Tutorialのchapter16付近のJSFに関する部分を翻訳したもの。JSF1.0の時のためJSF1.1とタグの書き方が違うがJSFのアーキテクチャを理解するのに便利だと思う。私はこれでアーキテクチャを覚えた。アーキテクチャを実装しながらではなく読むことで覚えるという学習法も案外実装する時に役立つと感じた。
JavaServer[tm]
Faces Technology-Download(英語)
java.sun.com内にある。仕様書、JSF実装、サンプルが手に入る。Tomcat5.5.xなどで開発する際に、上記チュートリアルとサンプルを使えばほぼJSFの概要がつかめる。また、JavaServer
Faces v1.1.01 Release ImplementationのJavadocはJSFタグやManagedBeanを書く時に非常に役立つ。
Book
Shelf Core JavaServer Faces
まだ見ていないが、Core JavaServer Facesの5章分が無料で読めるようだ。英語だがサンプルを読みながらやれば使えると思う。
Struts1.2は分からないが、Struts1.1を評価した時と比べると、JSF1.1はStrutsを踏襲してつくられているため非常に設定ファイルが簡単になっていた。またGUIツールを前提に設計しているのであろうことが伺えた。Strutsが持っている国際化機能や外部ファイルでの遷移、Validation機能などは同様に持っていると思ってよい。
Sessionなど暗黙オブジェクトを取得するためのヒントが書かれていた。
6.1 FacesContext
JSFは、リクエストとレスポンス時のコンテキスト情報をjavax.faces.context.FacesContext抽象クラスで定義している。
FacesContextインスタンスは、JSFのライフサイクルにおいてリクエスト時にインスタンス化される。このクラスが保持する情報の
アクセスには、FacesContextFactory#getFacesContextメソッドを使用する。
ライフサイクルの完了時にJSFの実装は、releaseメソッドを呼び出し保持している情報を開放する。
これはガベージコレクションのような開放ではなく、保持しているデータを開放するプーリングのイメージ。
6.1.8 Access To The Current FacesContext Instance
6.1.8 現在のFacesContextインスタンスへのアクセス方法
public static FacesContext getCurrentInstance();
public static void setCurrentInstance(FacesContext context);
System.out.println("prepareUpdate");
FacesContext context = FacesContext.getCurrentInstance();
Application app = context.getApplication();
ExternalContext exContext = context.getExternalContext();
Iterator it = exContext.getRequestParameterNames();
while (it.hasNext()) {
String requestParameterName = (String) it.next();
System.out.println(requestParameterName);
}
ふと思ったのだが、小さなサンプルを書くより、Webアプリケーションと呼べるぐらいのサンプルを書いた方が後々使いまわせそう。次のフレームワークが現れた時もそれを新しいフレームワークや言語に翻訳するだけですむはずなので。
ちょっとJSR(Java Specification Requests)を眺めて見る。http://www.jcp.org/en/jsr/allからみれる。
JSR-152: JavaServer Pages[tm] 2.0 Specification
APIのドキュメント(javadoc)を見てみるとやはりjavax.servlet.jsp.elパッケージが新しく加わっている。
仕様書のはじめにJSP1.2からの変更点がかかれているので再確認。
All JSP containers must be able to run in a J2SE 1.4 environment.
JSP2.0のコンテナ(TomcatなどJSP実行環境を提供する側は、J2SE 1.4を実行できなければならないそうだ。
The JSP 2.0 specification uses the Servlet 2.4 specification for its web semantics.
またServlet2.4仕様のセマンティックスを利用する。
A simple Expression Language(EL) has been add.
Expression Language(EL)が加わった。
The EL simplifies writing script-less JSP pages that do not use Java scriptlets or Java expressions and thus have a more controlled interaction with the rest of the Web Application.
ELが加わったのは、JSPを簡素化するためなので使うなと記述されている。mustではないので強制的ではないが画面の実装方法がServlet->JSP->JSP2.0 .. Struts Tag, JSF tagとスクリプトレスになる傾向があるので当然なのだろう。
JSPのカスタムアクションを実装するため.tag, .tagxファイルが加わった。
XMLを利用するために.jspx .tagxという標準拡張子が加わった。
JSR-245: JavaServer[tm] Pages2.1
JavaServer[tm]Faces(JSF)がJSPの仕様に組み込まれる。このドキュメントは2005/03/31現在Early Draft(草書?)
ELspecとJSPspecという2冊のPDFになる。ELの全体像を把握するには結構よさそうだ。
JSP2.0からの変更点を仕様書で確認してみると、
The JSP specification now features a unified expression language, which is hte result of the integration of the expression languages defined in the JSP2.0 and Faces 1.1 specifications.
unified expression languageと記述されている。これは、JSP2.0とFaces1.1の仕様を統合させる事のようだ。
またpendding事項としてコンテナの動作要求が書かれている。JSP2.1はJSPコンテナとしては、J2SE1.4以降、J2SE5.0用のコンテナはJ2EE5.0仕様を満たすこと、すべてのJSPコンテナはJ2SE5.0実行環境を満たさなければならない(must be able to run...)と定義してある。
もうひとつのpendding事項としてJSP2.1仕様はServlet2.5仕様のセマンティックスを採用する。
Servlet2.5の仕様書を探したがどうやらJSR-244:Java[tm]2 Platform, Enterprise Edition 5.0(J2EE5.0) Specificationに記述されるようだがまだ公開されていない。Expert Group内で審議している最中。Servlet2.4のようにServlet仕様書が今後できるのかもしれないが調べていないので分からない状態。
JSR-252 JavaServer Fases1.2仕様書を発見。