Java Server Faces(JSF)で携帯ページ
JSFを使って携帯ページを作成すると、Latin文字以外は全て「数値文字参照」(&#xxx;)に変換されるという問題に気付きます。何故このような仕様となったのか、恐らく何らかの理由があるかとは思いますが、携帯ブラウザでは数値文字参照を正しく解釈できないものがあります。
少なくとも携帯サイトの実装ではこの動作を回避する必要があります。
方法
専用のRenderKitを作成する方法が正解かと思われますが、今回はServlet Filterで回避します。このFilterでは数値文字参照となっている文字をバイナリ文字に戻し、レスポンスに書き込みを行います。
インストール
utilzncr.jar を ${webapp}/WEB-INF/lib にコピーし、${webapp}/WEB-INF/web.xml にフィルタの設定を行います。このフィルタは JSF 関連のフィルタより先に呼び出される必要がありますので、記述の順序に注意してください。以下は例です。
<filter>
<filter-name>NcrFilter</filter-name>
<filter-class>jp.utilz.util.servlet.NcrFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>NcrFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
対応Content-Type
HtmlRenderKitが対応しているtext/html, application/xhmtl+xml, application/xml, text/xml のみ処理されます。その他のContent-Type(例えばtext/plain)では RenderKitがOutputStream経由で書き込みを行うため、現状では処理対象になりませんので注意してください。
動作確認
MyFaces 1.1.x 及び、 JSF RI 1.2 + Facelets 1.1で動作確認しました。
ダウンロード
- utilzncr.zip

注意点
- 上記にも記載しましたが、数値文字参照になる仕様には何らかの理由があると思われます。そのため、何かの機能が利用できなかったり、動作に不具合が発生する可能性があります。
- わざわざ数値文字参照にエンコードしているものを戻すと言う、とても無駄な処理です。
免責
このソフトウェアの利用または利用不可によって生じた全ての損害に対して当方は一切の責任を負わないものとさせていただきます。
不具合などありましたらご指摘いただけると助かります。