雇われるだけの人生から目指せ独立、社会人2年目なゲーム脳SEのブログ。更新頻度=週2~3回。
×
[PR]上記の広告は3ヶ月以上新規記事投稿のないブログに表示されています。新しい記事を書く事で広告が消えます。
いまどきStruts(笑)とか音速が遅すぎますが、Strutsの内部的な動作って意外なほど知られてません。
それとも私がそんな「知られていない程度の職場」にしか行ったことがないんでしょうか?おかしいな、結構どころじゃなく有名なんだけどな、今入ってる会社・・・
閑話休題。というわけで、近頃見つけたStrutsのtipsをいくつかまとめてみました。
○HTTPRequestの内容からrequestスコープのActionFormが生成される手順について
www.fireproject.jp/feature/struts/advanced/action_to_action.html
こちらのサイトが非常に詳しいです。
ポイントは「フォワード前のexecuteでHTTP要求のパラメータにあったActionFormのフィールドを上書きしても,フォワード後のexecuteまでに再びHTTP要求のパラメータで上書きされてしまう.」というところでしょうか。
よくあるんですよね。入力されてきたActionFormの値をActionで書き換えてJSPにフォワード。でも何故かJSPで書き換えた値を出力すると書き換えられていない。原因が分からない。分からないから別の名前で書き換えたActionFormをsetAttributeしちゃえーみたいな。でも実際それが一番の解決法だったりする。
○Struts ActionForm reset()メソッドとActionForm中のBeanについて
例ではよくcheckboxの状態をリセットするために使えと書いてますが、ActionFormにBeanを内包した場合にも併用が必須です。
このオチだけならデバッグして本人が解決してくれればいいんですが、このエラーを一目見て原因不明と判断してActionFormにはBeanを入れてはいけませんみたいなルールを勝手に作って意味不明な実装をしている箇所が何カ所かあって、ずいぶんと絶望させられました。ひでえ。
フレームワークに乗せられているだけでは、決して良いプログラムにはならないのですね。
それとも私がそんな「知られていない程度の職場」にしか行ったことがないんでしょうか?おかしいな、結構どころじゃなく有名なんだけどな、今入ってる会社・・・
閑話休題。というわけで、近頃見つけたStrutsのtipsをいくつかまとめてみました。
○HTTPRequestの内容からrequestスコープのActionFormが生成される手順について
www.fireproject.jp/feature/struts/advanced/action_to_action.html
こちらのサイトが非常に詳しいです。
ポイントは「フォワード前のexecuteでHTTP要求のパラメータにあったActionFormのフィールドを上書きしても,フォワード後のexecuteまでに再びHTTP要求のパラメータで上書きされてしまう.」というところでしょうか。
よくあるんですよね。入力されてきたActionFormの値をActionで書き換えてJSPにフォワード。でも何故かJSPで書き換えた値を出力すると書き換えられていない。原因が分からない。分からないから別の名前で書き換えたActionFormをsetAttributeしちゃえーみたいな。でも実際それが一番の解決法だったりする。
○Struts ActionForm reset()メソッドとActionForm中のBeanについて
例ではよくcheckboxの状態をリセットするために使えと書いてますが、ActionFormにBeanを内包した場合にも併用が必須です。
public void reset(ActionMapping mapping, HttpServletRequest request) { //HTTPリクエストからパラメータ値を読み取って //本ActionFormに設定する前に必ず呼ばれる //ここでabesiBeanのオブジェクトを生成する super.reset(mapping, request); this.abesiBean= new AbesiBean(); }このBeanをnewする処理を怠ると、
サーブレットが"abesiBean.name=abesi"のようなカンマで区切られたパラメータ付きのPOSTを受け取る
↓
Action.doPost()が実行される
↓
populate()・・・HTTPリクエストパラメータからActionFormを生成しようとする
↓
"abesiBean.name"のようにHTTPリクエストで指定されているので、BeanUtilがカンマ処理を解決しようとする
↓
でもabesiBeanはnullです、BeanUtil.populate()にnullを指定するとエラーになります
↓
というわけでエラー(しかも一見して何が原因か分かりづらいエラー)
というオチになります。1.2.6での話なので、1.3ぐらいなら直っているかもしれません。↓
Action.doPost()が実行される
↓
populate()・・・HTTPリクエストパラメータからActionFormを生成しようとする
↓
"abesiBean.name"のようにHTTPリクエストで指定されているので、BeanUtilがカンマ処理を解決しようとする
↓
でもabesiBeanはnullです、BeanUtil.populate()にnullを指定するとエラーになります
↓
というわけでエラー(しかも一見して何が原因か分かりづらいエラー)
このオチだけならデバッグして本人が解決してくれればいいんですが、このエラーを一目見て原因不明と判断してActionFormにはBeanを入れてはいけませんみたいなルールを勝手に作って意味不明な実装をしている箇所が何カ所かあって、ずいぶんと絶望させられました。ひでえ。
フレームワークに乗せられているだけでは、決して良いプログラムにはならないのですね。
PR
この記事にコメントする
カレンダー
03 | 2025/04 | 05 |
日 | 月 | 火 | 水 | 木 | 金 | 土 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | ||
6 | 7 | 8 | 9 | 10 | 11 | 12 |
13 | 14 | 15 | 16 | 17 | 18 | 19 |
20 | 21 | 22 | 23 | 24 | 25 | 26 |
27 | 28 | 29 | 30 |
ブログ内検索
最新記事
(10/12)
(10/09)
(10/09)
(10/08)
(10/05)
カテゴリー
プロフィール
HN:
akisute
性別:
男性
職業:
システムエンジニア
趣味:
ゲーム・東方・ニコ動。あと散歩。
推奨環境
横幅900px以上、Firefox 3, Safari 3, Opera 9.5, Chrome 0.2以上。IE7ギリギリ対応。IE6未対応。