- - PR -
JSF selectOneRadio の同じneme属性のItemをテーブルの縦に割り振りたい。
投稿者 | 投稿内容 | ||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|
|
投稿日時: 2006-03-10 15:50
こんにちは、今回もJSFではまってしまったので、お知恵を貸してください。
<h:selectOneRadio value="#{profile.favorites}"> <f:selectItem itemLabel="Movie" itemValue="Movie"/> <f:selectItem itemLabel="Walk" itemValue="Walk"/> <f:selectItem itemLabel="Karate" itemValue="Karate"/> </h:selectOneRadio> このようなサンプルの表示は問題ないのですが、 dataTableを使用してループしている縦列に同じnemeのItemを置きたいのですが うまくいきません、 <h:dataTable・・・・ ・・・ <h:column> <f:facet name="header"> <h:outputText valu="チェック"> </f:facet> <h:selectOneRadio valu="#{myBean.selected}"> <f:selectItem itemValue="#{item.id}"/> </h:selectOneRadio> </h:column> としてしまうとどうしても、name属性が縦に振られるとき同じものが当たらないので、 違うラジオボタンのグループという扱いになってしまいます。 <f:selectItem itemValue="#{item.id}"/> にidを付与してもオートで付く_id○○のような番号が変わるので、意味が無いようです。 このような場合はどのようなJSPを書けばよいのでしょうか? | ||||||||||||
|
投稿日時: 2006-03-10 18:43
<h:selectOneRadio layout="pageDirection" value="#{...}">
<f:selectItem ... /> <f:selectItem ... /> </h:selectOneRadio> という感じで、layout="pageDirection"の指定で縦方向に、 複数の<f:selectItem>または<f:selectItems>でグループ化できると思います。 | ||||||||||||
|
投稿日時: 2006-03-11 21:29
あしゅさん ありがとうございます
>という感じで、layout="pageDirection"の指定で縦方向に、 そういう意味ではないのです やりたいのはdataTbleで回している次のデータ列で、同じグループにしたいのです 伝えにくいのですが、簡単に書くと Head1 Head2 head3 colum1 colum2 radiobutton1 このカラムが、dataTableで回っているので、 radiobuttonのグループが次のデータテーブルのカラムの時に変わらないグループにしたいのです。 ・・・・ちょっと伝わりにくいでしょうか^^; | ||||||||||||
|
投稿日時: 2006-03-12 15:21
この構造だと普通の<h:selectOneRadio>だと無理ですが、 MyFacesの拡張コンポーネント(tomahawk)を利用できるのであれば <t:selectOneRadio>と<t:radio>の組み合わせで実現できると思います。
実際に試していないので動くかどうかわかりませんが、 <t:selectOneRadio layout="spread">なラジオボタンは出力が抑制され、 その変わりに<t:radio>が代理でレンダリングする動作になるはずです。 #tomahawkってよく怪しい挙動するので気をつけて使って下さい。 #変な挙動をしていたらソースを追うくらいの覚悟は必須かと。。 | ||||||||||||
|
投稿日時: 2006-03-12 15:43
またまた あしゅさん ありがとうございます。
標準のJSFだけでは不可能なのですね。 >MyFacesの拡張コンポーネント(tomahawk)を利用できるのであれば ><t:selectOneRadio>と<t:radio>の組み合わせで実現できると思います。 利用も検討してみますが、怪しい動きをするのですか・・ 実は別な方法でやろうと試しているのですが、こちらでもうまく行っていません。 Radioボタンではなく、データカラム毎に、commandButtonを置いて、 <h:dataTable var="item" value="#{myBean.listResultSet}" border="0" width="640" headerClass="head" columnClasses="col,col,col,col2"> ・ ・ <h:commandButton type="submit" action="#{myBean.viewdetail}" value="詳細表示"> <f:param name="id" value="#{item.id}"/> </h:commandButton> というようにして、 myBeanで Public String viewdetail(){ HttpServletRequest request = (HttpServletRequest) FacesContext.getCurrentInstance().getExternalContext().getRequest(); String id = request.getParameter("id"); ・ ・ という風に、ラジオボタンの代わりに、パラメータでidの値を渡そうとしてのですが、 結果nullが返ってきます。 jspでitem.idの値を表示してみましたが、その時点では期待したidが入っています。 myBeanのスコープは、sessionにしています。 パラメータがセッションに届くのかと思い(そんな事は無いと思うのですが) requestからsessionを取り出して、getAttributeしてみたのですが、やはり nullが返ってきています・・・ 八方塞になってしまいました・・どうかよろしくお願いします。 | ||||||||||||
|
投稿日時: 2006-03-12 16:16
追加でなのですが
生成されたJSPを見るとどうもparamが無いような気もします <td class="col"><input id="_id0:_id1:6:viewdetail" type="submit" name="_id0:_id1:6:viewdetail" value="詳細表示" />3</td> そこで、dataTableの前にあった<h:form>をデータテーブルのcommandButtonの前に 置いてみると、hiddenが追加されるようです (paramといってもhiddenにレンダリングされるという事でしょうか) しかし、それでもidの値は渡ってきていないようですし、 formをテーブルの内部に仕込むと、commandButtonの項目に改行が入り、美しくないです・・・ そもそも根本的に使い方が違うのでしょうか? 同じような質問先月の終わり頃にあったので、それもかなり参考にさせてもらったのですが、まったくうまく行きません。 どなたかお分かりになるようでしたら、よろしくお願いいたします。 | ||||||||||||
|
投稿日時: 2006-03-12 21:19
違います。 <h:commandButton type="submit" action="#{myBean.viewdetail}" value="詳細表示"> <f:param name="id" value="#{item.id}"/> </h:commandButton> actionではなく、actionListenerで指定して、
という取り方になります。 ちなみに、ここでやりとりするパラメータはString以外も行けます。 というよりは、<f:param value="#{...}" />で指定したオブジェクト そのものが渡ってくることになります(java.io.Serializable必須)。
商用は知りませんが、現在のJSFの実装はどれも怪しげな挙動が多いので、 JSFを使う限りはそれなりの覚悟はしておかないといけないと思いますよ。 Tomahawkも動いてくれさえすれば大方は大丈夫なんですが、 ドキュメントがないに等しかったりで使いこなすのは大変です。 | ||||||||||||
|
投稿日時: 2006-03-13 15:33
よく分からないのですが,私が↓で投稿したサンプルの「select」ボタンの方法では駄目なんですか? http://www.atmarkit.co.jp/bbs/phpBB/viewtopic.php?topic=28759&forum=12&7 |