- PR -

ストラッツ:been:defineで取得したMapをhtml:hiddenにセットする方法

投稿者投稿内容
java初心者
ベテラン
会議室デビュー日: 2007/07/23
投稿数: 54
投稿日時: 2007-07-31 15:46
<been:define>を使用し、取得したmapをそのまま
<html:hidden>にセットするにはどうしたら良いのでしょうか?

----------------------------------------------------------
<bean:define id="map" name="QueryForm"property="PairMap" type="LinkedHashMap" />

<html:hidden property="PairMap" value="map" />
----------------------------------------------------------

とした場合、submitでActionに遷移する前に
下記のエラーが出てしまいます。

java.lang.IllegalArgumentException: Cannot invoke server.QueryForm.setPairMap - argument type mismatch

宜しくお願い致します。


[ メッセージ編集済み 編集者: java初心者★ 編集日時 2007-07-31 15:49 ]
nagise
ぬし
会議室デビュー日: 2006/05/19
投稿数: 1141
投稿日時: 2007-07-31 16:48
html:hiddenが何をするものか理解していますか?
HTMLの<input type=hidden>タグになるわけですが、Mapをどのように文字列にするのでしょう?
そして、それをどのように元のMapにするのでしょう?
java初心者
ベテラン
会議室デビュー日: 2007/07/23
投稿数: 54
投稿日時: 2007-07-31 17:24
nagise様

ありがとうございます。

"map"だと、文字列をセットしてしまっていることを
教えて頂きまして、<%= =>で囲んでみたものの

---------------------------------------------------
<html:hidden property="PairMap" value="<= map >" />
---------------------------------------------------

シンボルを解決できません。とエラーでした。

<been:define>は一度、他の変数に格納しないと、
valueとして、セットすることが出来ないんでしょうか?

宜しくお願い致します。
Kazuki
ぬし
会議室デビュー日: 2004/10/13
投稿数: 298
投稿日時: 2007-07-31 17:57
hiddenは最終的に<input type="hidden" value="...." />になります。
....の部分は文字列なのでMapを格納しようと思ったら自分でシリアライズやデシリアライズしないといけないです。
(Strutsは明るくないので簡単な方法があったらごめんなさい)
Mapに何が入ってるかは私はわからないので、後は自分でやるしかないと思います。


因みに単純に次のリクエスト等にMapを持ち越したいだけならおとなしくSessionを使うのが楽だと思います。

# どうでもいいですが以前立てたスレッドに対してのフィードバックが無いので
# フィードバックを各スレッドにして頂けるとありがたいです。
# 放置するようなら私は今後返答しません。
nagise
ぬし
会議室デビュー日: 2006/05/19
投稿数: 1141
投稿日時: 2007-07-31 18:13
うーん。うまく伝わっていないようですね。

<html:hidden>にjava.util.Map型のデータをそのまま格納したい、と言っているのですよね?

<been:define>はそれ自身が新しい変数の宣言をするような代物です。
defineを経由しようが直接設定しようが、hiddenにMapを格納できるかという話題とは関係ありません。

さきの投稿で言いたかったのは、hiddenにもしMapを格納できるとして、それはどのように振舞うの?という話。
<html:hidden>ってのはHTMLの<input type=hidden>のタグをJSPに書き出しているわけですよね?
Mapをそのまま放り込んだらどんなHTMLになるのでしょうか?
HTMLのソースを表示したときにinputのvalueの値はなんになるのでしょうか?
そこを考えて見てください、と言ったわけです。

ブラウザはそのHTMLを表示し、submitでinputのvalueをサーバに送ります。
そのときにどうやってjava.util.Mapを送るのでしょうか?

Strutsのようなフレームワークを使っているとHTTPの仕組みだとか
HTMLがどうなるとか、そういうところを意識しないで済むのですが、
見えないからって存在しないわけではないのですよ。
HTTPで無理なことはその上に載っているフレームワークでも無理なんです。
可能なように見えているのだとしたらどこかで手品が使われているのです。
朝日奈ありす
大ベテラン
会議室デビュー日: 2007/05/02
投稿数: 189
お住まい・勤務地: 最北の地
投稿日時: 2007-07-31 20:52
<logic:iterator name="bean" property="map" id="item">
<bean:define id="item" name="item"/>
<html:hidden property="xxx" value="<%= item %>"/>
</logic:iterator>

望んでいるものかどうか解りませんがこういうことをしたいのかな??
java初心者
ベテラン
会議室デビュー日: 2007/07/23
投稿数: 54
投稿日時: 2007-08-01 11:09
Kazuki様
nagise様
杏様

ありがとうございます。

Kazuki様のおっしゃる通り、以前のスレッドでご返信できていなかったものが、
ありましたので、各スレッドにご返信を致しました。
ご返信が遅くなりまして大変申し訳ございませんでした。

内容についてなのですが、
nagise様の文章を読み返しまして、気づいたことなのですが、
HTML:hiddenのvalueには入力フィールドで入力できる文字列だけ
なので、Mapを入れることは出来ないということだったんですね。
知識不足で申し訳ございません。

再度、自分がやりたいことの詳細を記載致しますので、
ご教授のほどお願い致します。

※現在、検索画面から検索結果画面に一つのactionを使って、処理するものを作成しております。(action内でif文を使用しmapping.findForwardを分けております)

@testAction.doでaction内で取得したLinkedHashMapをtestActionFormに格納。
Atest.jspに遷移後、submitで再度testActionに入った際に、formに格納したMapが
ActionForm form = (ActionForm) formの処理により、test.jsp前で取得した値が、
初期化?されてしまっている。
Bその為、test.jsp内で一度Mapを取り出し、再度そのMapをformに格納させたいと考えました。
C現場のルールでこの内容でのsessionは使用できません。

問題点として、test.jsp内でmapをどうやってformに格納させたら良いかというところで
悩んでおります。

説明が分かりづらい点が多々あると思いますが、
宜しくお願い致します。

[ メッセージ編集済み 編集者: java初心者★ 編集日時 2007-08-01 11:21 ]
nagise
ぬし
会議室デビュー日: 2006/05/19
投稿数: 1141
投稿日時: 2007-08-01 11:47
フレームワークが隠しているHTTPの通信部分を理解するとよくわかるのですが、
HTTPは本来ステートレス(連続した呼び出しだからといって状態を保持しない)
な通信なので、ブラウザからリクエストを受けてレスポンス返して終わりなんです。
連続した呼び出しで値を保持し続けることはできません。

それだとやれることが限られるので、Cookieという仕掛けがあって
連続した呼び出しを管理するわけなのです。
このあたりはjavax.servlet.http.HttpSessionで管理されていますから
このクラスについて調べるとよいでしょう。

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