最近読んだ記事、"Group radio buttons inside a JSF dataTable component"
JavaWorldにJSFに自作コンポーネントを追加する方法を紹介する記事(http://www.javaworld.com/javaworld/jw-02-2007/jw-02-jsf.html)が紹介されていました。自作コンポーネントを作るモチベーションとして、テーブルの中にradioボタンを配置したい、JSF的にいうと、h:dataTableタグに囲まれた中にh:selectOneRadioとf:selectItemsか複数のf:selectItemの組を記述したいけれど意図したようにできないことがあげられています。具体的には、縦に並ぶradioボタンの組を作りたい、あるいは横に並んでいるけれど複数のColumnにまたがるradioボタンの組を作りたい場合が相当します。JSFのh:selectOneRadioタグにh:columnタグをネストできないという問題を自作コンポーネント/タグでなんとかしてみようという内容でした。
記事の大半はコンポーネントの作り方の解説で、からくり的な部分は
private String getName(UICustomSelectOneRadio aUICustomSelectOneRadio, FacesContext context) { UIComponent parentUIComponent = getParentDataTableFromHierarchy(aUICustomSelectOneRadio); if ( parentUIComponent == null ) { return aUICustomSelectOneRadio.getClientId(context); } else { if ( aUICustomSelectOneRadio.getOverrideName() != null && aUICustomSelectOneRadio.getOverrideName().equals("true")) { return aUICustomSelectOneRadio.getName(); } else { String id = aUICustomSelectOneRadio.getClientId(context); int lastIndexOfColon = id.lastIndexOf(":"); String partName = ""; if ( lastIndexOfColon != -1 ) { partName = id.substring(0, lastIndexOfColon + 1); if ( aUICustomSelectOneRadio.getName() == null ) { partName = partName + "generatedRad"; } else partName = partName + aUICustomSelectOneRadio.getName(); } return partName; } } }
というメソッドを定義して、コンポーネントのnameを上書きしてつじつまをあわせているところでした。おぉ!と思うようなものではありませんが、writerが言っているようにJavaScriptを使わないalternativeな方法で、そういう意味ではうまい方法かもしれません。
とはいっても元をただせばJSFのタグ定義そのものに問題があるからみんな苦労してるんだと思うのですが、タグ定義を原点から見直すような動きはないのでしょうか?(最近の(今後の?)JSFがどうなっているのかを調べていないので、単なる疑問なのですが)