MyFacesのcommandLink

うーむ。
作成中のフレームワークの第一ユーザが携帯用のWebアプリケーションになりそうだ。
携帯を持ってないのに作れというのか。
電話の掛け方も判らんぞ。


で、携帯なのでJavaScriptをOFFにしなければならない。
現時点ではMyFacesを利用する形で実装しているので、web.xmlの「org.apache.myfaces.ALLOW_JAVASCRIPT」をfalseにすることで対応。


……と行きたいところだが、MyFacesのバグにより、formの中に入れたcommandLinkが動作しない。
仕方ないのでHtmlLinkRendererを継承して新しいレンダラを作成する。
新しいレンダラには以下のようなコードを追加。
HIDDEN云々のフィールドはHtmlFormRendererBaseにあるものと合わせている。

"org.apache.myfaces.renderkit.html.HtmlLinkRenderer"
-----
private static final String HIDDEN_SUBMIT_INPUT_SUFFIX = "_SUBMIT"; 
private static final String HIDDEN_SUBMIT_INPUT_VALUE = "1";
"org.apache.myfaces.renderkit.html.HtmlLinkRenderer#renderNonJavaScriptAnchorStart"
-----
hrefBuf.append("&"); 
hrefBuf.append(HtmlRendererUtils.getFormName(component, facesContext)); 
hrefBuf.append(HIDDEN_SUBMIT_INPUT_SUFFIX); 
hrefBuf.append("="); 
hrefBuf.append(HIDDEN_SUBMIT_INPUT_VALUE);

レンダラだけを直せばいいのでUIコンポーネント本体は放置。
既存のUIコンポーネントに新しいレンダラを対応付けるため、HtmlCommandLinkTagも継承してgetRendererTypeをオーバーライド。
後は新しいレンダラをfaces-config.xmlを登録して、tldにHtmlCommandLinkTagのサブクラスを追加してあげれば完成。

ついでなのでMyFacesにも報告(MYFACES-198)してみたり。
MyFacesはブラウザの戻りボタンの動作も怪しいので、さらに報告(MYFACES-164)してみたり。
英語が通じているのかどうかは謎である。