質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.50%
Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

Seasar2

Seasar2はJ2EE/Java EEでの大規模な開発を効率良く行なうためのフレームワークです。 必要な設定ファイルを従来のものと比べて少なくし、依存性を分離して記述しています。 そのため、生産性の高いプログラム開発が可能です。

Q&A

解決済

1回答

13760閲覧

【SAStruts】アクション間でアクションフォームを引き渡す方法

chida3

総合スコア15

Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

Seasar2

Seasar2はJ2EE/Java EEでの大規模な開発を効率良く行なうためのフレームワークです。 必要な設定ファイルを従来のものと比べて少なくし、依存性を分離して記述しています。 そのため、生産性の高いプログラム開発が可能です。

0グッド

0クリップ

投稿2017/06/04 03:14

SAStrutsにて、個人でのWebアプリ開発勉強をしています。
アクション間でアクションフォームを引き渡す方法について、迷っています。

##やりたいこと
一覧入力画面(input.jsp)で入力した内容をもとに、結果表示画面(result.jsp)を表示する。

##現在の実装
いまのところ、下記のように実装して動作しています。

①上記画面それぞれについて、アクションおよびアクションフォームを作成。
(InputAction、InputForm、ResultAction、ResultForm)

②遷移の流れ
input.jspからのサブミットでInputAction#execを呼び出す

HttpSessionにInputFormをsetAttribute
戻り値でResultAction#showResultにリダイレクト

ResultActionにてHttpSessionからInputFormをgetAttribute

java

1public class InputAction { 2 3 @Resource 4 @ActionForm 5 protected InputForm inputForm; 6 7 @Resource 8 protected HttpSession session; 9 10 @Execute(validator=false) 11 public String exec() { 12 session.setAttribute("inputForm", inputForm); 13 return "../result/showResult?redirect=true"; 14 } 15}

java

1public class ResultAction { 2 3 @Resource 4 @ActionForm 5 protected ResultForm resultForm; 6 7 @Resource 8 protected HttpSession request; 9 10 @Execute(validator=false) 11 public String showResult() { 12 ResultService sv = new ResultService(); 13 sv.exec((InputForm)request.getAttribute("inputForm"), resultForm); 14 return "result.jsp"; 15 } 16 17}

##質問
1)リダイレクトではなくフォワードでアクションフォームを渡す方法は?
『Seasar2徹底入門』を参考にしたため(画面遷移についてリダイレクトが紹介されていた)、上記のような実装にしたのですが、そもそもフォワードでアクションフォームを別のアクションに渡すことは可能でしょうか?(推奨されていないのでしょうか?)

2)リダイレクトにおいて、QueryStringでアクションフォームをパラメータとするには?
リンク内容
上記にて、

どうしてもREDIRECTで遷移したい場合は、

・URLの一部に埋める(urlPatternを使う)
・QueryStringで渡す。
・セッションで渡す
の3パターンから選ぶのが普通です。

とありました。2つめの方法について、アクションフォームをパラメータとすることはできるのでしょうか? その場合、どのような実装になるのでしょうか?

3)セッションにアクションフォームをセットした場合に気をつけるべきことは?
セッションにアクションフォームを格納することで、実装において留意すべきこと(危険性など)は何があるのでしょうか。

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

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

1 redirect=trueをつけなればforwardになります。特に禁則はありませんが、リダイレクトは一度ブラウザへレスポンスするのに対し、フォワードはブラウザへレスポンスせずにサーバ側で別のURLへ遷移します。

このため、リダイレクトは遷移先にリクエスト情報が受け継がれませんが、フォワードは受け継がれます。
このリダイレクトとフォワードの違いがわかると、より理解が深まるでしょうか。

2 "ActionFormをパラメータとする" の言い回しに、言いづらいのですが誤解がありそうに思えました。
リクエストパラメータやクエリ文字列を受け取るのがActionFormです。
リダイレクト時は 1の回答にもありますように、一度レスポンスを出力してしまうため、リクエスト情報は共有されません。そのため、リダイレクト先のURLにも何らかの値を引き継げるよう、URLの一部(=クエリ文字列)に格納するか、またはHttpSession領域へ一時的に格納しておく手法を使います。

3 ActionFormをsession管理に置くと、複数Action間で共有できるためとても使い勝手は良いですが、セッションが破棄されるか、明示的に自らオブジェクトを削除しない限り残り続けます。
これはメモリを圧迫する要因にもなりますが、思わぬところでセッションから値を拾ってきてしまって入力していない値が表示される不具合も生みやすいでしょう。使い終わったセッションオブジェクトは必ず破棄するか、初期化するActionを設定することが必要です。

投稿2017/06/04 03:43

編集2017/06/04 03:44
A-pZ

総合スコア12011

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

chida3

2017/06/04 14:09

1)exec()内でrequestにアクションフォームをsetAttributeし、戻り値を「return "/result/showResult;」に変更したらフォワードして受け渡しもできました。 フォワードとリダイレクトの違いについてもありがとうございます。どちらにするかは今後検討してみます。 2)>リクエストパラメータやクエリ文字列を受け取るのがActionFormです ご指摘の通り、誤解がありました。 引き渡したいアクションフォームがListなどを持つので、クエリ文字列にするのは面倒そうですね。 3)オブジェクトの破棄or初期化については、これから実装にトライしてみます。 ご回答ありがとうございました。
chida3

2017/06/04 14:48

3)実装できましたので追記をば。 showResult()に「@RemoveSession(name="inputForm")」を付与しました。 @ExecuteにremoveActionForm=trueを追加するのも試してみましたが、requestスコープのResultFormも破棄されているようだったので、上記の実装にしました。 (removeActionFormの場合、sessionにかぎらず、アクションフォームであれば破棄する仕様みたいです。 参考:https://ml.seasar.org/archives/seasar-user/2008-October/016170.html)
A-pZ

2017/06/04 16:04

d(・ω・
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問