JSP(Struts)で動的な表の出力。
Piro2
Piro2
ATOMRSS
  • コード求むID: 144
  • 登録日時:  2007/10/10 23:31
  • 最終更新日時: 2007/10/15 15:23
  • アクセス数: 2829
  • タグ:  java jsp struts
  • codeなにがしブックマークに追加する 0 users
  • このページを del.icio.us に追加
  • このページをはてなブックマークに追加

Strutsを利用して以下のような2次元配列をHTMLで表を表現したいと考えています。

・オブジェクト(String型の2次元配列)
A,X,Y,999
A,X,Y,999
A,X,Z,999
A,X,Z,999
B,X,Y,999
B,X,Y,999
B,X,Z,999
B,X,Z,999

・出力したいHTML
|A|X|Y|999
| | | |999
| |X|Z|999
| | | |999
|B|X|Y|999
| | | |999
| |X|Z|999
| | | |999
(空白の部分はROWSPAN)

これを出力するためのソースが書けなくて困っています><
<logic:iterate>タグやスクリプトレットを駆使しているのですが…
ROWSPANのサイズを動的に取ったりしているのですが、
どうもうまくいきません。

よろしくお願いいたします。





コメント

  • ゲスト
  • 1:ゲスト (mmke)
  • 2007/10/12 12:25

テーブルを作りたいというのでよければ、いくつか設計上で代替案になってしまいますが、、

・提案1.rowspanをやめる(線を消すように考える)
・提案2.Stringの配列ではなくてbeanにする。

何故かというと、現在のデータ状態と実現ロジックを考えた場合、前の値をいちいち保持して、現在の値と比較し同じ項目が見つかった場合、rowspanの加算と出力前<html>をフルでどこかに保持しないと出力できないですよね?

であるならば、はじめからTree構造なりデータ構造(下記sample1参照)にしておけば、下位階層がいるときはそのループだけで後は入れ子にすれば成立します。

また、Stringの配列でどうしても行いたいのであれば、rowspanの計算中(加算中)は生成HTMLを丸ごとどこかに保持することでしか対応できないような気がします。
そこで、rowspanの計算をやめ毎回一行表示する代わり線を出さないようにすることでもほぼ同じ状態が得られます。


-------sample1#
//構造だけ示すつもりで書いてるので
//下記そのままのコードは望ましくありません。
class Level {
    List lowLevels;//下位階層のリスト
}

  • GoodJob
  • 0

  • Piro2
  • 2:Piro2
  • 2007/10/13 13:45

mmkeさんありがとうございます。
おっしゃるとおり、rowspanの算出があることで、非常にやっかいなことになってます(^_^;)
提案1は思いつきませんでしたが、試してみたいと思います。
ユーザ側でそれでOKとなればいいのですが。。。

Tree構造のオブジェクトが取得できれば、確かにご指摘の方法もできそうです。(Strutsのタグではなくてスクリプトレットでゴリゴリって感じですね。)

提案1、2共に試してみたいと思います。

  • GoodJob
  • 0

  • ゲスト
  • 3:ゲスト (mmike)
  • 2007/10/15 15:21

蛇足ですが、書き忘れがあったので、、、
2の方は下位にあるリストの数を取得できる関数を延々数珠繋ぎにしておくことで、rowspanは1回で求められますので参考まで。
strutsのなかでは、
<bean:write name="~" property="lowLevelsCount" />
で取得できます。

特に動かしてはいないですが、下記コードの考え方でいけるはずです。

public class Level{
  List lowLevels;

  public int getLowLevelsCount(){
    int itemCnt 0;  /* 子の数 */
    if(lowLevels != null){
      for(リスト数分){
        Level lvl (Level)lowLevels.get(カウンタ);  /* 子供の中の子供の数 */
        itemCnt += lvl.getLowLevelsCount();
      }
    }
    return itemCnt lowLevels.size();
  }
}

  • GoodJob
  • 0

  • ゲスト
  • 4:ゲスト (mmike)
  • 2007/10/15 15:23

ごめん。。。
コードしくりました。


public class Level{
 List lowLevels;

 public int getLowLevelsCount(){
   int itemCnt 0;  /* 子の数 */
   if(lowLevels != null){
     for(リスト数分){
       /* 子供の中の子供の数 */
       Level lvl (Level)lowLevels.get(カウンタ);  
       itemCnt += lvl.getLowLevelsCount();
     }
     itemCnt += lowLevels.size();
   }
   return itemCnt;
 }
}

が正しいです。

  • GoodJob
  • 0

前へ 1 次へ

コメントする

[block]から[/block]までの範囲はブロック表示されます。
部分的に目立たせたい時や、引用などにお使いください。

[code]から[/code]までの範囲は等幅表示されます。
ソースコードや設定ファイルの記述などにお使いください。

ゲスト投稿者:ゲスト:

関連ソースコード・ノウハウを登録

PDFLib | A library for processing PDF on the fly プレゼン公開・共有サイト handsOut.jp オープンタイプ株式会社 チーム・マイナス6% - みんなで止めよう温暖化

ブックマークコメント