フレームワークStrutsをいじくり倒す人の為のスレ
■ このスレッドは過去ログ倉庫に格納されています
0001nobodyさん
03/04/28 08:14ID:Ub0n1fGRhttp://www.ingrid.org/jajakarta/struts/
http://jakarta.apache.org/struts/
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オブジェクトを返します。
何かわかるかたがいたらご教授願います。
0750745
05/01/12 08:36:26ID:e5ml505Bレスどうもありがとうございます。
List01は同じsession内でiterateを使えているArrayListオブジェクトです。
iterate自体ではscope属性でsetAttributeされたList01を探すことは可能なんですよね?
0752nobodyさん
05/01/12 20:37:20ID:???つーか、
>getList01()は、pkg.MyClassオブジェクトを格納するArrayListオブジェクトを返します。
メソッドを持つList01が、なぜArrayListなんだ?
そもそも自分で作ったクラスなんじゃないの?
0753745
05/01/13 08:54:27ID:???返信ありがとうございます。以下のようなクラスです。
//MyClassオブジェクトを格納しているArrayListオブジェクトを返り値とするgetList01()を持つクラス
public ReturnIterateObjClass{
private ArrayList list01 = new ArrayList();
public ReturnIterateClass(){}
public ArrayList getList01(){
ArrayList list = new ArrayList();
MyClass obj1 = new MyClass();
MyClass obj2 = new MyClass();
list.add(obj1);
list.add(obj2);
return list;
}
}
で、正しいやり方なのかはわかりませんが、次のレスの方法で先程やっと解決しました。
0754745
05/01/13 08:55:24ID:???//JSP
<logic:iterate id="id" name="List" property="list01">
//Action
HttpSession session = HttpServletRequest.getSession();
ReturnIterateObjClass r = new ReturnIterateObjClass();
session.setAttribute("List",r);
+++ 上手くいったやり方 +++++++++++++++++++++++++++++++++++++++
//JSP
<logic:iterate id="id" name="List">
//Action
HttpSession session = HttpServletRequest.getSession();
ReturnIterateObjClass r = new ReturnIterateObjClass();
if (session.getAttribute("List01") == null){
session.setAttribute("List",r.getList01());
}
>749さんの言うとおり、「ダメだったやり方」で、getAttribute("List01").getClass()の結果を見たらArrayListなんかではなく、ReturnIterateObjClassでした。
みなさんのおかげで何とかまた一つ解決できました。ほんとにありがとうございました。また進めて行ってみます。
0755nobodyさん
05/01/23 20:12:30ID:qsfjePjF教えてください。
DispatchActionを基本クラスとして継承クラスを作成した場合
URI parameter属性に呼び出されるメソッドの名称を格納して
callする事ができると聞きました。
parameter="method"で、URLパラメータがmethod=deleteと指定した場合
deleteという名のメソッドが実行される。みたいに。
で継承クラスにexecute()をオーバーライドした場合
delete()とexecute()とどちらもcallされるのでしょうか?
どちらが先にcallされるのでしょうか?
0756nobodyさん
05/01/23 20:49:39ID:???ソースコード見れ。ソースコードは公開されているのだから。
ソースを見れば一目瞭然なのだが、
execute()をオーバーライドすると肝心の振り分け処理を
上書きしてしまうことになり、execute()の中でスーパークラスの
execute()を明示的に呼ばない限り、delete()は呼ばれない。
0757nobodyさん
05/01/23 20:56:33ID:???ソースを見て調べるようにしますが回答頂き成る程ガッテンつきました!
ありがとうございました。
0758nobodyさん
05/01/23 22:20:33ID:???0759nobodyさん
05/01/24 21:06:26ID:???0760nobodyさん
05/01/24 23:27:37ID:???脱初心者必見という感じ。
0761nobodyさん
05/01/26 02:19:46ID:???0762nobodyさん
05/01/26 09:14:22ID:???0763nobodyさん
05/01/26 22:21:30ID:???0764nobodyさん
05/01/26 22:47:52ID:???0765nobodyさん
05/01/27 02:48:16ID:???0766nobodyさん
05/01/27 08:31:49ID:???http://pc5.2ch.net/test/read.cgi/tech/1094954163/
0767nobodyさん
05/02/18 01:43:01ID:crwium7JCactusStrutsTestCsaeをやってるんですが、
VerifyFowardでmappingできないって怒られます・・・
ちゃんとstruts-configのパスはあるんですが・・・
あと、eclipseのデバッグで
perform先にブレークポイントしても止まらないのです・・・
actionが呼び出されてないのでしょうか?
こういうものでしょうか?
初心者なのでさっぱりわかりません・・・
よろしくです・・・
0768nobodyさん
05/02/18 07:50:07ID:???質問の要点を整理して出直せ。
> 初心者なのでさっぱりわかりません・・・
あなたは質問の初心者みたいなので、こちらもあなたの状況がさっぱりわかりません・・・
0769767
05/02/18 10:27:57ID:T6/5M4uYverifyForward("success");
の箇所で、Junitで
「Was expecting '(コンテキストルート)/WEB-INF/XXX.jsp' but it appears the Action has
tried to return an ActionForward that is not mapped correctly」
とエラーが出るのです。
ちゃんとパスもあっていて、ファイルも存在しているのです。。
sturts-config.xmlは
<action path="/test/login"
type="xxxx.xxxx.xxx.loginAction"
name="login"
scope="request"
validate="true" >
<forward name="success" path="/WEB-INF/XXX.jsp" />
<forward name="failed" path="/XXX.jsp" />
</action>
こんな感じです。
CactusStrutsTestCaseって、サーバー側にテストClassファイルを置かないと
ダメなんでしょうか?
AntでJunitを実行するのですが、クライアント側だけで実行できないんですかね・・?
ClassファイルもBuild.xmlもサーバー側でやらないと上手くできません。
クライアントから出来るって話を聞いたんですが・・・
ブレークポイントの件はもうちょい調べてみます。
すみません、、お願いしますです。。。
0770767
05/02/18 22:18:34ID:CZcitnmHすんません。解決しました。
executeをオーバーライドしてませんでした
というか、Actionクラスを継承して
独自のXXXexecuteを使ってるのが原因でした
これからすべてのActionクラスにexecuteを書いてsuperするのかと思うと・・・
お騒がせしましたー
0772770
05/02/18 23:51:28ID:KEaw0I+vexecute→XXXexecuteとうまくマッピングできていて
明示的にオーバーライドする必要がなかったんです。
(代わりにXXXexecuteをオーバーライドする必要)
でもTestCaseのactionPerform()では
そこまで参照されず、executeを呼び出していたので
Actionができなかったのが原因です
Testのために、全部に明示的にexecuteを書くのが億劫で・・・
0773nobodyさん
05/02/21 15:43:15ID:sN6ntzqc0774nobodyさん
05/02/21 15:56:45ID:???0775nobodyさん
05/02/21 17:25:49ID:beK1sFFtvalidator.xmlで「全てのフィールドが未入力」だった場合に限りエラーを返したいのですが、
validator.xmlにはどのように記述すれば良いのですか?
↓これでできたら嬉しかったんですが。
<formset>
<form name="SampleForm">
<field property="field1,field2,field3" depends="required">
<msg name="required" key="error.全部未入力"/>
</field>
</form>
</formset>
0776nobodyさん
05/02/21 17:31:22ID:???0777775
05/02/21 17:55:04ID:beK1sFFtすいません。
0778nobodyさん
05/02/21 21:56:41ID:???この場合、ActionFormの方でチェックかける方がのぞましいと思うけど。
0779nobodyさん
05/02/21 23:06:46ID:???部署を選ぶと選択可能な役職が出てくる、そんなページを作っているんですが、
役職名が取得できなくて困っています。
詳しくはかけないのですが、以下のようなオブジェクトを作りました。
class form{
List postList;
}
class post{
String id;
String postName;
List jobTree;
}
class job{
String id;
String jobName;
}
部署名などはpostクラスに、役職名などをjobクラスに保存。
postListに複数のpostを格納、さらにpostのjobTreeに複数のjobを格納しています。
(セッターゲッターはあると思ってください。)
一応<html:optionsCollection>を使って、部署名を取得、表示はできたのですが、
役職名を取得する方法がわかりませんでした。何か良い方法は無いでしょうか?
ちなみに、部署名を変更させた際、役職も変化させる予定です。
0780nobodyさん
05/02/22 00:51:47ID:???お前は動的にコソボボックスの中身を変化させたいのかと?
0781nobodyさん
05/02/22 01:16:25ID:???0782775
05/02/22 08:33:55ID:rep4z0ferequiredifでいけるかなあと思ったんですけど、やっぱり無理な気がしてしまい、質問させていただきました。
おっしゃられるとおりActionForm側で行うことにします。
ちょっと聞きたいのですけど、小規模(フォームのページ数が10ページ程度)なアプリケーションの場合、
フォーム検証処理を別ファイルであるvalidation.xmlで行うよりも
ActionFormで行うほうがわかりやすいような気がしたのですが、皆さんはどう思いますか?
柔軟さの面や保守性の部分の視点等、みなさんの意見が聞いてみたいです。
0783nobodyさん
05/02/22 11:48:17ID:???それでもValidator使った方がいいよ。保守性・再利用性が高い。
requiredifがダメなら、ルールを自作しろ。
ちなみに、Struts1.2.xではrequiredifは非推奨だ。
0784nobodyさん
05/02/22 11:55:22ID:???>ちなみに、Struts1.2.xではrequiredifは非推奨だ。
おや、初耳
良ければなんで非推奨なのか教えてくり
0786nobodyさん
05/02/22 13:38:13ID:???こんなページもあるでよ。
ttp://kamakura.cool.ne.jp/oppama/ssja/struts-complex-validation.html
0787nobodyさん
05/02/24 04:18:25ID:???の引数に inputForm, outputForm が無いのはおかしいと思いませんか?
execute( ActionMapping mapping, ActionForm inputForm, ActionForm outputForm, HttpServletRequest req, HttpServletResponse res)
みたいに。
じゃねーと、A.jsp ⇒ Action ⇒ B.jsp という画面遷移があった場合、
AとBの入力or出力項目って同じじゃねーと違和感でるよな?
0788nobodyさん
05/02/24 05:23:12ID:???出力オブジェクトをわざわざActionFormのサブクラスに限定する必要性がない。
Strutsは入力の処理だけしてくれればいい。
0789nobodyさん
05/02/24 07:06:13ID:???それだとさ、JSP(V)とAction(CもしくはM)が依存しちゃうってことにならない?
0791nobodyさん
05/02/24 07:22:52ID:qkldD1gKみんな出力用オブジェクトはどうしてるの?
あ、テキストボックスに出力して、そのまま次の画面の入力項目にもなるようなやつね。
0792nobodyさん
05/02/24 07:24:41ID:???0793nobodyさん
05/02/24 07:29:55ID:???入会登録なんかは、入力画面⇒確認画面⇒保存ロジック
まで、同じ form が使えるってのはたやすく理解できる。
しかしだな、Aで選択した条件で 次にでてくる画面が切り替わるっていうのはよくあることじゃない?
0794nobodyさん
05/02/24 08:05:12ID:???出力用のオブジェクトがActionFormのサブクラスである必要もないし
execute()の引数に入っていなければならない必然性も感じない。
0796nobodyさん
05/02/24 08:57:40ID:???0797nobodyさん
05/02/24 10:04:16ID:???内部処理によって違うFormを持つページに飛ばすときはどうすんだ?
0798787
05/02/24 13:57:13ID:qkldD1gKすまん、漏れが悪かった。
特に>797はスマンかったとしか言いようがない。痛すぎ。
ActionFormは入力用に使えという教えには従うとして、じゃ、出力時はどうすればよいのか?
>797を踏まえて教えてくれ。
例)
複数ページに振り分けるActionで、振り分け先のページで表示するコンボボックスの内容(マスタ)が動的に変わる場合、
2ch的にマスタやその他のデータ類はどうやってそのページへ渡すべきなのか?
# やっぱりHttpServletRequestに引っ付けるべき??
0800nobodyさん
05/02/24 21:11:37ID:???俺もそう思う。
ひょっとしてrequest.setAttributeを1回しかしてはいけないとかいう社内ルールでもあるの?
0801nobodyさん
05/02/24 21:50:49ID:???ただrequestスコープに入ってればそのままjspで参照できるよね、という話・・・だよね?
俺も最初このことになかなか気付かなくて混乱してた。
0802nobodyさん
05/02/24 23:00:38ID:???そうそう。そういう意味です。
普通はそうしないんだ・・・
でも次のページで、違うActionにSubmitする場合、
表示時の名前と送信するための名前が違うってことにならない?
0803nobodyさん
05/02/24 23:18:24ID:???入力を受け取るためのActionFormは当然あって、表示用の方(前のページの入力)のActionFormrequest#getAttributeでアクセスすればいいんじゃね?
0804nobodyさん
05/02/24 23:25:44ID:???え、なにそれ?
前のページでRequestに引っ付けたobjectって、後のページ(Action)で、getAttributeで取れるの?
0805nobodyさん
05/02/24 23:40:30ID:???AというページとBというページがあって、Aで入力した結果を基にBを表示し、またBにも入力フォームがある、というようなケースじゃないの?
というか、そういう前提の話だった。
0806nobodyさん
05/02/24 23:42:33ID:???かつ Form の単位は画面ではなく 1 機能にしろ。
でスコープは session。これ最強。
明示的に request.setAttribute なんかダサいことすんな。
これを基本として、設計が美しくできるなら、画面単位に
分けれるとこは分けて request スコープにしたり、
動的コンボなどを session の属性にセットしたりすればいい。
0807nobodyさん
05/02/24 23:46:22ID:qkldD1gKそうそう。そのとおり。
でも、AとBの入力フィールドは全く違う構成なわけ。
そこでgetAttirbuteが使えると、俺はカナリ楽になるはず。ってことで、今試してみてる。
はぁ・・完全弐徹目だ。
今まで簡単なパターンでしかStruts使ってなかったから、今回ちょっと苦戦中・・
しかも某社のフレームワーク(Strutsラッパ)とやらのせいで息苦しい・・。
動く状態までは作ったんだけど、どうもメンテとかMVCとか今後のことを意識すると
自然と何度も設計しなおしてるし・・org
まぁ単純に自分の技術不足と調査不足のせいだと分かってるから、すげー腹が立つ・・
0808807
05/02/24 23:49:04ID:???で、しかも属性は全てStringにしろとか言うんだろ?
0810nobodyさん
05/02/24 23:53:43ID:???あー、そうだな。WebSphere、Weblogic、Tomcat 上で
様々な Struts 劣化ラッパを使って開発してきたが、
そのほうが入力チェックとか考えると楽だろ。
何百画面とかあると、俺的にはそのほうが管理が楽だ。
0813nobodyさん
05/02/24 23:59:28ID:???1.画面Aでsubmit
2.Action Aが起動して中で色々処理
3.Action Aでsuccessを返す
4.画面Bを表示
4で2の部分のActionFormは当然見える。
0814nobodyさん
05/02/25 00:09:20ID:???>810
>811
そもそも画面用のActionFormと、ほぼ同じ内容になると思われるエンティティを二つ準備するのは無駄かなと俺は思う。
チェックの問題ってIntegerとかの話か?nullにならないとか。
AbstractActionFormみたいな抽象クラスで ConverterUtil を呼んで何とかしてる。
逆に聞きたいが、何十もネストしたテーブルを作ることがあるかと思うが、その場合はそれ用のAF(StringばかりのAF)をずらーっと作るわけ?
>812
当然そうなんだが、どうもしっくり来ない。
詳しくは面倒なんで説明せんが、とりあえず微妙なんだw
0815nobodyさん
05/02/25 00:17:00ID:???ネスト?
関連が強いなら当然、インナークラスだろ。
メンテナンス性が低下しないならインナークラスの多段ネストでもいい。
再利用性があるなら、普通の外だしクラス。POJO。
Form はそのコレクションの単純なアクセッサ、入力可能なら
int 引数付き getter も用意。
0816nobodyさん
05/02/25 00:19:38ID:???それは理解できる。
今回は、
5.画面Bでsubmit
6.Action Bが起動
って流れなわけ。
で、1で送信したActionFormと、5で送信したいActionFormの内容が違う場合なんだよな。
そしたら画面BのJSPってなんかおかしいことにならない?
1のAFも表示したいけど、5のAFも送信したいわけ。
0817nobodyさん
05/02/25 00:21:59ID:???>普通の外だしクラス
ってのはStringだけのAFのことよな?
Formについては理解してる。OKOK。
それで入力受けた後、エンティティに値を放り込むわけよな?
そこは自作のコピーユーティリティ?
0818nobodyさん
05/02/25 00:23:38ID:???だから、そういう画面だったら1Form だろ。
全然違う機能だったら、Action で別 Form を new するなり、
BeanUtils なり手動なりでコピーしれ。
・・・眠いから寝る。
0820nobodyさん
05/02/25 01:15:26ID:zGPxgdzBまぁ当然できるわけ無かった。
req.getAttirbuteは、当然そのリクエスト範囲でしか有効ではない。
前のActionのリクエストなんか見れるわけ無いからね。
sessionなら多分いけると思う。
が、sessionはできるだけ使わないようにせんとね。だから却下
>818
最後は俺がしつこいから少々面倒だったと思うが、勉強になった。ありがとう。
俺はやっぱりAFとエンティティの二つを作るのは嫌だからAF=エンティティなノリで行くわ。
0821nobodyさん
05/02/25 03:52:21ID:bTaebwTj0822nobodyさん
05/02/25 09:16:27ID:???0823nobodyさん
05/02/25 12:37:03ID:???項目数が変わる程度の固定フォームの入力結果を、Javaのオブジェクトにまとめてくれるだけのライブラリだよ。
ActionFormを表示で使いまわすのは、まぁ好きにやってくれと。
0824nobodyさん
05/02/25 13:06:51ID:zGPxgdzB動的に項目数が変わる複雑っぽいフォームはやっぱり面倒かな?
0825820
05/02/25 22:46:08ID:???ActionForm の属性が String なんてどうでも良い。
問題は ActionForm の中のネストした部分が、ActionFormであるかどうかだ!
エンティティそのまんま引っ付けたら reset, validate も呼べない(使えない)んだよな
つくづくあふぉだなぁと思った
すまんみんな。
つか、俺の作業報告書みたいになって巣マソ
0826nobodyさん
05/02/25 22:53:26ID:???0827nobodyさん
05/02/25 23:01:01ID:???つかえるけど?
0828nobodyさん
05/02/25 23:06:19ID:???0829nobodyさん
05/02/25 23:23:03ID:???Struts in Actionに、「なぜActionFormはインターフェイスじゃないのか」みたいなこじつけとしか思えない理由が書いてあった。
0831nobodyさん
05/02/26 00:58:37ID:???設計ミスとしか思えない
0832nobodyさん
05/02/26 02:15:39ID:vpZ2inME普通の ValidatorForm で JavaScript のチェックをかけることはできる。
ValidatorFormのListの中に入れたクラスに対して JavaScript でのチェックがかけれないんだけど、
これってどうしようもないんかなぁ?
■ このスレッドは過去ログ倉庫に格納されています