Archive for 3月, 2010
週末の散歩ー上野不忍池
先週の土曜日に散歩がてら、上野の不忍池に行ってきました。東京に来て 18 年程経ちますが、上野の不忍池に行ったのは今回が初めてでした。とても多くの方々が花見に来られていて驚いたのですが、そういった集まっている人達や桜を見ながら 2 時間程散歩をしてきました。それにしてもまだまだ本当に寒いですよね、昨日もそうでしたが、昼間でも真冬のジャケットを着て問題ない位です。花見シーズンに入ってきましたがまだまだ寒いのでくれぐれも風邪を引かないよう、体調には気をつけてください。
GlassFish の今後のロードマップ
GlassFish の今後のロードマップが発表されています。発表資料
この資料中では、直近でリリース予定の GlassFish v2.1.1, v3.0.1の他、GlassFish v3.1 、v3.2 、v4 についても触れらてています。
この資料の中で特に興味深いのは、GlassFish v4 という名前が初登場した事で、次期 Java EE である Java EE 7 に対応する製品になるようです。資料中に記載されているスケジュールはあくまでも予定ですので(今までの経験から)今後変更される事が予想できますが、今後も GlassFish が継続してオープンソースのアプリケーションサーバとして提供されていく事をご確認いただけるかと思います。
ぜひ、この資料をご確認ください。
Servlet 3.0 web-fragment.xml による設定
Web アプリケーションの開発者は Apache Wicket や Spring 等 Servlet とは異なる別の外部フレームワークを開発時に利用する事があるかと思います。これらの外部フレームワークを使用するためには、これらのフレームワーク特有の設定 (Servlet, Filter 等)を web.xml に設定する必要があります。しかし複数の外部フレームワークを同一アプリケーション内で使用する場合、単一の web.xml ファイル内に全ての設定が含まれファイルが肥大化します。また web.xml ファイルが肥大化すると、各フレームワーク毎の設定を管理する際に可読性も低下しているため、管理が困難となります。
そこで、Web Fragment はフレームワーク毎に独自に設定を登録、管理できるようなメカニズムを提供しています。このWeb Fragment は Servlet 3.0 に導入された新しい技術で、配備記述子をモジュール化し、コンテナがモジュール化した配備記述子を認識する事ができるようになり、上記のような問題を解決しています。
一つの、web-fragment.xml ファイルは web.xml の一部として認識され、利用する外部フレームワーク毎に複数の web-fragment.xml を作成することもできます。
それでは、web-fragment.xml をどこに作成するか確認してみましょう。まず、Web アプリケーションのプロジェクトを作成します。この際、WEB-INF/lib ディレクトリ配下に、web-fragment.xml を含む jar ファイル (下記の例ではExternalLib.jar) をコピーします。
> jar tvf FragmentSample.war 0 Sun Mar 14 14:36:00 JST 2010 META-INF/ 95 Sun Mar 14 14:35:58 JST 2010 META-INF/MANIFEST.MF 0 Sun Mar 14 14:36:00 JST 2010 WEB-INF/ 0 Sun Mar 14 14:36:00 JST 2010 WEB-INF/classes/ 0 Sun Mar 14 14:36:00 JST 2010 WEB-INF/lib/ 2076 Sun Mar 14 14:36:00 JST 2010 WEB-INF/lib/ExternalLib.jar 515 Sun Mar 14 14:36:00 JST 2010 WEB-INF/sun-web.xml 469 Sun Mar 14 14:36:00 JST 2010 index.xhtml |
ExternalLib.jar には、META-INF ディレクトリ配下に web-fragment.xml を作成します。
> jar tvf ExternalLib.jar 0 Sun Mar 14 14:36:00 JST 2010 META-INF/ 109 Sun Mar 14 14:35:58 JST 2010 META-INF/MANIFEST.MF 995 Sun Mar 14 14:36:00 JST 2010 META-INF/web-fragment.xml |
web-fragment.xml には下記のような内容を記載します。下記の例では JSF 2.0 の設定を web-fragment.xml に記載していますが、web.xml に記載する内容とほぼ同様の内容が記載されている事が分かります。
<?xml version=”1.0″ encoding=”UTF-8″?> <web-fragment xmlns=”http://java.sun.com/xml/ns/javaee” xmlns:xsi=”http://www.w3.org/2001/XMLSchema-instance” xsi:schemaLocation=”http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-fragment_3_0.xsd” version=”3.0″> <context-param> <param-name>javax.faces.PROJECT_STAGE</param-name> <param-value>Development</param-value> </context-param> <servlet> <servlet-name>Faces Servlet</servlet-name> <servlet-class>javax.faces.webapp.FacesServlet</servlet-class> <load-on-startup>1</load-on-startup> </servlet> <servlet-mapping> <servlet-name>Faces Servlet</servlet-name> <url-pattern>/faces/*</url-pattern> </servlet-mapping> <session-config> <session-timeout> 30 </session-timeout> </session-config> <welcome-file-list> <welcome-file>faces/index.xhtml</welcome-file> </welcome-file-list> </web-fragment> |
web.xml の記載は、Servlet 3.0 からオプション化されていますので、web.xml が無くても上記は動作しますが、web.xml を記載する場合は、<metadata-complete> に true が設定されていないことを確認してください。この<metadata-complete> はアノテーションの利用を許可したり、外部リソースをコンテナが自動的に検出するかどうかを指定する設定ですが、true に設定されていると、アノテーションの利用が不可になる他、web-fragment.xml 等のリソースの自動検出ができなくなります。このタグが記述されていない場合、もしくは false に設定されている場合は、アノテーションも、リソースの自動検出も有効になりますので確認してください。
<web-app version=”3.0″ xmlns=”http://java.sun.com/xml/ns/javaee” xmlns:xsi=”http://www.w3.org/2001/XMLSchema-instance” xsi:schemaLocation=”http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd” metadata-complete=”false”> |
また、複数の外部フレームを利用する場合、フレームワーク毎にそれぞれの web-fragment.xml を作成する事もできます。また、設定を読み込む順番を指定するため2種類の方法を提供しています。
● Absolute Ordering
web.xml ファイルに、<absolute-ordering> を指定して順番を設定します。
● Relative Ordering
web-fragment.xml ファイルに <ordering> を指定して順番を設定します。
例えば、2つの外部フレームワークを2つの Web Fragment(Fragment1, Fragment2) にそれぞれ設定した場合を想定します。この時、web.xml に順番を指定する場合、下記のように記載します。web.xml の設定が最初に読み込まれた後、Fragment2→Fragment1の設定が読み込まれます。
<web-app> <name>MyApp</name> <absolute-ordering> <name>Fragment2</name> <name>Fragment1</name> </absolute-ordering> … </web-app> |
最後に、web-fragment.xml の設定は外部フレームワークやリソースをモジュール化して読み込ませる事が可能になる他、web.xml の肥大化を防ぎ、可読性も向上するため設定管理が楽になります。是非お試しください。
備考: 最初は、上記 web-fragment.xml の設定を Wicket 1.4 を使用して試しましたが動作させる事ができませんでした。調査した結果、現在の Wicket 1.4 は WicketFilter 中で web.xml ファイルを直接参照するように実装されているため、web-fragment.xml の設定ファイル中から設定を読み込む事ができないためでした。今後 WicketFilter 側で修正が施されれば、Wicket の設定も web-fragment.xml に含める事ができるようになるかもしれません。 実装部分: |
Servlet 3.0 の新機能概要
Servlet 3.0 の新機能をプレゼン形式でまとめてみました。個々の機能に関する詳細は別途記載する予定ですが、ここでかんたんに概要を説明します。
Servlet 3.0 は Servlet 2.5 からかなり多くの改良が施されています。
Java SE 5 から利用可能になった、アノテーションを利用し、今まで web.xml に記載していた Servlet や Filter 等の設定をアノテーションで記載できるようになり開発生産性が大幅に向上しました。
また、プラガビリティの向上として、外部のフレームワークやライブラリの設定を web.xml 以外のファイル (web-fragment.xml) に記載できるようになったため、web.xml の肥大化を抑制でき、またフレームワークの設定管理が容易になっています。
その他では Servlet API 自身でマルチパートを扱えるようになったため、Servlet API だけでファイルをアップロードすることができるようになっています。
さらに、Servlet 3.0 から非同期処理を実現できるようになっています。この非同期処理機能は、Comet/Reverse Ajax 等のアプリケーションを実装できる他、DB アクセス等とても処理に時間がかかるような処理を非同期で処理する事ができるようになります。例えば、HttpServlet のスレッドとは別のスレッドで非同期に実現する事で DB が高負荷時に HttpServlet の最大スレッド数に到達し Web のアクセスが不可になる状態を防ぐ事もできます。
その他では、HttpServletRequest に login/logout/authenticate のメソッドが含まれ、プログラムを利用しログイン/ログアウト処理を実装できるようになった他、@ServletSecurity を使用して web.xml に記載していた < security-constraint > の設定をプログラム中で宣言できるようになっています。
改良された、Servlet 3.0 を是非お試しください。
web.fragment.xml に関する詳細は 「Servlet 3.0 web-fragment.xml による設定」 のエントリをご参照ください。
マルチパートの詳細は 「Servlet 3.0 File Upload 機能」 のエントリをご参照ください。
Servlet 3.0 File Upload 機能
Servlet 3.0 ではマルチパートデータを扱う事ができるようになったため、とても簡単にファイルアップロード機能を実現できます。
(表示用 HTML)
<html> <head> <meta http-equiv=”Content-Type” content=”text/html; charset=UTF-8″> <title>JSP Page</title> </head> <body> <FORM action=”/FileUpload/MyFileUpload” enctype=”multipart/form-data” method=”POST”> アップロードするファイル名: <INPUT type=”file” name=”content”> <INPUT type=”submit” value=”Submit”> </FORM> </body> </html> |
アップロードしたファイル名を取得するためには、getFilename() メソッドで実装しているように、ヘッダ:Content-Disposition の内容を取得しファイル名を抽出します。Content-Disposition ヘッダは下記のような値を含みますので、filename の部分を取得します。
Content-Disposition: form-data; name=”content”; filename=”FILE_NAME” |
また、@MultipartConfig のアノテーションを使用して、アップロードするファイルの上限や、配置場所等を設定します。
import java.io.IOException; import java.io.PrintWriter; import javax.servlet.ServletException; import javax.servlet.annotation.MultipartConfig; import javax.servlet.annotation.WebServlet; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import javax.servlet.http.Part; @WebServlet(name=”MyFileUpload”, urlPatterns={“/MyFileUpload”}) @Override private String getFilename(Part part) { |
簡単なメモ書き程度ですが、簡単にファイルアップロード機能を実装できる事が
お分かり頂けるかと思います。
本当は、Async Servlet を使って時間のかかるアップロード処理を非同期で
実現するコードも紹介したいのですが、一部動作がおかしく調査中ですので、
後日うまくいけば、ここに追記します。