- - PR -
異なるBeanForm間のデータ受け渡しは可能!?
1
| 投稿者 | 投稿内容 | ||||
|---|---|---|---|---|---|
|
投稿日時: 2004-06-15 20:31
初めまして。 Struts1.1とEclipse2.1でWEB開発しているのですが、 題記の件は可能でしょうか? 私がやりたい処理を下記に置きます。 あるINDEX画面で、A登録、B登録、C登録画面を選択します。 画面遷移のリンクは、<global-forwards>のpathでパラメタ(.do?action=AAA) で指定し、<action-mapping>で画面の遷移先を指定しています。 INDEX画面からどの画面を選択しても、検索画面を表示します。 検索画面で何を検索するのかを指定します。 検索画面には検索ボタンがあり、ボタンをクリックすると Oracleからデータを取得し、 INDEX画面で選択した画面に遷移します。(.do?action=AAA)等のパラメタで どの画面にすべきは検索ボタンを押された時には把握しています。 検索用は、各画面で共通に使うため検索用の BeanFormを作成しました。 また、その他の画面(A,B,C)もそれぞれのBeanFormを作成しました。 (データ数が多く,Configファイルのbeanformのpropertyが多く見づらいため、 分割し、かつBeanFormも分割しました。) ここで問題があり悩んでいます。 検索画面を押された時に検索画面用のActionFormに紐づいている 検索用BeanFormから、A画面用BeanFormに切り替えたいのですが、 うまくいかない。 検索用Actionで、A画面用BeanFormのpropertyに値を入れたいのですが (遷移先がA画面の時)、入れる方法が分かりません。 | ||||
|
投稿日時: 2004-06-15 20:33
↑
ご教授、宜しくお願いします。 | ||||
|
投稿日時: 2004-06-16 05:57
正しいやり方かたかどうかは知りませんが私がやっていたやり方を書いておきます。
1.Form名でSessionからFormを取得します。 1.1.もし存在しないのであればActionServletからActionFormの設定を取得し自力でActionFormをインスタンス化しセッションに格納します。 2.インスタンスを返します。 3.このインスタンスに対して操作をします。 4.リダイレクトします。 [ メッセージ編集済み 編集者: Anthyhime 編集日時 2004-06-16 06:03 ] | ||||
|
投稿日時: 2004-06-16 11:07
早速の返信ありがとうございます。 初心者なため、内容が理解できません。ごめんなさい。 申し訳ありませんが、サンプルコード等で教えてもらえないでしょうか? 特に1と2をお願いします。 | ||||
|
投稿日時: 2004-06-16 21:47
検索画面が1つなのか3つなのかちょっと分かりかねますが、本来の ActionFormの使い方からかけ離れていると思います。 間にActionをもう1つ挟んだらどうでしょう? | ||||
|
投稿日時: 2004-06-17 06:06
ActionForm form = session.getAttribute(formName);
if (form == null) { ActionFormBean actionFormBean = actionServlet.findFormBean(formName); if (actionFormBean == null) { throw new IllegalArgumentException(); } form = (ActionForm) Class.forName(actionFormBean.getType()).newInstance(); form.setServlet(actionServlet); session.setAttribute(formName, form); } return form; | ||||
|
投稿日時: 2004-06-17 06:08
ちなみに適当に思い出して書いたコードなのでコンパイルしていません。
エラーがあるところは適当に直してください。 | ||||
|
投稿日時: 2004-06-17 20:29
レスありがとうございます。
いろいろ調べて、検索用画面→検索用アクション→遷移先画面→遷移先アクション から、 検索用画面→検索用アクション→ /* 検索用BeanForm */ (path="xxx.do"でリンク)→ 遷移先アクション→遷移先画面→遷移先アクション /* 遷移先BeanForm */ とし、アクションを間に入れました。 前アクション→JSPファイル→後アクションのような形が正しい?と思ってやってみましたが…。 aa)さん、検索画面は1つです。複数ある遷移先画面は、一度検索画面を通過する仕様を考えています。 検索画面で入力されたデータを遷移先の(前)アクションで、使用したかったのです。 Anthyhime)さん、親切にコードも書いて頂いたのですが、ActionServletを解せる知識がありません。真似て書いたのですが、現状のStruts1.1ではサポートされていないようでした…!? いろいろ調べた所、BeanUtilsが使えるかなと思って試行錯誤を繰り返していました。 javax.servlet.ServletException: No bean specified たるエラーが表示されてしまい。止まってしまった次第です。 下記にソースと設定の一部を置きますので、ご教授下さい。 検索用(後)アクション // JSPからデータを取得 strData = (String)request.getParameter("data") ; DynaValidatorForm DynaSearch = (DynaValidatorForm)request.getAttribute("CommonSearchForm"); // BeanUtilsにデータをセット!? BeanUtils.setProperty(DynaSearch, "data", strData) ; 遷移先(前)アクション DynaValidatorForm DynaSearch = (DynaValidatorForm)request.getAttribute("CommonSearchForm"); Object objAction = BeanUtils.getProperty(DynaSearch, "data") ; strData = objAction.toString() ; struts-config.xml <form-beans> <form-bean name="CommonSearchForm" ...> <form-property name="data" type="java.lang.String" /> </form-bean> </form-beans> <action-mappings> <action name="CommonSearchForm" path="/CommonSearchResult" type="common.action.CommonSearchResultAction" validate="false"> <forward name="Senisaki01" path="/Senisaki01.do" /> </action> </action-mappings> struts-config-senisaki01.xml (米 分割しました。) <form-beans> <form-bean name="SeniSaki01Form" type="org.apache.struts.validator.DynaValidatorForm"> </form-bean> </form-beans> <action-mappings> <action name="SeniSaki01Form" path="/Senisaki01" type="xxxx.action.SeniSaki01Action" validate="false"> <forward name="success" path="/Senisaki01.jsp" /> </action> </action-mappings> エラーメッセージの一部を下記に置きます。 at org.apache.struts.action.RequestProcessor.processException(RequestProcessor.java:545) at org.apache.struts.action.RequestProcessor.processActionPerform(RequestProcessor.java:486) at org.apache.struts.action.RequestProcessor.process(RequestProcessor.java:274) at org.apache.struts.action.ActionServlet.process(ActionServlet.java:1482) at org.apache.struts.action.ActionServlet.doPost(ActionServlet.java:525) at javax.servlet.http.HttpServlet.service(HttpServlet.java:760) at javax.servlet.http.HttpServlet.service(HttpServlet.java:853) at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:247) at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:193) at org.apache.catalina.core.StandardWrapperValve.invoke 宜しくお願いします。 | ||||
1
