- PR -

Struts で画面の初期表示処理を指定する方法は?

1
投稿者投稿内容
noocyte
会議室デビュー日: 2006/09/03
投稿数: 3
投稿日時: 2007-03-15 19:55
Web アプリの開発経験すら全くないのですが,
突然 Struts を使うはめになり四苦八苦しています.

Struts のアクションクラスは,ある画面のフォーム内のボタンを押した時に
起動されますが,その画面の初期表示を行う時に Java のメソッドを
実行させるにはどうしたらいいんでしょうか?

例えば,JSP 内にセレクトボックス (html:select タグ) があり,画面の初期表示の
際にその選択肢の一覧を DB から取ってくる,などの処理を行いたいのですが.

ちなみにこのシステムと連携すべき既存の Web アプリも Struts を
使用しており,依頼元からはそれを参考にするように言われています.
しかし,その初期表示のための処理は Java プログラムとして
明らかに間違った方法で強引に動かしています.

(メニュー画面から各画面を呼び出すのに,メニューのアクションクラスから
 直接各画面のアクションクラスの初期表示メソッドを呼び出しています.
 その際,引数として ActionForm を渡さないといけないので,
 メニューのアクションに渡されたフォームをとりあえず渡しておき,
 呼ばれた側のメソッドで ClassCastException を強引に押さえ込んで
 正しいクラスのアクションフォームを作っています.orz
 このシステムを開発した人たちも,正しい初期表示方法を
 知らなかったとしか思えません.)

JDK 1.4.2,TOMCAT 4.1.27,Struts 1.1 です.よろしくお願いします.
nagise
ぬし
会議室デビュー日: 2006/05/19
投稿数: 1141
投稿日時: 2007-03-15 20:04
まずはHTTPでどういうやり取りがされているかを捉えること。

Strutsなどのフレームワークを利用した場合でも
基本的にWebのシステムはHTTPのリクエスト・レスポンスを
プログラムで制御してやるという動きが基本となります。

初期画面を表示させようとする際にリクエストされるURLに対し、
動的に生成したHTML(つまるところJSPの実行結果ですね)を
レスポンスとして返す前に処理を行う必要があります。

もしくはタグライブラリとして実装し、JSPの実行段階で処理するか。

いかんせん、大きな処理の流れを掴まないと方法論が理解できない
ところですので、まずはHTTPのやりとりと絡めて仕組みを理解しましょう。
noocyte
会議室デビュー日: 2006/09/03
投稿数: 3
投稿日時: 2007-03-15 20:26
回答ありがとうございます.


> まずはHTTPでどういうやり取りがされているかを捉えること。

HTTP の基本的なことは理解しています.
セッションを使わない,ごく簡単な CGI を Perl やCで書いてみたことはあります.
(仕事ではなく,HTTP の勉強として.)


> 初期画面を表示させようとする際にリクエストされるURLに対し、
> 動的に生成したHTML(つまるところJSPの実行結果ですね)を
> レスポンスとして返す前に処理を行う必要があります。

やはり JSP の処理の一部として実装するしかないのでしょうか.
依頼元からは,JSP には極力 Java のコードを書かずにカスタムタグを
使えと言われているので,Struts らしいやり方でやるとすれば,

  > もしくはタグライブラリとして実装し、JSPの実行段階で処理するか。

この方法しかないんでしょうか….
それでやってみることにします.
ありがとうございました.

JSP 実行前に Struts がメソッドを呼び出してくれるような仕掛けがほしい….
かつのり
ぬし
会議室デビュー日: 2004/03/18
投稿数: 2015
お住まい・勤務地: 札幌
投稿日時: 2007-03-15 22:34
初期表示からいきなり.jspを表示する方法ですか?
リストボックスの値をDBから取得するパターンならちょっと無理があると思います。

表示用のアクションと入力用のアクションを分けて、
初期表示 → 表示用アクション → JSP
入力   → 入力用アクション → 表示アクション → JSP
と、使い分けるようにするといいと思います。

この方法だとPRGパターンも適用できて、
戻るボタン、リロードボタン対策も楽です。
SUK2
ベテラン
会議室デビュー日: 2005/12/27
投稿数: 69
投稿日時: 2007-03-15 23:10
引用:
Struts のアクションクラスは,ある画面のフォーム内のボタンを押した時に
起動されますが,その画面の初期表示を行う時に Java のメソッドを
実行させるにはどうしたらいいんでしょうか?


仰りたい事が完全に把握出来ないのですが、
「その画面」というのはフォームの存在する「ある画面」の事ですよね?
「ある画面」もURLで指定されたのだから、そのURLで呼ばれるActionで初期表示処理を行なえば良いのでは?
フォーム内のボタンを押した時に起動されますがという表現が若干気になるのですが、決してPOSTされた時にしかActionが呼ばれないわけではありませんよ?
web.xmlで指定したパターンのURLはActionServletでハンドリングされ、struts-config.xmlで指定したActionで処理されます。

Strutsを使用した事が無いのであれば、入門書を一冊購入する事をおススメします。
nagise
ぬし
会議室デビュー日: 2006/05/19
投稿数: 1141
投稿日時: 2007-03-16 10:37
引用:

noocyteさんの書き込み (2007-03-15 20:26) より:
> 初期画面を表示させようとする際にリクエストされるURLに対し、
> 動的に生成したHTML(つまるところJSPの実行結果ですね)を
> レスポンスとして返す前に処理を行う必要があります。

やはり JSP の処理の一部として実装するしかないのでしょうか.



誤解させてしまったようで。
Strutsの場合はAction -> JSPの順で処理が行われますから
ActionでDBを読んでJSPでHTMLに直すということになります。
それか、カスタムタグでやるか、という話でした。

このへんはSUK2氏がフォローされていますね。
noocyte
会議室デビュー日: 2006/09/03
投稿数: 3
投稿日時: 2007-03-16 22:50
皆さん,回答ありがとうございます.

かつのりさん
> 初期表示からいきなり.jspを表示する方法ですか?
> リストボックスの値をDBから取得するパターンならちょっと無理があると思います。

すいません.JSP も初めてなのでどう無理があるのか理解できていません.


> 表示用のアクションと入力用のアクションを分けて、
> 初期表示 → 表示用アクション → JSP
> 入力   → 入力用アクション → 表示アクション → JSP
> と、使い分けるようにするといいと思います。
>
> この方法だとPRGパターンも適用できて、
> 戻るボタン、リロードボタン対策も楽です。

その点はよくわかります.Web アプリでない GUI でも,
表示データの変更と表示処理は分けて行いますからね.
問題は Struts から表示用アクションを呼ぶ方法がわからないことです.


nagise さん
> Strutsの場合はAction -> JSPの順で処理が行われますから
> ActionでDBを読んでJSPでHTMLに直すということになります。
SUK2 さん
> 決してPOSTされた時にしかActionが呼ばれないわけではありませんよ?

そうなんですか.呼ぶ方法を見つけられないので,
クエリーがあるときにしか呼ばれないものかと思っていました.

> web.xmlで指定したパターンのURLはActionServletでハンドリングされ、
> struts-config.xmlで指定したActionで処理されます。

web.xml の方はほとんど見ていませんでした.
struts-config.xml の設定内容は依頼元から指定されていますが,
最初の投稿に書いた理由から,それが正しい書き方なのかどうか,
多少疑念もあります.



既にかなり進捗が遅れてしまっていて残り時間も少ないので,
今回は手っ取り早く解決できる次の方法で当座をしのぐことにしました.

JSP から Java に変換されたコードと,Struts およびサーブレット関連の
クラスを調べたところ,_jspService(request, response) というメソッドが
JSP の処理の本体であり,request からたどればすべての必要な情報にアクセス
できそうだとわかりました.

そこでアクションクラスに初期表示用の static メソッド initDisplay を用意し,
JSP の最初の方に次の2行を入れました.(一応これで動きました.)

<%@page import="jp.co.xxxxx.xxxxx.XxxxAction" %>
<% jp.co.xxxxx.xxxxx.XxxxAction.initDisplay(request, response); %>

依頼元もこの程度なら許してくれるかも….
ダメなら後で変更します.(その時間が残っていればですが.(苦笑))
(前回,タグライブラリで … と書きましたが,その作り方を
検索してもすぐには見つけられなかったし,手元の入門書にも
書いてないので今回は見送ることにしました.)

# アクションや validator に渡される request から出発して色々と
# データ構造を調べた結果,ようやく Struts 内部の動きが少しわかって
# きました.とはいえ,struts-config.xml に scope="session" なんて
# 1行も書いてないのに,なぜフォームデータを HttpServletRequest
# ではなく HttpSession の属性として保持しているのかはいまだに謎です.

また行き詰まったら質問するかもしれませんが,その時はよろしくお願いします.
ことぶきじーさん
会議室デビュー日: 2003/10/07
投稿数: 7
お住まい・勤務地: 東京23区内
投稿日時: 2007-03-23 09:34
回答にはなりませんが・・・
どのみち、ご自分で正しい解答を作れないなら、右に倣えで、その既存のやり方を真似るべきだったと思いますよ。時間がないならなおさらです。
この助言、もう遅いですけど(笑)

それって、一番、やってはいけないことですよ。

ほかのコードとやり方が違う、かといって、正しいといえるやり方でもない。

メンテナンスする側としては、一番、イラっとするやり方です。
1

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