- PR -

JSF selectOneRadio の同じneme属性のItemをテーブルの縦に割り振りたい。

投稿者投稿内容
まさ
会議室デビュー日: 2002/04/18
投稿数: 16
投稿日時: 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を書けばよいのでしょうか?
あしゅ
ぬし
会議室デビュー日: 2005/08/05
投稿数: 613
投稿日時: 2006-03-10 18:43
<h:selectOneRadio layout="pageDirection" value="#{...}">
 <f:selectItem ... />
 <f:selectItem ... />
</h:selectOneRadio>

という感じで、layout="pageDirection"の指定で縦方向に、
複数の<f:selectItem>または<f:selectItems>でグループ化できると思います。
まさ
会議室デビュー日: 2002/04/18
投稿数: 16
投稿日時: 2006-03-11 21:29
あしゅさん ありがとうございます
>という感じで、layout="pageDirection"の指定で縦方向に、

そういう意味ではないのです
やりたいのはdataTbleで回している次のデータ列で、同じグループにしたいのです
伝えにくいのですが、簡単に書くと
Head1  Head2  head3
colum1  colum2 radiobutton1

このカラムが、dataTableで回っているので、
radiobuttonのグループが次のデータテーブルのカラムの時に変わらないグループにしたいのです。


・・・・ちょっと伝わりにくいでしょうか^^;
あしゅ
ぬし
会議室デビュー日: 2005/08/05
投稿数: 613
投稿日時: 2006-03-12 15:21
引用:

まささんの書き込み (2006-03-11 21:29) より:
やりたいのはdataTbleで回している次のデータ列で、同じグループにしたいのです
伝えにくいのですが、簡単に書くと
Head1  Head2  head3
colum1  colum2 radiobutton1

このカラムが、dataTableで回っているので、
radiobuttonのグループが次のデータテーブルのカラムの時に変わらないグループにしたいのです。


この構造だと普通の<h:selectOneRadio>だと無理ですが、
MyFacesの拡張コンポーネント(tomahawk)を利用できるのであれば
<t:selectOneRadio>と<t:radio>の組み合わせで実現できると思います。

コード:
<t:selectOneRadio id="favorites" value="#{...}" layout="spread" ...>
 <f:selectItems ... />
</t:selectOneRadio>

<h:dataTable ...>
 <h:column>
  <t:radio for="favorites" index="#{selectItems中の位置}" />
 </h:column>
</h:dataTable>


実際に試していないので動くかどうかわかりませんが、
<t:selectOneRadio layout="spread">なラジオボタンは出力が抑制され、
その変わりに<t:radio>が代理でレンダリングする動作になるはずです。

#tomahawkってよく怪しい挙動するので気をつけて使って下さい。
#変な挙動をしていたらソースを追うくらいの覚悟は必須かと。。
まさ
会議室デビュー日: 2002/04/18
投稿数: 16
投稿日時: 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が返ってきています・・・

八方塞になってしまいました・・どうかよろしくお願いします。
まさ
会議室デビュー日: 2002/04/18
投稿数: 16
投稿日時: 2006-03-12 16:16
追加でなのですが
生成されたJSPを見るとどうもparamが無いような気もします
<td class="col"><input id="_id0:_id1:6:viewdetail" type="submit" name="_id0:_id1:6:viewdetail" value="&#35443;&#32048;&#34920;&#31034;" />3</td>

そこで、dataTableの前にあった<h:form>をデータテーブルのcommandButtonの前に
置いてみると、hiddenが追加されるようです
(paramといってもhiddenにレンダリングされるという事でしょうか)

しかし、それでもidの値は渡ってきていないようですし、
formをテーブルの内部に仕込むと、commandButtonの項目に改行が入り、美しくないです・・・

そもそも根本的に使い方が違うのでしょうか?
同じような質問先月の終わり頃にあったので、それもかなり参考にさせてもらったのですが、まったくうまく行きません。
どなたかお分かりになるようでしたら、よろしくお願いいたします。
あしゅ
ぬし
会議室デビュー日: 2005/08/05
投稿数: 613
投稿日時: 2006-03-12 21:19
引用:

まささんの書き込み (2006-03-12 16:16) より:
そもそも根本的に使い方が違うのでしょうか?



違います。

<h:commandButton type="submit" action="#{myBean.viewdetail}" value="詳細表示">
 <f:param name="id" value="#{item.id}"/>
</h:commandButton>

actionではなく、actionListenerで指定して、
コード:
public void viewdetail(ActionEvent event) {
 List children = event.getComponent().getChildren();
 for (Iterator itr = children.iterator(); itr.hasNext() {
  UIComponent component = (UIComponent) itr.next();
  if (component instanceof UIParameter) {
   UIParameter parameter = (UIParameter) component;
   if ("id".equals(parameter.getName())) {
    Object value = parameter.getValue();
   }
  }
 }
}


という取り方になります。

ちなみに、ここでやりとりするパラメータはString以外も行けます。
というよりは、<f:param value="#{...}" />で指定したオブジェクト
そのものが渡ってくることになります(java.io.Serializable必須)。

引用:

>MyFacesの拡張コンポーネント(tomahawk)を利用できるのであれば
><t:selectOneRadio>と<t:radio>の組み合わせで実現できると思います。

利用も検討してみますが、怪しい動きをするのですか・・


商用は知りませんが、現在のJSFの実装はどれも怪しげな挙動が多いので、
JSFを使う限りはそれなりの覚悟はしておかないといけないと思いますよ。

Tomahawkも動いてくれさえすれば大方は大丈夫なんですが、
ドキュメントがないに等しかったりで使いこなすのは大変です。
よしだひろゆき
大ベテラン
会議室デビュー日: 2004/11/22
投稿数: 141
投稿日時: 2006-03-13 15:33
引用:

実は別な方法でやろうと試しているのですが、こちらでもうまく行っていません。
Radioボタンではなく、データカラム毎に、commandButtonを置いて、


よく分からないのですが,私が↓で投稿したサンプルの「select」ボタンの方法では駄目なんですか?
http://www.atmarkit.co.jp/bbs/phpBB/viewtopic.php?topic=28759&forum=12&7

スキルアップ/キャリアアップ(JOB@IT)