フレームワークStrutsをいじくり倒す人の為のスレ
■ このスレッドは過去ログ倉庫に格納されています
0001nobodyさん
03/04/28 08:14ID:Ub0n1fGRhttp://www.ingrid.org/jajakarta/struts/
http://jakarta.apache.org/struts/
0649nobodyさん
04/11/10 14:33:28ID:qbk8LNSWよろしかったらもうすこし具体的にやり方を
教えてもらえないでしょうか。
今同じような事をやってつまっております。
0650nobodyさん
04/11/10 23:25:11ID:???やり方は2種類。
前提として、BeanにString id、String nameっていうフィールドがあるとして。
1. フィールドの配列で受ける。
<logic:iterate id="bean" 略>
<html:text name="bean" property="id"/>
<html:text name="bean" property="name"/>
</logic:iterate>
こういうJSPを書いて、この値が入るActionFormのフィールドに
String[] id と String[] name、およびそれぞれのアクセサメソッドを
用意しておけば、上から順番に値が格納される。
2. Beanの配列で受ける
<logic:iterate id="bean" 略>
<html:text name="bean" property="id"indexed="true"/>
<html:text name="bean" property="name"indexed="true"/>
</logic:iterate>
こう書いておいて、ActionFormにBeanの配列(もしくはList)と、
setBean(int index) を用意しておけば、Beanの配列として値が入る。
0651nobodyさん
04/11/11 05:13:30ID:hiuJkdtgstrutsのViewの部分をVelocityで実装してみるのは
有効なんですかね?
0652nobodyさん
04/11/11 05:23:51ID:???JSPとVelocityの違いは、XMLタグで制御構造を書くかそうではないかだけかと。
オーサリングツールが使いにくいとかブラウザでのプレビューがやりにくいとかじゃなければ、JSPの方がいいと思われ。
タグファイルとか考えると、JSPの方が便利だし。
0653649
04/11/12 14:00:22ID:???やり方としてはデータ用に作成したbeanの中に
indexを持たせてsubmit時にindexの値の配列を取得して
その他フィールドの値をindexをキーにして取得しています。
他にいい方法があれば教えてください。
やりたいことは、下記の通りです。
検索条件に従ってデータベース検索して結果を一覧表示する。
この際、各行にチェックボックスを作成する。
submit時にチェックボックスにチェックが入ったデータのみを
対象にある処理を行なう。
0654nobodyさん
04/11/23 00:13:58ID:???{0} が含まれている場合に
その {0} を入力された文字列に置き換える方法はないでしょうか?
たとえば、「入力された値は {0} ですが、その値は無効です。」とかいう
メッセージを表示したいのです。
書籍や Web サイトなどでは、固定文字列に置き換える方法ばかりしか見かけないので・・・。
0655nobodyさん
04/11/23 03:25:21ID:???試してないし君のValidatorのコードもわからないので適当書く。
たぶんActionErrors(ActionMessages)に
ActionError(ActionMessage)を追加してるところがあるとおもうけど、
後者は特にResources.getActionError()で取得する必要はなくて
ActionError(ActionMessage)でさえあればいい。
0657nobodyさん
04/11/23 11:22:18ID:???0658654
04/11/23 15:55:19ID:???それでは不可能、ということなんですね。
ありがとうございます。
0659nobodyさん
04/11/27 21:22:47ID:???ActionForm の代わりにPOJOを用いる方法を書いてるが、
こっちのスレの住人は使ってるのかな?
0660nobodyさん
04/11/29 21:50:18ID:???保守する身にもなってくれ。
0661nobodyさん
04/12/01 00:29:13ID:???0662nobodyさん
04/12/01 02:32:32ID:???0664nobodyさん
04/12/01 02:46:08ID:???DynaValidatorActionだといいの?
>>663
△△さらにStrutsの良さを教えて下さいSession3
http://pc5.2ch.net/test/read.cgi/tech/1088870989/
0668nobodyさん
04/12/02 12:22:43ID:???フィールド定義して、右クリックしてツールにセッターゲッター生成してもらって、XDocletタグを書くだけ。
あまりめんどくさくない。
0669nobodyさん
04/12/02 20:36:12ID:???いろいろそれ用の設定も必要だし
前準備だけでめんどくさいです
0670nobodyさん
04/12/02 20:47:10ID:???それなら、Struts使う必要もあまりなさそうだけど。
0672nobodyさん
04/12/04 02:23:43ID:???0673nobodyさん
04/12/04 15:46:09ID:???できますか?
@struts.actionと@struts.action-forwardを一つのクラスに複数個書いてみたら、
actionが複数できることは確認できたのですが、action-forwardが両方のactionの中に
入ってしまい、期待した動作はしませんでした。
みなさん、こういう場合ってどうしてますか?
それとも、一つのアクションクラスを使い回すってのがマズいんでしょうか?
0674nobodyさん
04/12/04 19:54:03ID:???マスタメンテとか一覧とか、共通のActionを使うことは多いと思う。
その場合は手書きになるね。
基本的にXDocletはシングルトンなクラスとValueObjectにしか適用できない気がする。
0675nobodyさん
04/12/11 02:21:47ID:???ビジネスロジックだけ分離させてそれを各アクションで呼べばいいだけだろ?
もしかしてActionクラスに処理べた書きか?
おまえらStrutsのこと全然わかってなさすぎ
@ITの山田と同レベルだな
0677nobodyさん
04/12/11 14:35:35ID:???ひょっとしてアクションクラスはクラスはModelだと思ってるの?
そうじゃなきゃそんな発言しないよね。
Controllerだと知ってたらそんな発言しないよね。
0678nobodyさん
04/12/11 20:35:55ID:???0679673
04/12/12 01:17:05ID:???今回は結局struts-actions.xmlでマージすることになったんですが、やはりアクションの使い回しはしないものなのでしょうか。
サーバサイドは初めてで、最近サーバサイドでのMVCの定義とクライアントでのMVC(というよりもプラットホーム準拠の作法)との差を感じることが多いです。
ロジックはModelに入るものということなのでしょうか。
僕の認識だと
M: データ構造
V: プレゼンテーション
C: データ操作のロジック
なので、同じロジックを複数の場所から実行して、別の結果ページに遷移したい時にはアクションを使いまわすべきか、と思って上の質問に至ったわけなんですが...
ちなみに、再利用性には気を配っているつもりですが、基本的にアクションクラスに処理べた書きです。
こういうことってStrutsやWebアプリの作法に反するっていうことなんですかね?
0680nobodyさん
04/12/12 01:46:09ID:???君の認識はどうでもいいからさ、ひとかけらでも疑問を持ったならちゃんと調べてくれよ。
ttp://e-words.jp/w/MVC.html
メインの処理はModelに実装し、Modelは画面出力などは行なわない。処理結果はViewに渡され、画面表示などが行なわれる。ユーザからの入力はControllerが受け取り、何らかの処理が必要な場合はModelに依頼し、出力が必要な場合はViewに依頼する。
知らない用語を自分用に解釈して使うことに何で疑問を持たないのかね。
0681nobodyさん
04/12/12 01:50:11ID:???0682nobodyさん
04/12/12 01:57:59ID:???Strutsは「MVC」の「C」だけを受け持つフレームワークだ。
それ以外のことはサポートしてくれない。
基本的にはViewもModelも自力で何とかする必要がある。
ここまで書けばわかるだろ?
0683nobodyさん
04/12/12 02:48:56ID:???> ちなみに、再利用性には気を配っているつもりですが、基本的にアクションクラスに処理べた書きです。
アクションクラスにロジックを書いてはいけない理由はないし、それはアプリケーションの規模や性質によるから一概にいえるものではない。
MVCという分け方があるとしても、CにMを併用するモデルを採用しようが、それは設計者の自由。
別のクラスにしないといけない理由はない。
メンテナンス性などを考えて最適であると判断できるならどうでもいい。
っていうか、処理するテーブルと入力フォームだけが違う場合にActionを共通化するようなことは普通にある。
0684nobodyさん
04/12/12 03:13:43ID:???アクションクラスにべた書きの時点で、再利用性には気を配っていないと言える。
そもそも、基本的にControllerは受け渡しのみを行ういわば使い捨てであり、それを再利用しようとする方が間違い。
あくまでも処理はModelで行う。
>MVCという分け方があるとしても、CにMを併用するモデルを採用しようが、それは設計者の自由。
これはMVCではない。MVCを無視して
「Strutsを使ってとにかくアプリケーションを作る」ことに専念するつもりなら当然何をやろうが自由だが
MVCを意識する以上は間違い。
>っていうか、処理するテーブルと入力フォームだけが違う場合にActionを共通化するようなことは普通にある。
自分の周りが全て正しいのか?
何も考えず周りに流されてるだけで、ちゃんとStrutsやMVCモデルについて勉強してない証拠だな。
それは単なるローカルルールだ。
要するにおまえは井の中の蛙だ。
0685nobodyさん
04/12/12 03:22:46ID:???自分だけうまい具合に自動生成できない時点で
「俺のプログラムはどこかアブノーマルな部分があるのかな」
とか気にしたんだろ?
それで>>673に書いたんだろ?
で、それに対する答えが「確かに君のやり方はアブノーマルな部分があるよ」だったわけだよ。
質問に対する回答を貰っておいて、それでもなぜ納得しないんだ?
0686nobodyさん
04/12/12 04:16:09ID:???htp://struts.apache.org/userGuide/building_controller.html#action_design_guide
って、上でも出てるし。
同じようなやりとりが定期的に出ている証拠だな
0687nobodyさん
04/12/12 04:46:15ID:???継承してちょっとした変更するより、同じクラスでパラメータによってちょっと動きを変えるほうがいいと思うが。
Actionなんて、再利用できるなら再利用した方がいいとおもうのだが。
> 要するにおまえは井の中の蛙だ。
自分がどんな井戸の中にいるのか把握してないみたい。
0690nobodyさん
04/12/12 11:19:21ID:???0691nobodyさん
04/12/12 11:37:13ID:???っていうか、別にActionにロジックを書いても当然動くけど、
(実際、ビジネスロジックと分離するかしないかの違いだし)
そういった使い方をするなら>>684にあるとおりMVCを持ち出すべきではないよね。
「CにMを併用するモデル」が既にMVCじゃないんだから。
入力パラメータが同じなのでActionFormを使い回したい、みたいな事はあるけどね。
>>687
どこから継承なんて言葉が出てきたんだ?
意味がわからん。
おまえの頭の中ではどんな作りになっているんだ?
0692nobodyさん
04/12/12 12:04:37ID:???0693nobodyさん
04/12/12 12:37:56ID:???MVCモデルは、意識して厳密にやろうとしないと>683のようにすぐに
曖昧になって混ざってしまいがちだから、頑固とは違う。
少なくとも>684の書いていることはまともだし、
>「Strutsを使ってとにかくアプリケーションを作る」ことに専念するつもりなら当然何をやろうが自由」
とあるとおり、「絶対にActionにロジックを書くな」と書いているわけでもない。
単にMVCモデルには則してないと書いているだけ。
こういうのは頭でっかちで頑固、とは言わないよ。
あと「基礎は知っていた上で多少は融通が利く」というより単なる「妥協」だね、この場合。
0694nobodyさん
04/12/12 16:26:36ID:???0695nobodyさん
04/12/12 16:31:33ID:???XDocletは基本的にシングルトンなクラスにしか便利に使えないし。
XDocletでうまく対応できないからといって、Struts側の設計としておかしいと考えるのは筋違い。
0697nobodyさん
04/12/12 16:59:50ID:???あの議論はいったい何だったんだという感じ。
せっかく記事を版管理無しでこっそり修正したのに
意味無かったね山田さん
0700nobodyさん
04/12/12 17:28:19ID:???M=ActionForm
V=JSP
C=Action
のことじゃなかったの?
0701nobodyさん
04/12/12 18:06:07ID:???MVCっていっても、Vの中にもMVC、Cの中にもMVC。
見る尺度によって、どこのレベルでもMVC.
0702nobodyさん
04/12/12 19:08:08ID:???0703nobodyさん
04/12/15 18:26:48ID:6uCmJkm40704nobodyさん
04/12/15 22:19:35ID:???0705nobodyさん
04/12/16 03:26:11ID:???0706nobodyさん
04/12/16 03:31:34ID:???意味不明だ。
使いまわせるActionなんて、いくらでも使いまわせばいいのに。
0707704
04/12/16 21:37:33ID:???0708nobodyさん
04/12/16 21:42:11ID:???V:Webサーバ(apache)
C:アプリケーションサーバ(tomcat)
0709nobodyさん
04/12/16 22:56:22ID:???0710nobodyさん
04/12/16 23:13:28ID:???V 株価
C システム
0711nobodyさん
04/12/17 05:39:15ID:???0712nobodyさん
04/12/17 07:43:36ID:???0713nobodyさん
04/12/17 09:36:34ID:???0714nobodyさん
04/12/20 08:48:06ID:scgdz6H2返答が無かったのでこちらのスレで質問させてください。
struts & jspで<logic:iterate>を使用するのに、以下のように<% 〜 %>スクリプトレットで取得する方法はできたのですが、
<% 〜 %>を使わないでstruts-config.xmlを利用して取得するにはどうせれば良いのでしょうか?
---jspコード---
<ul>
<%-- ↓これを埋め込みたく無い --%>
<% request.setAttribute("bean",new SampleBean()); %>
<logic:iterate id="seihin" name="bean" property="list">
<li><bean:write name="seihin" property="process"/></li>
</logic:iterate>
</ul>
--jspコードココまで---
---SampleBean.java---
public class SampleBean {
public java.util.List getList(){
java.util.List list = new java.util.LinkedList();
return(list);
}
}
---SampleBean.javaここまで---
0715nobodyさん
04/12/20 09:29:37ID:???> <% request.setAttribute("bean",new SampleBean()); %>
こんなのはActionでやる仕事。JSPに埋め込むな。
struts-config.xml も無関係だろ。
0717nobodyさん
04/12/20 10:55:34ID:scgdz6H2jspに、<logic:iterate id="seihin" name="bean" property="list">と書いたとすると、
struts-config.xmlからname(bean)を検索して、それに関連付けられたアクションを実行するのですよね?
0719nobodyさん
04/12/20 15:25:18ID:???0720nobodyさん
04/12/20 15:26:01ID:???0721nobodyさん
04/12/20 21:38:04ID:???struts-config.xmlではなく、
JSPでいうところのrequest, session, applicationから
beanという属性名のJavaBeanを取り出す。
したがって、Action(を継承したクラス)のexecuteメソッド内で
request.setAttribute("bean", new SampleBean())みたいな形で
JavaBeanをセットするのが普通。
0722nobodyさん
04/12/24 18:36:13ID:9UBZxQ+R最初にこのJSPにアクセスしたときは正常にページが作成されるのですが、
formのsubmitボタンを押してアクションを発生させ、フォームの内容に不備があったらまたこのページに戻ってくるようにさせると、
iterateのnameで指定されたbeanが見つからないと、怒られてしまいます。
なぜですか?分かる方がいたらご教授願います。
0723722
04/12/24 18:55:21ID:???setAttributeのやりかたが問題でした。
req.setAttribute("bean",配列);をコメントして、
session.setAttribute("bean",配列);にしたらできました。
public final class TestAction extends Action{
public ActionForward perform(ActionMapping mapping, ActionForm form, HttpServletRequest req, HttpServletResponse rew){
HttpSession session = req.getSession();
ActionErrors errors = new ActionErrors();
// req.setAttribute("bean",配列);
session.setAttribute("bean",配列);
return(mapping.findForward("success"));
}
}
0724nobodyさん
04/12/24 19:05:36ID:???0725722
04/12/24 20:00:14ID:9UBZxQ+Rすいません。performは使わないほうが良いのですか?
0727722
04/12/24 21:18:35ID:???教えていただきありがとうございます!
execute()にしました。
なんだか楽しくなってきました。
0728nobodyさん
04/12/27 19:06:18ID:EKbjNeu3それを<logic:iterate>で処理してるのですが、ブラウザで最初にアクセスしたときは正常に表示されますが、
2度目以降、以下のようなエラーが出てしまいます。
java.io.IOException: Unable to read entire block; 45 bytes read; expected 512 bytes
Excelファイルから512bytesずつ読めと言うことでしょうか?
0729nobodyさん
04/12/27 21:52:40ID:???0730nobodyさん
05/01/06 08:29:34ID:xG8ETHUh0731730
05/01/06 09:30:07ID:xG8ETHUh0733730
05/01/06 10:17:56ID:xG8ETHUh私もそれを疑ったのですが、Actionクラスのexecute()メソッドをオーバーライドしています。
execute(ActionMapping mapping, ActionForm form, HttpServletRequest request, HttpServletResponse response)
0734nobodyさん
05/01/06 10:52:18ID:???0735nobodyさん
05/01/06 10:56:55ID:???throws IOException, ServletException じゃなくて、
throws Exception になってる?
>>734
それもあるかもね。
0736730
05/01/06 11:14:03ID:xG8ETHUhthrows IOException, ServletExceptionと書いています。
しかし throws Exceptionでもやはり結果は一緒で真っ白なページでした。
struts.jarのバージョンは1.2.4を使っています。
public ActionForward execute(ActionMapping mapping, ActionForm form, HttpServletRequest req, HttpServletResponse rew) throws IOException, ServletException {
0737nobodyさん
05/01/06 12:20:50ID:???J2SE5で@Overrideつけてコンパイルするのが、一番確実だな。
0738730
05/01/06 13:12:23ID:xG8ETHUhActionクラスは継承してますし、Tomcatの再起動などやっているのですが、どうもうまくいきません。
初歩的な質問で大変申し訳ないのですが、perform()をexecute()にした際に
struts-config.xmlを書き換える必要はありますか?
0739nobodyさん
05/01/06 15:02:53ID:???<logic:iterate>で表示させることはできたのですが、
それらを今度はsubmitで送信し、受け取る場合にどれがチェックされてどれがチェックされてないかを調べて状態別の処理をしたいのですけど
これは大量にあるチェックボックスのsubmit結果を配列で受け取って処理すれば良いのですか?
一つ一つ書けばそれはそれで良いのですが、あまりに大量すぎて手に負えません・・・
0741nobodyさん
05/01/06 19:23:43ID:???大量のチェックボックスを一つの配列にまとめるには、それらを配列オブジェクトに一個一個addしていかなければダメですか?
例えば
a1〜a5の5つのチェックボックスにそれぞれgetter/setterを作って、用意しておいた配列オブジェクトoに
o.add(a1);
o.add(a2);
・・・といった風にするしかないのでしょうか?
0742nobodyさん
05/01/06 20:04:46ID:???配列型を戻すgetterと
配列型を引数に取るsetterを実装するんじゃダメ?
0743nobodyさん
05/01/06 22:57:40ID:???http://www.freeml.com/message/struts-user@freeml.com/0000047
Struts-MLの46から始まるスレに出てます。
多分、この47が一番聞きたい所に答えてると思うけど。
ところで、配列問題ってかなり頻繁に質問されているにも関わらず、
いま出てるStruts関連書籍には、index付きsetter/getterって
載ってないですよねぇ。なぜかしら。
0744nobodyさん
05/01/07 08:35:31ID:???どうもありがとうございます。
参考にしていじってみます。
0745nobodyさん
05/01/11 10:27:39ID:hbl7DHve対象の配列オブジェクトのスコープをsession内有効にしてもgetXXXメソッドが読まれてしまいます。
ActionForm内にgetList01()を準備して、
一度目のActionでこのgetList01()を使用して取得はできるのですが、
二度目以降、"List01"を使用する場合は一度目で生成したオブジェクトを使用したいです。
一度setAttribute("List01",)でList01に配列オブジェクトを関連付けて、
その後のActionではsetAttribute("List01",HttpSession.getAttribute("List01"))でOKかと思ったのですが・・・
iterateタグ使用時にscope属性はsessionにしてあるのですが、どうしてもgetList01が読まれてしまいます。
<logic:iterate id="item" name="List01" property="list01" scope="session" type="xClass">
初歩的な質問で申し訳ありませんが時間のある人が居ればご教授お願いします。
0746nobodyさん
05/01/11 10:50:11ID:kArneliyたとえば、今年の西暦と+1年の西暦。
<html:select property="year">
<html:option value=""></html:option>
<html:option value="2005">2005</html:option>
<html:option value="2006">2006</html:option>
</html:select>
<% %>の中でタグを書いても当然そのまま表示されてしまいます。
どうすればできますか?
0748745
05/01/11 19:38:41ID:hbl7DHve<logic:iterate id="checkItem" name="List01" property="list01" scope="session" type="pkg.MyClass">
ページAから遷移先ページBに遷移して、下記JSP記述ではオブジェクトは存在しているようです。(pkg.hoge@15e8aa5などのように表示される)
<bean:write name="List01" scope="session"/>
しかしこれを下記のように扱おうとすると、javax.servlet.ServletException: Cannot create iterator for this collectionになってしまいます。
<logic:iterate id="item" name="List01" scope="session">
getList01()は、pkg.MyClassオブジェクトを格納するArrayListオブジェクトを返します。
何かわかるかたがいたらご教授願います。
■ このスレッドは過去ログ倉庫に格納されています