- PR -

【Struts】ActionFormBeanとアクションクラスの関係について

1
投稿者投稿内容
BonAnimo
会議室デビュー日: 2004/11/09
投稿数: 3
投稿日時: 2004-11-17 11:45
strutsの勉強をしてActionFormBeanとアクションクラスの関係が
どうしても把握できない個所があります。
(処理に問題はなく、何故うまく実行されるのかが分かりません)

1.WEBブラウザのURLに「http://〜/action2.do」リクエストを送ると
index.jspの氏名(name)にform1のresetメソッドが実行された結果
(山田太郎)が出力されます。
struts-config.xmlの<action>要素のaction2と<form-bean>要素のfom1が
関連付けされていないのに何故、form1のresetメソッドが実行されるのでしょうか?
forward先のindex.jspの<html:form>のactionにaction1が設定されているからでしょうか?

2.index.jspのnameに"山田次郎"(山田太郎以外)を入れて、SUBMITします。
struts-config.xmlをみるとaction1とform1が関連付けされていて、forward先がaction2に
なっています。form1のresetメソッドの実行されるタイミングがよくわかりませんが、
もしActionFormBeanが呼び出される毎に実行されるのであれば、action1実行後の
Webブラウザには上記1と同じようにnameに山田太郎が設定されていると思うのですが、
"山田次郎"が表示されたままになっています。


【jsp】index.jsp
一部抜粋
<%@ taglib uri="/tags/struts-html" prefix="html" %>

<html:form action="/action1">
<table border="0">
<tr>
<th align="right">氏名:</th>
<td><html:text property="name" size="15" maxlength="20" /></td>
</tr>
<tr>
<td colspan="2" align="center">
<html:submit property="submit" value="登録" />
<html:reset property="reset" value="クリア" />
</td>
</tr>


【ActionForm】form1
一部抜粋
private String name;
public void setName(String name){this.name=name;}
public String getName(){return name;}
public void reset(ActionMapping map,HttpServletRequest request){
request.setCharacterEncoding("Shift_JIS");
name="山田太郎";

【Action】action1
処理概要:リクエスト情報をテキストファイルに書き込む
return map.findForward("right");

【Action】action2
処理概要:リクエストの属性に値を設定する。
(特に問題の関係しそうな処理はありません。)
return map.findForward("right");


【struts-config.xml】

<form-beans>
<form-bean name="form1" type="form1" />
</form-beans>

<action-mappings>
<action path="/action2" type="action2" >
<forward name="right" path="/index.jsp" />
</action>

<action path="/action1" type="action1" name="form1" scope="request">
<forward name="right" path="/action2.do" />
</action>
</action-mappings>

質問がわかりにくいかも知れませんが、よろしくご教示願います。
シュン
ぬし
会議室デビュー日: 2004/01/06
投稿数: 328
お住まい・勤務地: 東京都
投稿日時: 2004-11-17 16:14
オープンソースプロジェクトの内側を知りたいなら、デバッガでステップ実行が
お手軽ですよ。

Strutsのソースコードを入手し、ローカルのSun JDKのコンパイラを用いてDebug
情報を入れる条件でコンパイル(多分配布物にはAntのBuild.xmlがついているはず)
し、完成したライブラリをクラスパスに通して、APサーバーをデバッグ実行して
みてください。

興味のある個所の周辺にブレークポイントを置き、以降をステップ実行しながら
インスペクタで変数の変化をみていけば、何をどうしてそう動くのかは一目瞭然
です。


[ メッセージ編集済み 編集者: シュン 編集日時 2004-11-17 16:15 ]
aa
ぬし
会議室デビュー日: 2004/01/08
投稿数: 299
投稿日時: 2004-11-17 22:39
引用:

struts-config.xmlの<action>要素のaction2と<form-bean>要素のfom1が
関連付けされていないのに何故、form1のresetメソッドが実行されるのでしょうか?


action2の<action>でnameが指定されていないから、適当に(って、1つしかありませんけど)呼ばれたんじゃないんですかね。
name="" と指定するとどうでしょう?
引用:

forward先のindex.jspの<html:form>のactionにaction1が設定されているからでしょうか?


確実に違います。
引用:

form1のresetメソッドの実行されるタイミングがよくわかりませんが、
もしActionFormBeanが呼び出される毎に実行されるのであれば、


されます。その後、postされた値(じろう)でsetName()が呼ばれます。
BonAnimo
会議室デビュー日: 2004/11/09
投稿数: 3
投稿日時: 2004-11-18 09:13
ご教示ありがとうございます。

action1の<action>要素を削除して「http://〜/action2.do」リクエストを送ると
上記要素がないExceptionがでます。

試しにaaさんの言う通りに<action>要素のaction2のnameに""や"abc"など
何を設定してもやはりaction1に関連付けられたform1を参照に行きます。
(問題なく実行されます)

シュンさんの言われるデバック方法を実行して流れを把握してみようと思います。
(初心者なので、時間がかかりそうですが、今後もかなり約に立ちそうなので!)

アドバイスありがとうございます。
また、具体的な流れを把握しましたら、自己レスでも掲載させていただきます。
1

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