トップページphp
982コメント329KB

フレームワークStrutsをいじくり倒す人の為のスレ

■ このスレッドは過去ログ倉庫に格納されています
0001nobodyさん03/04/28 08:14ID:Ub0n1fGR
 流行っているのか、流行っていないのか謎の Struts を語るスレです。
http://www.ingrid.org/jajakarta/struts/
http://jakarta.apache.org/struts/
0680nobodyさん04/12/12 01:46:09ID:???
>>679
君の認識はどうでもいいからさ、ひとかけらでも疑問を持ったならちゃんと調べてくれよ。

ttp://e-words.jp/w/MVC.html
メインの処理はModelに実装し、Modelは画面出力などは行なわない。処理結果はViewに渡され、画面表示などが行なわれる。ユーザからの入力はControllerが受け取り、何らかの処理が必要な場合はModelに依頼し、出力が必要な場合はViewに依頼する。

知らない用語を自分用に解釈して使うことに何で疑問を持たないのかね。
0681nobodyさん04/12/12 01:50:11ID:???
さすがWebProg
0682nobodyさん04/12/12 01:57:59ID:???
>>679
Strutsは「MVC」の「C」だけを受け持つフレームワークだ。
それ以外のことはサポートしてくれない。
基本的にはViewもModelも自力で何とかする必要がある。

ここまで書けばわかるだろ?
0683nobodyさん04/12/12 02:48:56ID:???
>>679
> ちなみに、再利用性には気を配っているつもりですが、基本的にアクションクラスに処理べた書きです。

アクションクラスにロジックを書いてはいけない理由はないし、それはアプリケーションの規模や性質によるから一概にいえるものではない。
MVCという分け方があるとしても、CにMを併用するモデルを採用しようが、それは設計者の自由。
別のクラスにしないといけない理由はない。
メンテナンス性などを考えて最適であると判断できるならどうでもいい。

っていうか、処理するテーブルと入力フォームだけが違う場合にActionを共通化するようなことは普通にある。
0684nobodyさん04/12/12 03:13:43ID:???
>>683
アクションクラスにべた書きの時点で、再利用性には気を配っていないと言える。
そもそも、基本的にControllerは受け渡しのみを行ういわば使い捨てであり、それを再利用しようとする方が間違い。
あくまでも処理はModelで行う。

>MVCという分け方があるとしても、CにMを併用するモデルを採用しようが、それは設計者の自由。
これはMVCではない。MVCを無視して
「Strutsを使ってとにかくアプリケーションを作る」ことに専念するつもりなら当然何をやろうが自由だが
MVCを意識する以上は間違い。

>っていうか、処理するテーブルと入力フォームだけが違う場合にActionを共通化するようなことは普通にある。
自分の周りが全て正しいのか?
何も考えず周りに流されてるだけで、ちゃんとStrutsやMVCモデルについて勉強してない証拠だな。
それは単なるローカルルールだ。
要するにおまえは井の中の蛙だ。
0685nobodyさん04/12/12 03:22:46ID:???
つーか他の人はみんなxdoclet普通に使ってて、
自分だけうまい具合に自動生成できない時点で
「俺のプログラムはどこかアブノーマルな部分があるのかな」
とか気にしたんだろ?
それで>>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:???
>>684
継承してちょっとした変更するより、同じクラスでパラメータによってちょっと動きを変えるほうがいいと思うが。
Actionなんて、再利用できるなら再利用した方がいいとおもうのだが。

> 要するにおまえは井の中の蛙だ。

自分がどんな井戸の中にいるのか把握してないみたい。
0688nobodyさん04/12/12 09:59:48ID:???
>>684>>683に噛み付く感覚がわからんな。
683はごくまっとうな考えだと思う。
0689nobodyさん04/12/12 11:01:49ID:???
>>688
頭でっかちで頑固なやつと、基礎は知っていた上で多少は融通が利くやつの違い。
0690nobodyさん04/12/12 11:19:21ID:???
そのせいでxdocletが使えなくなるほうがよっぽど不便だが。
0691nobodyさん04/12/12 11:37:13ID:???
このスレには山田某がいっぱいですね。

っていうか、別にActionにロジックを書いても当然動くけど、
(実際、ビジネスロジックと分離するかしないかの違いだし)
そういった使い方をするなら>>684にあるとおりMVCを持ち出すべきではないよね。
「CにMを併用するモデル」が既にMVCじゃないんだから。

入力パラメータが同じなのでActionFormを使い回したい、みたいな事はあるけどね。

>>687
どこから継承なんて言葉が出てきたんだ?
意味がわからん。
おまえの頭の中ではどんな作りになっているんだ?
0692nobodyさん04/12/12 12:04:37ID:???
しょせんWebプログ(ry
0693nobodyさん04/12/12 12:37:56ID:???
>689
MVCモデルは、意識して厳密にやろうとしないと>683のようにすぐに
曖昧になって混ざってしまいがちだから、頑固とは違う。
少なくとも>684の書いていることはまともだし、
>「Strutsを使ってとにかくアプリケーションを作る」ことに専念するつもりなら当然何をやろうが自由」
とあるとおり、「絶対にActionにロジックを書くな」と書いているわけでもない。
単にMVCモデルには則してないと書いているだけ。
こういうのは頭でっかちで頑固、とは言わないよ。
あと「基礎は知っていた上で多少は融通が利く」というより単なる「妥協」だね、この場合。
0694nobodyさん04/12/12 16:26:36ID:???
というか、Actionの共有とMVCと、どう関係があるのかが一番の謎。
0695nobodyさん04/12/12 16:31:33ID:???
ひとつのActionで複数のページに対応できるなら、そうするべきだし、XDoclet使うのもmerge使えばいいし。
XDocletは基本的にシングルトンなクラスにしか便利に使えないし。
XDocletでうまく対応できないからといって、Struts側の設計としておかしいと考えるのは筋違い。
0696nobodyさん04/12/12 16:54:52ID:???
>>694
もともとActionがControllerとして提供されているのに、
Modelとしても使おうとしてるからだろ。
0697nobodyさん04/12/12 16:59:50ID:???
いやマジで、こんな奴らばっかりなら山田もあそこまで叩かれなかっただろうな。
あの議論はいったい何だったんだという感じ。

せっかく記事を版管理無しでこっそり修正したのに
意味無かったね山田さん
0698nobodyさん04/12/12 17:10:43ID:???
>>696
Actionを共有することが、Modelとしても使おうとしていることになぜつながるのかな?
0699nobodyさん04/12/12 17:12:27ID:???
>>697
まあ、山田の場合はデータソースんとこでもやらかしてた訳だが。
0700nobodyさん04/12/12 17:28:19ID:???
StrutsでいうMVCって
 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:???
Strutsの場合はプレゼンテーションの中のMVCだからね。
0703nobodyさん04/12/15 18:26:48ID:6uCmJkm4
ttp://hiki.ex-machina.jp/JSP/?%B7%C7%BC%A8%C8%C4
0704nobodyさん04/12/15 22:19:35ID:???
さらに言えば、ActionでもActionFormでもソース見れば分かるけど、中身はMVCでできてるでしょ。
0705nobodyさん04/12/16 03:26:11ID:???
どんどん意味が拡大解釈されていく、かわいそうなMVC
0706nobodyさん04/12/16 03:31:34ID:???
ところで、1つのActionクラスを複数のpathで共有することが、どうしてActionにModelを持たせてることになるんだろう?
意味不明だ。

使いまわせるActionなんて、いくらでも使いまわせばいいのに。
070770404/12/16 21:37:33ID:???
ごめん。勘違いだ。
0708nobodyさん04/12/16 21:42:11ID:???
M:データベースサーバ(mysql)
V:Webサーバ(apache)
C:アプリケーションサーバ(tomcat)
0709nobodyさん04/12/16 22:56:22ID:???
だれか、708を病院につれてってあげれ
0710nobodyさん04/12/16 23:13:28ID:???
M ビジネス
V 株価
C システム
0711nobodyさん04/12/17 05:39:15ID:???
株価からシステムを介してビジネスをコントロールするのか。
0712nobodyさん04/12/17 07:43:36ID:???
システムを介してビジネスを行った結果が株価として見える
0713nobodyさん04/12/17 09:36:34ID:???
そのCはコンバーターのCということか。
0714nobodyさん04/12/20 08:48:06ID:scgdz6H2
すいません。12/17に【初心者】Java質問・相談スレッド58【大歓迎】の665で質問させていただいたのですが、
返答が無かったのでこちらのスレで質問させてください。

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:???
>>714
> <% request.setAttribute("bean",new SampleBean()); %>
こんなのはActionでやる仕事。JSPに埋め込むな。
struts-config.xml も無関係だろ。
0716nobodyさん04/12/20 10:34:06ID:???
>>714
その前に、どんな手段を用いればstruts-config.xmlを利用して値を取得できるのか、教えて欲しい。
0717nobodyさん04/12/20 10:55:34ID:scgdz6H2
言い方がおかしくてすいません。
jspに、<logic:iterate id="seihin" name="bean" property="list">と書いたとすると、
struts-config.xmlからname(bean)を検索して、それに関連付けられたアクションを実行するのですよね?
0718nobodyさん04/12/20 10:58:56ID:???
>>717
ちがう。
言い方だけじゃなくてStrutsの理解もおかしい。
0719nobodyさん04/12/20 15:25:18ID:???
言い方と理解の仕方は一致するからな。
0720nobodyさん04/12/20 15:26:01ID:???
logicタグなど使わずにおとなしくJSTLを使いなさい。
0721nobodyさん04/12/20 21:38:04ID:???
>>717
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
form内にたくさんテキスト入力フォームを作成させたいので、iterateで処理しています。
最初にこのJSPにアクセスしたときは正常にページが作成されるのですが、
formのsubmitボタンを押してアクションを発生させ、フォームの内容に不備があったらまたこのページに戻ってくるようにさせると、
iterateのnameで指定されたbeanが見つからないと、怒られてしまいます。
なぜですか?分かる方がいたらご教授願います。
072372204/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:???
performとか書いてある本は捨てろ。
072572204/12/24 20:00:14ID:9UBZxQ+R
>724
すいません。performは使わないほうが良いのですか?
0726nobodyさん04/12/24 20:36:54ID:???
>>725
performは1.0以前のメソッドで、1.2以降はメソッドそのものが消えているので。
072772204/12/24 21:18:35ID:???
>724さん726さん
教えていただきありがとうございます!
execute()にしました。
なんだか楽しくなってきました。
0728nobodyさん04/12/27 19:06:18ID:EKbjNeu3
POIのHSSFを使用してExcelデータからArrayListオブジェクトを生成して、
それを<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:???
関係ないが、JSTLが使えるならiterateよりJSTLの方がいいね。
0730nobodyさん05/01/06 08:29:34ID:xG8ETHUh
perform()だと正しくページ遷移ができるのにexecute()にしたら真っ白なページになってしまうのは何故ですか?
073173005/01/06 09:30:07ID:xG8ETHUh
そもそもActionが起動されていないようなのですが・・・
0732nobodyさん05/01/06 09:41:32ID:???
>>731
execute() のシグニチャが間違っていて、実はオーバーライドになっていない、というオチじゃないよね?
073373005/01/06 10:17:56ID:xG8ETHUh
>732さん、返信ありがとうございます。
私もそれを疑ったのですが、Actionクラスのexecute()メソッドをオーバーライドしています。
execute(ActionMapping mapping, ActionForm form, HttpServletRequest request, HttpServletResponse response)
0734nobodyさん05/01/06 10:52:18ID:???
そもそも1.0使ってるとか
0735nobodyさん05/01/06 10:56:55ID:???
>>733
throws IOException, ServletException じゃなくて、
throws Exception になってる?

>>734
それもあるかもね。
073673005/01/06 11:14:03ID:xG8ETHUh
>734さん、>735さん、ありがとうございます。

throws 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:???
Actionを継承してないとか、コンテキストの再起動してないとか、struts-config書き換えてないとか、どちらにせよケアレスミスかと。
J2SE5で@Overrideつけてコンパイルするのが、一番確実だな。
073873005/01/06 13:12:23ID:xG8ETHUh
>737さんありがとうございます。
Actionクラスは継承してますし、Tomcatの再起動などやっているのですが、どうもうまくいきません。
初歩的な質問で大変申し訳ないのですが、perform()をexecute()にした際に
struts-config.xmlを書き換える必要はありますか?
0739nobodyさん05/01/06 15:02:53ID:???
JSP内に大量にチェックボックスを作る場合、チェックボックスのリストをまとめた外部ファイルを読み込んで配列を作って
<logic:iterate>で表示させることはできたのですが、
それらを今度はsubmitで送信し、受け取る場合にどれがチェックされてどれがチェックされてないかを調べて状態別の処理をしたいのですけど
これは大量にあるチェックボックスのsubmit結果を配列で受け取って処理すれば良いのですか?
一つ一つ書けばそれはそれで良いのですが、あまりに大量すぎて手に負えません・・・
0740nobodyさん05/01/06 15:20:33ID:???
>>739
そう。
場合によってはインデックス付きのgetter/setterを使うべし
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:???
>>739-741
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:???
>742-743
どうもありがとうございます。
参考にしていじってみます。
0745nobodyさん05/01/11 10:27:39ID:hbl7DHve
iterateで使用するArrayListオブジェクトを、一度生成した後はそのsession内ではそれを再利用したいのですが、
対象の配列オブジェクトのスコープを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>

<% %>の中でタグを書いても当然そのまま表示されてしまいます。
どうすればできますか?
0747nobodyさん05/01/11 17:06:35ID:???
>>746
JSPを勉強することと、optionsタグあたり。
074874505/01/11 19:38:41ID:hbl7DHve
745です。遷移元ページAで、下記JSP記述によって配列を回せるのですが、
<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オブジェクトを返します。
何かわかるかたがいたらご教授願います。
0749nobodyさん05/01/11 22:51:46ID:???
>>748
List01はCollectionでも配列でもMapでもないんじゃないの?
075074505/01/12 08:36:26ID:e5ml505B
>748
レスどうもありがとうございます。
List01は同じsession内でiterateを使えているArrayListオブジェクトです。
iterate自体ではscope属性でsetAttributeされたList01を探すことは可能なんですよね?
075174505/01/12 08:56:42ID:???
>750は>>749さん宛てでした。すいません。
0752nobodyさん05/01/12 20:37:20ID:???
>>750
つーか、
>getList01()は、pkg.MyClassオブジェクトを格納するArrayListオブジェクトを返します。
メソッドを持つList01が、なぜArrayListなんだ?
そもそも自分で作ったクラスなんじゃないの?
075374505/01/13 08:54:27ID:???
>752
返信ありがとうございます。以下のようなクラスです。

//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;
 }
}

で、正しいやり方なのかはわかりませんが、次のレスの方法で先程やっと解決しました。
075474505/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
自宅で興味範囲でStrutsを習い始めた者です。
教えてください。
DispatchActionを基本クラスとして継承クラスを作成した場合
URI parameter属性に呼び出されるメソッドの名称を格納して
callする事ができると聞きました。
parameter="method"で、URLパラメータがmethod=deleteと指定した場合
deleteという名のメソッドが実行される。みたいに。
で継承クラスにexecute()をオーバーライドした場合
delete()とexecute()とどちらもcallされるのでしょうか?
どちらが先にcallされるのでしょうか?
0756nobodyさん05/01/23 20:49:39ID:???
>>755
ソースコード見れ。ソースコードは公開されているのだから。
ソースを見れば一目瞭然なのだが、
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:???
JavaWorld3月号のStruts記事は非常に良かったぞ。
脱初心者必見という感じ。

0761nobodyさん05/01/26 02:19:46ID:???
Digester便利だなぁ。
0762nobodyさん05/01/26 09:14:22ID:???
DigesterとXMLBeanてどうちがうの?
0763nobodyさん05/01/26 22:21:30ID:???
BeanUtilsも便利すぎる
0764nobodyさん05/01/26 22:47:52ID:???
まあ、便利すぎて、Strutsからは分離してしまったから、今となってはスレ違いだな。
0765nobodyさん05/01/27 02:48:16ID:???
commonsについて語るスレってないの?
0766nobodyさん05/01/27 08:31:49ID:???
【Java】Apache Jakarta Commons
http://pc5.2ch.net/test/read.cgi/tech/1094954163/
0767nobodyさん05/02/18 01:43:01ID:crwium7J
すいません。助けてください。

CactusStrutsTestCsaeをやってるんですが、
VerifyFowardでmappingできないって怒られます・・・

ちゃんとstruts-configのパスはあるんですが・・・

あと、eclipseのデバッグで
perform先にブレークポイントしても止まらないのです・・・
actionが呼び出されてないのでしょうか?
こういうものでしょうか?

初心者なのでさっぱりわかりません・・・
よろしくです・・・
0768nobodyさん05/02/18 07:50:07ID:???
>>767
質問の要点を整理して出直せ。

> 初心者なのでさっぱりわかりません・・・
あなたは質問の初心者みたいなので、こちらもあなたの状況がさっぱりわかりません・・・
076976705/02/18 10:27:57ID:T6/5M4uY
すいません。出直してきました。

verifyForward("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もサーバー側でやらないと上手くできません。
クライアントから出来るって話を聞いたんですが・・・

ブレークポイントの件はもうちょい調べてみます。

すみません、、お願いしますです。。。
077076705/02/18 22:18:34ID:CZcitnmH
自己レス

すんません。解決しました。
executeをオーバーライドしてませんでした

というか、Actionクラスを継承して
独自のXXXexecuteを使ってるのが原因でした

これからすべてのActionクラスにexecuteを書いてsuperするのかと思うと・・・

お騒がせしましたー
0771nobodyさん05/02/18 23:04:15ID:???
>>770
1回も動かさずに量産したのか?
077277005/02/18 23:51:28ID:KEaw0I+v
いや、普通に動かす分には
execute→XXXexecuteとうまくマッピングできていて
明示的にオーバーライドする必要がなかったんです。
(代わりにXXXexecuteをオーバーライドする必要)

でもTestCaseのactionPerform()では
そこまで参照されず、executeを呼び出していたので
Actionができなかったのが原因です

Testのために、全部に明示的にexecuteを書くのが億劫で・・・
0773nobodyさん05/02/21 15:43:15ID:sN6ntzqc
JSPで表示する内容って、すべてActionFormにStringで定義するべきなんだろうか・・?
0774nobodyさん05/02/21 15:56:45ID:???
ってか、表示する内容とActionFormとは関係ないと思うが。
0775nobodyさん05/02/21 17:25:49ID:beK1sFFt
入力フォームでフィールドが複数ある場合、
validator.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:???
validator.xml という名前のファイルは使ったことがない
077777505/02/21 17:55:04ID:beK1sFFt
validation.xmlでした。
すいません。
0778nobodyさん05/02/21 21:56:41ID:???
requiredif とか使えばいけるんじゃない?
この場合、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>を使って、部署名を取得、表示はできたのですが、
役職名を取得する方法がわかりませんでした。何か良い方法は無いでしょうか?
ちなみに、部署名を変更させた際、役職も変化させる予定です。
■ このスレッドは過去ログ倉庫に格納されています