Javaに関する様々な情報をご紹介します。

Javaに関する様々な情報をご紹介します。
評価

0

coreタグ c:forEachの使い方について

考え方を質問させてください。

以下のようなケースでUMU_FLGには
「1」か「0」が入っているとします。
これをstaticなメソッドを用意して画面表示の時に
変換して「有り」「無し」にするのがスマートだと
思うのですが、どのようにすれば実現可能でしょうか?


<c:forEach items="${useList}" var="rec">
  <tr>
    <td>${rec.TANTO_CD}</td>
    <td>${rec.TANTO_NM}</td>
    <td>${rec.UMU_FLG}</td> ←ここを変換したい
  </tr>
</c:forEach>


※SQLで対応とかJavaでListの中味を全て書き換えるとか
はできるのですが、内部的にはコードで持ちたいのでJSPでやることはできないかな
と思っています。

正直、タグを使うより全てBeanというかJavaで作り込んで呼び出す方が柔軟性があっていいんじゃないかと思うのですが、それだとcoreタグの存在価値がない気がしますし、手間がかかります。
皆さんのよく使われる手法について教えてください。

16

回答

83120

閲覧

16件の回答

評価

0

1なら「有り」?
0なら「無し」と表示するということでしょうか?

なら
<c:if test="・・・・・">
で良いのでは?

評価

0

んーと。さんへ

返事ありがとうございます。
例はわかりやすくするために2択ですが
変換することを目的としているので
ケースによっては複雑な変換処理もあると
してどんな方法で変換するかを教えて
いただけると幸いです。

評価

0

>内部的にはコードで持ちたいのでJSP
というのはどういうことでしょう?

私なら、データを保持するリストとは別に、
表示するリストを作って、
素直にJSPに表示します。

評価

0

コロさんへ


例えば1万件データがあってページ表示を利用して一度に10件しか表示しないような場合に変換された文字列を持つのはムダですよね?

10件だけ変換する方がいいと思うのですが、それをforEachで実現したいのです。

評価

0

????

もっとわかりません。
1万件のデータがリストに入っていて、
それをforEachでループさせて、
変換したいということ?
それこそムダな処理が行われる回数が多すぎるのでは?

>1万件データがあって
これが例えばDBにあるのであれば、
>一度に10件しか表示しないような
場合であれば、DBからも10件しか取り出さないのが一番無駄がないと思いますが。

1万件のデータをjsp上に持ってくるようなことは普通はしないかと。
あくまでサーバ側で処理をして、
クライアント側は必要最小限の情報量で。


一万件のデータをjspまで引っ張ってくるのではなく、
必要最小限のデータをjsp側に持ってきて表示するのがスマートではないのでしょうか?

何だか実現したいことが良くまだつかめていません。

評価

0

言ってることは合っているけど、jspはサーバ側よ、一応。

ただしDBから10件「だけ」引けるかどうかはDBMSによるので、抽出作業はJavaかも知れない。

評価

0

コロさんへ

わかりづらくてすみません。

10件しか取り出した方が良いのはもっともですがページ遷移のアクセス速度との兼ね合いでまとめて取るように考えています。

またforEachのbegin、endで遷移するものだと考えています。

やりたいのは

<%= util.getXXX(${rec.YYY}) %>

といったことなのですが…

評価

0

>10件しか
10件だけの誤りです。

既存資産を生かして使いたいとか
そういう要望ってないんですかねぇ・・

評価

0

とりあえず整理。

>またforEachのbegin、endで遷移
ということは、
ここで(begin、endを指定することで)
10件だけを表示するように、
リストの中から値を取り出して、
さらにリストの10件の中身に応じて、
表示内容を変更する

ということでしょうか。
日本語理解力に乏しくでゴメンナサイ。

そしたらタグライブラリを自作するか、
jspでゴリゴリソース書くか・・・
位しか思いつきません(・ω・)
「柔軟に対応する」なら
<c:if>がお勧めなんですけどね。

評価

0

コロさんへ

整理していただきありがとうございます。
やりたいことはおっしゃる通りです。

やはりforEachはきれいに表示用の整形済みのデータを表示する利用方法しかできない感じですかね。

タグライブラリ自作とjspゴリゴリより自分はBeanにゴリゴリの方が好きなのですがこれって邪道なのかな?ってことが気になってます。

<%= Util.XXX(tableList) %>

※でもなんかcoreタグに頑張って欲しいのですけどね〜

評価

0

イマイチ理解できてない&すでに回答が出てるかも知れませんが、もし自分なら

その1 getメソッド追加
class Item {
  boolean UMU_FLG;
  ...(既存のgetter/setter)
  getUMU() {
    if(UMU_FLG) return "○";
    return "×";
  }
}
で、<td>${rec.UMU}</td>で表示する

その2 c:chooseで分岐
(c:ifよりは多少柔軟なので。。。)

ぐらいでしょうか。

評価

0

たかさんへ

返事ありがとうございます。

状況としては
DbUtilsを使ってListで取り出したデータをjspに送り、そのデータを変換表示したいと思っています。

データはnullがあっり、コード値は複数通りあったりするためc:ifやc:chooseで書くのは避けたいわけです。


※nullだとtableタグとしては&nbsp;とかに変換したいです。

評価

0

>データはnull
>c:ifやc:chooseで書くのは避けたいわけです。

それならc:ifやc:chooseで書くのがいいと思うのですが?

<c:forEach items="aaa" var="i" >
 <c:if test="${i.name} != null" >hoge</c:if>
<br /></c:forEach>

こういうことではないの?
因みに<br />を入れると、
テーブルのとき値がsetされなくても、
ちゃんとborder表示してくれるようになります。

>複数通りあったりするため
複数通りを、java側ではなく実現するのであれば、
c:ifやc:chooseを利用されるのをお勧めしますが?

(この場合はif-elseif-else を使いたいと思うのでchooseが良いかもですね)

評価

0

コロさんへ

<br/>を入れておけばいいっていうのは知りませんでした。
地味に大発見な気持ちで大感謝です。p(^-^)q

null対応だけならc:if判定はいらないですね!


複数通りが
例えば郵便番号で表示したいのが対応する住所だったりする場合はやはり表示用のBeanとかを用意して詰め替えしないとできないのですか?
c:chooseで対応することではないですよね。(-.-)

評価

0

郵便番号だとかなり話は変わります。
郵便番号には重複もありますので。
違う県なのに同じ郵便番号とか(経験済み)。

そういう量の多い処理をしたいのであれば、
やはりDBに対応テーブルを作るか、
Mapを持たせるのをお勧めしますが?

一度に表示したいのが10件でも、
さすがにゴリゴリやるには厳しい量かと。

jspで実現するのであれば、
リストの内容・変換したい文字列
のMapを作って表示する

出来なくはないですよ。
でも・・・・
お察しの通り大変なことになりますね。

getXXみたいなことをするということは、
処理分岐を何回書けばいいのって話になると思いますし。
二重ループで比較ってのもありかと思いますが、
どうもそれも・・・


リストの値を詰め替えないまでも、
変換を何処かしらで実装しなければならないわけで・・・


ゥーン。

評価

0

コロさんへ

返事ありがとうございます。
えっと質問についてはあくまで自己啓発のための勉強でして郵便番号とかは例です。
※郵便番号と住所が一意で対応しているわけじゃないってのは初めて知りました(^_^;



DBに対応テーブルを持つか、Mapで対応するって
感じしかなさそうですね。

<% String zip_code = (String)map.get("ZIP_CODE");%>
<td><%= Util.getJyusho(zip_code) %></td>

こんな感じでgetJyushoはDBアクセスを行う、あるいはMapでマッチングさせるって感じですね。
※郵便番号12万件だとしたらDBで10回アクセスしてもらうとかでしょうけど。


forEachをさらに便利に使いこなしている人がいるかなと思っていたのですが「使い道を限定して使え」って感じでいろいろと制約があるってことがわかりました。

というわけで、画期的な対策方法も出なさそうですし自分としては解決といたします。
おつきあいいただきましてどうもありがとうございました。

質問から6ヶ月以上経過しているので、回答を書き込むことはできません。